Ho lavorato su una Vue 2 progetto per un po', e dopo l'aggiornamento il nostro linting requisiti ho scoperto che abbiamo avuto prop
mutazione errori in molti dei nostri componenti secondari. Nel nostro progetto, si passa un oggetto singleton come un puntello per molti componenti e sono stati originariamente aggiornare l'oggetto direttamente dai componenti secondari. Vue sembra suggerire utilizzando il v-bind.sync
funzionalità per l'aggiornamento props
da bambino i componenti (o equivalente v-bind
e v-on
). Questo, tuttavia, non risolve il problema di prop
modifica componenti nidificati in un array.
Prendere questo (pseudo)codice di esempio che utilizza prop
mutazione:
Nota: Si Supponga const sharedObject: { arrayElements: Array<{ isSelected: boolean }> } = ...
Pagina.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>
Qual è il modo corretto di aggiornamento di un immobile come input2.isSelected
da componenti nidificati in Vue 2? Tutti gli approcci ho pensato sono viziati.
Imperfetto Approcci
Io credo che ci vorrebbe bolle che input2.isSelected
è stato modificato in Component2
per Page.vue
tuttavia, questo sembra portare a codice disordinato o una sensazione di disagio che siamo solo a reprimere linting errori in una rotonda modo.
Per dimostrare il "codice disordinato", la prima nota che Page.vue
non si conosce l'indice di elem
in sharedObject.arrayElements
. Pertanto, si avrebbe bisogno di emettere un oggetto Page.vue
da Component1
che contiene lo stato di input2.isSelected
e dell'indice di elem
in sharedObject.arrayElements
. Questo si ottiene disordinato rapidamente. Che cosa circa l'esempio in cui abbiamo:
Component1.vue
<template>
...
<template v-for="elem in sharedObject.arrayElements">
<template v-for="elem2 in elem.arrayElements">
<Component2 :input2="elem2" />
</template>
</template>
...
</template>
in questo caso, quindi, abbiamo bisogno di passare i 2 indici! Non sembra una soluzione sostenibile per me.
L'alternativa che ho pensato è una funzione di callback (passato come un sostegno attraverso la gerarchia dei componenti) che prende in input l'elemento che si desidera aggiornare e un oggetto che contiene le proprietà che si desidera aggiornare (utilizzando Object.assign
).
Questo mi rende molto a disagio in quanto non so il vero motivo per cui non siamo in grado di aggiornare un passaggio per riferimento prop da un bambino di componente. A me sembra solo una rotonda modo di aggiornare in passato da Component2
senza linter se ne accorga. Se c'è qualcosa di magico, di modifica che succede puntelli quando sono passato al bambino di componenti, quindi sicuramente passando l'oggetto che ho ricevuto in Component2
la funzione di callback e modificando nel componente principale sarebbe fondamentalmente essere solo l'aggiornamento del pilone nel bambino componente, ma più complicato.
Qual è il corretto modo di affrontare questo problema in Vue 2?