Skip to content

Commit 267d129

Browse files
Merge pull request SortableJS#643 from waynevanson/master
Nested example with v-model and vuex
2 parents 888cc10 + 08ec677 commit 267d129

14 files changed

+3224
-2860
lines changed

dist/vuedraggable.common.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/vuedraggable.common.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/vuedraggable.umd.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/vuedraggable.umd.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/vuedraggable.umd.min.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/app.js

Lines changed: 315 additions & 125 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
File renamed without changes.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<template>
2+
<div class="justify-content-between row">
3+
<nested-test class="col-8" v-model="elements" />
4+
<raw-displayer class="col-4" :title="'Vuex Store'" :value="elements" />
5+
</div>
6+
</template>
7+
8+
<script>
9+
import NestedTest from "./nested/nested-test.vue";
10+
import rawDisplayer from "./infra/raw-displayer.vue";
11+
12+
export default {
13+
name: "nested-with-vmodel",
14+
display: "Nested (v-model & vuex)",
15+
order: 16,
16+
components: {
17+
NestedTest,
18+
rawDisplayer
19+
},
20+
computed: {
21+
elements: {
22+
get() {
23+
return this.$store.state.nested.elements;
24+
},
25+
set(value) {
26+
this.$store.dispatch("nested/updateElements", value);
27+
}
28+
}
29+
},
30+
methods: {}
31+
};
32+
</script>
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import Vuex from "vuex";
2+
import Vue from "vue";
3+
4+
Vue.use(Vuex);
5+
6+
export const nested = {
7+
namespaced: true,
8+
state: {
9+
elements: [
10+
{
11+
id: 1,
12+
name: "Shrek",
13+
elements: []
14+
},
15+
{
16+
id: 2,
17+
name: "Fiona",
18+
elements: [
19+
{
20+
id: 4,
21+
name: "Lord Farquad",
22+
elements: []
23+
},
24+
{
25+
id: 5,
26+
name: "Prince Charming",
27+
elements: []
28+
}
29+
]
30+
},
31+
{
32+
id: 3,
33+
name: "Donkey",
34+
elements: []
35+
}
36+
]
37+
},
38+
mutations: {
39+
updateElements: (state, payload) => {
40+
state.elements = payload;
41+
}
42+
},
43+
actions: {
44+
updateElements: ({ commit }, payload) => {
45+
commit("updateElements", payload);
46+
}
47+
}
48+
};
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<style scoped>
2+
.item-container {
3+
max-width: 20rem;
4+
margin: 0;
5+
}
6+
7+
.item {
8+
padding: 1rem;
9+
border: solid black 1px;
10+
background-color: #fefefe;
11+
}
12+
.item-sub {
13+
margin: 0 0 0 1rem;
14+
}
15+
</style>
16+
17+
<template>
18+
<draggable
19+
v-bind="dragOptions"
20+
tag="div"
21+
class="item-container"
22+
:list="list"
23+
:value="value"
24+
@input="emitter"
25+
>
26+
<div class="item-group" :key="el.id" v-for="el in realValue">
27+
<div class="item">{{ el.name }}</div>
28+
<nested-test class="item-sub" :list="el.elements" />
29+
</div>
30+
</draggable>
31+
</template>
32+
33+
<script>
34+
import draggable from "@/vuedraggable";
35+
export default {
36+
name: "nested-test",
37+
methods: {
38+
emitter(value) {
39+
this.$emit("input", value);
40+
}
41+
},
42+
components: {
43+
draggable
44+
},
45+
computed: {
46+
dragOptions() {
47+
return {
48+
animation: 0,
49+
group: "description",
50+
disabled: false,
51+
ghostClass: "ghost"
52+
};
53+
},
54+
// this.value when input = v-model
55+
// this.list when input != v-model
56+
realValue() {
57+
return this.value ? this.value : this.list;
58+
}
59+
},
60+
props: {
61+
value: {
62+
required: false,
63+
type: Array,
64+
default: null
65+
},
66+
list: {
67+
required: false,
68+
type: Array,
69+
default: null
70+
}
71+
}
72+
};
73+
</script>

example/main.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import VueRouter from "vue-router";
44
import routes from "./route";
55
import rawDisplayer from "./components/infra/raw-displayer.vue";
66
import ElementUI from "element-ui";
7-
7+
import store from "./store";
88
import "bootstrap/dist/css/bootstrap.min.css";
99
import "font-awesome/css/font-awesome.css";
1010

@@ -20,6 +20,7 @@ Vue.component("rawDisplayer", rawDisplayer);
2020
Vue.use(ElementUI);
2121

2222
new Vue({
23+
store,
2324
router,
2425
render: h => h(App)
2526
}).$mount("#app");

example/store.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { nested } from "./components/nested/nested-store";
2+
import Vuex from "vuex";
3+
import Vue from "vue";
4+
5+
Vue.use(Vuex);
6+
7+
export default new Vuex.Store({
8+
namespaced: true,
9+
modules: {
10+
nested
11+
}
12+
});

0 commit comments

Comments
 (0)