Я понимаю концепцию: ребенок работает с собственной копией данных реквизита, и когда она изменяется, она может $emit
измениться, чтобы родитель мог обновить себя.
Однако я Работа с рекурсивной древовидной структурой, например, файловой системой, является хорошей аналогией.
[
{ type: 'dir', name: 'music', children: [
{ type: 'dir', name: 'genres', children: [
{ type: 'dir', name: 'triphop', children: [
{ type: 'file', name: 'Portishead' },
...
]},
]}
]}
]}
У меня есть рекурсивный компонент под названием Thing
, который принимает childtree
prop и выглядит как примерно так:
<template>
<input v-model="tree.name" />
<thing v-for="childtree in tree.children" :tree="childtree" ></thing>
</template>
Изменение имени, очевидно, напрямую изменит реквизит, чего следует избегать, и Vue выдает предупреждение об этом.
Однако Единственный способ избежать этого - сделать для каждого компонента глубокую копию childtree
; затем $emit
копия нашей копии и @input
(или такая) копия ее обратно в оригинал; вплоть до дерева, которое затем сменит реквизит на всем протяжении дерева, вызывая еще одну глубокую копию всего!
Такое чувство, что оно будет действительно неэффективным на дереве любого размера.
Есть ли лучший способ? Я знаю, что вы можете обмануть Vue, чтобы не выдавать ошибку / предупреждение пример jsfiddle .