I am trying to get value from object and push into array using Vue. I wanted to separate every value when into different array every time I click my item. Every time I click todo should be push on different array, how I can separate to push into different array
JavaScript
x
18
18
1
new Vue({
2
el: "#app",
3
data: {
4
todos: [
5
{ text: "Learn JavaScript"},
6
{ text: "Learn Vue"},
7
{ text: "Play around in JSFiddle"},
8
{ text: "Build something awesome"}
9
],
10
mytodo:[]
11
},
12
methods: {
13
myClickTodo: function(e){
14
this.mytodo.push(e.target.innerText)
15
console.log(e.target.innerText)
16
}
17
}
18
})
JavaScript
1
25
25
1
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
2
<div id="app">
3
<h2>My list One:</h2>
4
<ul>
5
<li v-for="todo in todos" @click="myClickTodo">
6
{{ todo.text + " from todo one" }}
7
</li>
8
</ul>
9
10
<p>todo 1 </p>
11
<p>{{mytodo}}</p>
12
13
<hr>
14
15
<h2>My list Two:</h2>
16
<ul>
17
<li v-for="todo in todos" @click="myClickTodo">
18
{{ todo.text + " from todo two" }}
19
</li>
20
</ul>
21
22
23
<p>todo 2</p>
24
<p>{{mytodo}}</p>
25
</div>
Advertisement
Answer
Quick fix
One solution is to change mytodos
into an array of 2 arrays (one for each TODO list):
JavaScript
1
6
1
data() {
2
return {
3
mytodo: [[], []]
4
};
5
}
6
Then, update your click
-handler to pass the specific array element of mytodos
along with the todo
item to be added:
JavaScript
1
6
1
<!-- My list One -->
2
<li v-for="todo in todos" @click="myClickTodo(mytodos[0], todo)">
3
4
<!-- My list Two -->
5
<li v-for="todo in todos" @click="myClickTodo(mytodos[1], todo)">
6
And update myClickTodo
to handle these new arguments:
JavaScript
1
6
1
methods: {
2
myClickTodo(mytodo, todo) {
3
mytodo.push(todo.text);
4
}
5
}
6
JavaScript
1
18
18
1
new Vue({
2
el: '#app',
3
data: () => ({
4
todos: [
5
{ text: "Learn JavaScript"},
6
{ text: "Learn Vue"},
7
{ text: "Play around in JSFiddle"},
8
{ text: "Build something awesome"}
9
],
10
mytodo: [[], []]
11
}),
12
methods: {
13
myClickTodo(mytodo, todo) {
14
mytodo.push(todo.text);
15
console.log(todo.text);
16
}
17
}
18
})
JavaScript
1
26
26
1
<script src="https://unpkg.com/vue@2.5.17"></script>
2
3
<div id="app">
4
<h2>My list One:</h2>
5
<ul>
6
<li v-for="todo in todos" @click="myClickTodo(mytodo[0], todo)">
7
{{ todo.text + " from todo one" }}
8
</li>
9
</ul>
10
11
<p>todo 1 </p>
12
<p>{{mytodo[0]}}</p>
13
14
<hr>
15
16
<h2>My list Two:</h2>
17
<ul>
18
<li v-for="todo in todos" @click="myClickTodo(mytodo[1], todo)">
19
{{ todo.text + " from todo two" }}
20
</li>
21
</ul>
22
23
24
<p>todo 2</p>
25
<p>{{mytodo[1]}}</p>
26
</div>
Components
A cleaner solution is to encapsulate the TODO list into a reusable component (e.g., named “my-list”):
JavaScript
1
29
29
1
Vue.component('my-list', {
2
data: () => ({
3
title: '',
4
mytodo: [],
5
}),
6
props: {
7
todos: {
8
type: Array,
9
default: () => []
10
}
11
},
12
template: `<div>
13
<h2>{{title}}</h2>
14
<ul>
15
<li v-for="todo in todos" @click="myClickTodo(mytodo, todo)">
16
{{ todo.text + " from todo one" }}
17
</li>
18
</ul>
19
20
<p>{{mytodo}}</p>
21
</div>`,
22
methods: {
23
myClickTodo(mytodo, todo) {
24
mytodo.push(todo.text);
25
console.log(todo.text);
26
}
27
}
28
});
29
…which would allow you to simplify your app template to this:
JavaScript
1
3
1
<my-list title="My List One:" :todos="todos"></my-list>
2
<my-list title="My List Two:" :todos="todos"></my-list>
3
JavaScript
1
40
40
1
Vue.component('my-list', {
2
data: () => ({
3
mytodo: [],
4
}),
5
props: {
6
title: '',
7
todos: {
8
type: Array,
9
default: () => []
10
}
11
},
12
template: `<div>
13
<h2>{{title}}</h2>
14
<ul>
15
<li v-for="todo in todos" @click="myClickTodo(mytodo, todo)">
16
{{ todo.text + " from todo one" }}
17
</li>
18
</ul>
19
20
<p>{{mytodo}}</p>
21
</div>`,
22
methods: {
23
myClickTodo(mytodo, todo) {
24
mytodo.push(todo.text);
25
console.log(todo.text);
26
}
27
}
28
});
29
30
new Vue({
31
el: '#app',
32
data: () => ({
33
todos: [
34
{ text: "Learn JavaScript"},
35
{ text: "Learn Vue"},
36
{ text: "Play around in JSFiddle"},
37
{ text: "Build something awesome"}
38
],
39
}),
40
})
JavaScript
1
6
1
<script src="https://unpkg.com/vue@2.5.17"></script>
2
3
<div id="app">
4
<my-list title="My List One:" :todos="todos"></my-list>
5
<my-list title="My List Two:" :todos="todos"></my-list>
6
</div>