#vue.js
#vue.js
Вопрос:
Я пытаюсь поместить новый элемент в массив, однако DOM не обновляется. Я прочитал документы Vue, в которых говорится, что используйте Vue.set, чтобы включить реактивность для добавления объектов в массив. https://jsfiddle.net/exL27gvz/40 /
Vue.component('team-invite-list', ({
template: '<div class="mt-2 flex"><a v-for="user in invitedUsers" :key="user.test" href="#">test</a></div>',
props: ['invitedUsers'],
methods: {
addInvitedUser: function(user) {
Vue.set(this.invitedUsers, this.invitedUsers.length, user)
}
},
mounted() {
console.log(this.invitedUsers)
this.invitedUsers.push({test: '2'})
}
}));
var vm = new Vue({
data() {
return {
};
},
mounted() {
}
}).$mount('#app');
<div id="app">
<team-invite-list :invited-users="[{test: 'test'}]"></team-invite-list>
</div>
В DOM отображается только объект value, переданный в качестве реквизита.
Комментарии:
1. Не пытайтесь изменять реквизит
2. Спасибо, Дэн, это решило мою проблему. Если вы опубликуете его в качестве ответа, я могу пометить его как правильный ответ.
3. @Paradigm вы видели мой ответ?
4. Извините, @Dan, я только что пометил как действительный.
Ответ №1:
Не пытайтесь изменять реквизит. Вот некоторые пояснения из документов:
Все реквизиты образуют одностороннюю привязку между дочерним свойством и родительским… Это предотвращает случайное изменение состояния родительских компонентов, что может затруднить понимание потока данных вашего приложения. Кроме того, каждый раз, когда обновляется родительский компонент, все реквизиты в дочернем компоненте будут обновлены с последним значением. Это означает, что вы не должны пытаться изменять prop внутри дочернего компонента.
Если вы обнаружите, что хотите изменить реквизит, есть несколько вариантов. Вот два распространенных:
Vuex
Часто реквизиты не идеальны, когда вы можете использовать глобальное хранилище для управления состоянием. Это может избавить от необходимости обмениваться данными между компонентами. Каждый компонент может получать и устанавливать данные непосредственно из хранилища, и это разъединяет компоненты и может значительно упростить ваш дизайн. Если вы пытаетесь передать массив данных приложения, это хороший признак того, что вам следует использовать Vuex.
Клонировать / испускать
Если два компонента всегда отображаются вместе, или просто имеет смысл поддерживать отношения родитель / потомок, тогда сохраните prop, но передайте изменения обратно родительскому элементу. При необходимости вы можете клонировать реквизит в дочернем элементе, мутировать клон, а затем отправить его обратно.
Ответ №2:
Вы не смогли обновить prop внутри дочернего компонента, вы должны передать событие от дочернего к родительскому, чтобы обновить это свойство внутри родительского компонента :
mounted() {
console.log(this.invitedUsers)
this.$emit("push-invite",{test: '2'})
}
в родительском компоненте добавить @push-invite="pushInvite"
:
var vm = new Vue({
data() {
return {
invitedUsers:[{test: 'test'}]
};
},
methods:{
pushInvite(invite){
this.invitedUsers.push(invite)
}
},
mounted() {
}
}).$mount('#app');
<div id="app">
<team-invite-list :invited-users="invitedUsers" @push-invite="pushInvite"></team-invite-list>
</div>