Учитывая, что двоеточие указывает одностороннюю привязку данных в VueJS2, я хотел бы понять, почему в этом примере ребенок может обновить массив, который был объявлен в родительском элементе и передан потомку через опору (односторонний).
https://jsfiddle.net/ecgxykrt/
<script src="https://unpkg.com/vue"></script>
<div id="app">
<span>Parent value: {{ dataTest }}</span>
<test :datatest="dataTest" />
</div>
var test = {
props: ['datatest'],
mounted: function() {
this.datatest.push(10)
},
render: function() {}
}
new Vue({
el: '#app',
components: {
'test': test
},
data: function() {
return {
dataTest: []
}
}
})
Заранее спасибо!
Если бы вы этого захотели, вы могли бы избежать этого, создав мелкую копию и присвоив ее новому элементу данных в дочернем элементе.
https://jsfiddle.net/6xxba1fz/
var test = {
props: ['test'],
data: function() {
return {
myTest: this.test.slice()
}
},
mounted: function() {
this.myTest.push(10)
},
render: function() {}
}
new Vue({
el: '#app',
components: {
'test': test
},
data: function() {
return {
dataTest: []
}
}
})
Vue запрещает вам назначать опору. Это не мешает вам вызывать методы prop или изменять его элементы или элементы, любые из которых могут изменять содержимое объекта. Ни одна из этих вещей не изменяет ценность самого опоры, которая является ссылкой на базовую структуру.
Связанная с этим проблема заключается в том, что Vue не может обнаруживать изменения в элементах Array или добавлениях/удалениях членов Object.
Больше здесь.
push
также должен отслеживаться должным образом. vuejs.org/v2/guide/list.html#Mutation-Methods
Пожалуйста, избегайте использования какого-либо имени для ключа и значения
: datatest = "dataTest" Неправильный путь
: data-test = "dataTest" Лучший способ (используйте случай Kabab)
HTML
<div id="app">
<span>Parent value: {{ dataTest }}</span>
<test :data-test="dataTest" />
</div>
JS
var test = {
props: {
dataTest:{
type:Number
}
},
mounted: function() {
this.datatest.push(10)
},
render: function() {}
}
new Vue({
el: '#app',
components: {
'test': test
},
data: function() {
return {
dataTest: []
}
}
})
Результат:
Родительское значение: []
datatest
вместо dataTest
. Если вы проверите свою консоль, это приведет к ошибке, и вы, конечно, оставите пустой массив.
const
. То, что вы не можете сделать, это заменить реквизит на совершенно новый объект или массив.