En los documentos de VueJs 2.0 no puedo encontrar ningún gancho que escuche los props
cambios.
¿VueJs tiene ganchos similares onPropsUpdated()
o similares?
Actualizar
Como sugirió @wostex, intenté con watch
mi propiedad pero nada cambió. Entonces me di cuenta de que tengo un caso especial:
<template>
<child :my-prop="myProp"></child>
</template>
<script>
export default {
props: ['myProp']
}
</script>
Estoy pasando myProp
que el componente principal recibe al child
componente. Entonces el watch: {myProp: ...}
no funciona.
javascript
vue.js
vuejs2
vue-component
Amio.io
fuente
fuente
Respuestas:
Puede
watch
usar accesorios para ejecutar algún código con los cambios de accesorios:fuente
watch
. Debido a su ejemplo, me di cuenta de que mi caso es un poco diferente. He actualizado mi pregunta.¿Has probado esto?
https://vuejs.org/v2/api/#watch
fuente
Él,
En mi caso, necesitaba una solución en la que cada vez que cambiara cualquier accesorio, necesitaba analizar mis datos nuevamente. Estaba cansado de hacer un vigilante separado para todos mis accesorios, así que usé esto:
El punto clave que se debe sacar de este ejemplo es usarlo
deep: true
para que no solo vea $ props sino también valores anidados como, por ejemplo,props.myProp
Puede obtener más información sobre estas opciones de reloj ampliado aquí: https://vuejs.org/v2/api/#vm-watch
fuente
Debe comprender la jerarquía de componentes que tiene y cómo está pasando los accesorios, definitivamente su caso es especial y los desarrolladores no suelen encontrarlo.
Si myProp se cambia en el componente principal, también se reflejará en el componente secundario.
Y si myProp se cambia en el componente hijo, también se reflejará en el componente nieto.
Entonces, si myProp se cambia en el componente principal , se reflejará en el componente nieto. (Hasta aquí todo bien).
Por lo tanto, en la jerarquía, no tiene que hacer nada, los accesorios serán inherentemente reactivos.
Ahora hablando de subir en jerarquía
Si myProp se cambia en el componente grandChild , no se reflejará en el componente secundario. Debe usar el modificador .sync en el elemento secundario y emitir un evento desde el componente grandChild.
Si myProp se cambia en el componente secundario , no se reflejará en el componente principal. Debe usar el modificador .sync en el elemento primario y emitir un evento desde el componente secundario.
Si myProp se cambia en el componente grandChild , no se reflejará en el componente principal (obviamente). Tiene que usar el modificador .sync hijo y emitir un evento desde el componente nieto, luego mirar el accesorio en el componente hijo y emitir un evento sobre el cambio que está escuchando el componente padre utilizando el modificador .sync.
Veamos un código para evitar confusiones.
Parent.vue
Child.vue
Grandchild.vue
Pero después de esto, no ayudarás a notar las advertencias de vue diciendo
Nuevamente, como mencioné anteriormente, la mayoría de los desarrolladores no encuentran este problema, porque es un anti patrón. Es por eso que recibes esta advertencia.
Pero para resolver su problema (de acuerdo con su diseño). Creo que tienes que hacer el trabajo anterior (piratear para ser honesto). Todavía te recomiendo que vuelvas a pensar en tu diseño y que sea menos propenso a errores.
Espero que ayude.
fuente
No estoy seguro de si lo ha resuelto (y si lo entiendo correctamente), pero esta es mi idea:
Si el padre recibe myProp, y desea que se lo pase al niño y lo vea en niño, entonces el padre debe tener una copia de myProp (no de referencia).
Prueba esto:
y en html:
de hecho, debes tener mucho cuidado al trabajar en colecciones complejas en tales situaciones (pasar pocas veces)
fuente
para el enlace bidireccional debe usar el modificador .sync
más detalles...
y debe usar la propiedad watch en el componente secundario para escuchar y actualizar cualquier cambio
fuente
Trabajo con una propiedad calculada como:
Los recursos son en este caso una propiedad:
fuente
Para mí, esta es una solución educada para obtener un cambio específico de accesorios y crear lógica con ellos.
Me gustaría utilizar
props
y variables decomputed
propiedades para crear la lógica después de recibir los cambiosEntonces, podríamos usar _objectDetail en html render
o de alguna manera:
fuente
Puede usar el modo reloj para detectar cambios:
Haz todo a nivel atómico. Por lo tanto, primero verifique si se llama o no al método de reloj consolando algo dentro. Una vez que se haya establecido que se está llamando ese reloj, destrúyalo con su lógica comercial.
fuente
Uso
props
ycomputed
propiedades de variables si necesito crear lógica después de recibir los cambiosfuente
Si myProp es un objeto, no se puede cambiar de la forma habitual. por lo tanto, el reloj nunca se activará. la razón por la cual myProp no se cambia es que solo configura algunas teclas de myProp en la mayoría de los casos. el myProp en sí sigue siendo el indicado. intente ver accesorios de myProp, como "myProp.a", debería funcionar.
fuente
La función de reloj debe colocarse en el componente secundario. No padre
fuente
@JoeSchr tiene una buena respuesta. Aquí hay otra forma de hacer esto si no quieres 'profundo: verdadero'.
fuente