Pracoval jsem na Vue 2 projekt na chvíli, a na modernizaci naší linting požadavky zjistil jsem, že jsme měli prop
mutace chyby v mnoha našich podřízené součásti. V našem projektu jsme se projít singleton objekt jako rekvizita do mnoha komponent a byly původně aktualizaci objektu přímo z podřízené součásti. Vue zdá se, naznačují, pomocí v-bind.sync
funkce pro aktualizaci props
z dětské složky (nebo pomocí ekvivalentní v-bind
a v-on
). To však neřeší problém prop
modifikace z vnořené komponenty v matici.
Take tento (pseudo)kód, například, že používá prop
mutace:
Poznámka: Předpokládejme, const sharedObject: { arrayElements: Array<{ isSelected: boolean }> } = ...
Stránka.vue
<template>
...
<Component1 :input1="sharedObject" />
...
</template>
Component1.vue
<template>
...
<template v-for="elem in sharedObject.arrayElements">
<Component2 :input2="elem" />
</template>
...
</template>
Component2.vue
<template>
...
<q-btn @click="input2.isSelected = !input2.isSelected"></q-btn>
...
</template>
Jaký je správný způsob, jak aktualizovat vlastnost, jako input2.isSelected
z vnořené komponenty v Vue 2? Všechny přístupy jsem si myslel, že jsou chybné.
Chybné Přístupy
Jsem přesvědčen , že bychom chtěli, aby bublina, že input2.isSelected
byl upraven v Component2
k Page.vue
, nicméně, to se zdá buď vést k chaotický kód nebo nepříjemný pocit, že jsme jen potlačení linting chyby v oklikou.
K prokázání "chaotický kód" přístup, nejprve na vědomí, že Page.vue
neví index na elem
v sharedObject.arrayElements
. Proto, budeme muset vydávat objektu Page.vue
z Component1
který obsahuje stav input2.isSelected
stejně indexu elem
v sharedObject.arrayElements
. To dostane chaotický rychle. Co o příklad, kdy máme:
Component1.vue
<template>
...
<template v-for="elem in sharedObject.arrayElements">
<template v-for="elem2 in elem.arrayElements">
<Component2 :input2="elem2" />
</template>
</template>
...
</template>
v tomto případě, pak bychom se mohli třeba projít až 2 indexy. To nevypadá jako udržitelné řešení pro mě.
Alternativní, že jsem si myslel, ze je funkce zpětného volání (předán jako rekvizita přes hierarchii komponentů), který bere jako vstupní element, který chceme aktualizovat a objekt, který obsahuje vlastnosti chceme aktualizovat (pomocí Object.assign
).
To je pro mě velmi nepříjemný, protože já nevím pravý důvod, proč jsme nelze aktualizovat pass-by-reference prop z dětské složky. Pro mě, zdá se, je to jen oklikou aktualizace prošel-z Component2
bez linter povšimnutí. Pokud tam je nějaké kouzlo modifikace, která se stane rekvizity, když jsou předány dílčí součásti, pak jistě přecházející v objekt, který jsem obdržel v Component2
na zpětné volání funkce a úpravy v nadřazené součásti by v podstatě jen aktualizace vrtule v dětské složky, ale složitější.
Jaký je správný způsob, jak se k tomuto problému v Vue 2?