Vue Sortable
Easily add drag-and-drop sorting to your Vue.js applications without jQuery, using the v-sortable directive, a thin wrapper for the minimalist RubaXa/SortableJS library.
View Live Demo & Docs
Installation
NPM
npm install vue-sortable
Setup
import Vue from 'vue' import Sortable from 'vue-sortable' Vue.use(Sortable)
Browser Globals
If you aren't using a build system, you probably just want to include a <script>
tag and keep things simple. unpkg.com
serves as a CDN for NPM projects. You can grab vue-sortable
from unpkg in a couple ways:
<script src="https://unpkg.com/[email protected]"></script> # use a specific version
<script src="https://unpkg.com/vue-sortable@latest"></script> # use the latest version
Note that you will need to include RubaXa/Sortable
& Vue
before including vue-sortable
.
<!DOCTYPE html> <html> <head> <!-- VueJS --> <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.16/vue.js"></script> <!-- SortableJS --> <script src="https://unpkg.com/[email protected]"></script> <!-- VueSortable --> <script src="https://unpkg.com/[email protected]"></script> </head> <body> <ul v-sortable> <li>Foo</li> <li>Bar</li> <li>Baz</li> </ul> <script> new Vue({ el: 'body' }); </script> </body> </html>
Common Use Cases
Update Source Data Order
The below implementation will update the order of the source data after an item is sorted using the sortable
onUpdate
callback.
new Vue({ el: 'body', data: { list: ['Foo', 'Bar', 'Baz'] }, methods: { onUpdate: function (event) { this.list.splice(event.newIndex, 0, this.list.splice(event.oldIndex, 1)[0]) } } });
<ul v-sortable="{ onUpdate: onUpdate }"> <li v-for="item in list">{{ item }}</li> </ul>
Contributing
I'd like to keep this directive as simple as possible, but if there's something you'd like to see added feel free to submit a PR.
The plugin is built using the vue-cli webpack-simple template.
# install dependencies npm install # serve with hot reload at localhost:8080 npm run dev # build for demo site npm run build
For detailed explanation on how things work, consult the docs for vue-loader.