Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

216
Vistas
¿Qué está causando que se calcule la propiedad calculada de Vue?

Mi comprensión de las propiedades calculadas es que si la propiedad calculada no se usa en la plantilla, no se supone que se calcule. Sin embargo, cuando hay un observador para una propiedad calculada, se evalúa esta propiedad calculada.

Entiendo que no es la arquitectura de aplicación deseada, pero mi pregunta es si el hecho de que funcione de esta manera es un comportamiento deseado de Vue o algún efecto secundario de cómo se implementan las cosas en este momento y puede cambiar en versiones futuras.

O para poner la pregunta en otras palabras: ¿Debería evaluarse la propiedad calculada si no se usa en la plantilla y no tiene otro captador explícito en la base de código, excepto un observador?

Ejemplo:

 <template> <div> <button @click="counter++">+1</button> {{ counter }} </div> </template> <script> export default { name: "Main", data() { return { counter: 0, }; }, computed: { notUsedInTemplate() { console.log("notUsedInTemplate computed called"); return this.counter + 1; }, }, watch: { notUsedInTemplate() { console.log("notUsedInTemplate watch called"); }, }, }; </script>

Enlace a la caja de arena: https://codesandbox.io/s/computed-sandbox-ru3n3?file=/src/components/Main.vue:0-818

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

si la propiedad calculada no se usa en la plantilla, no se supone que se calcule

...no es correcto. La afirmación correcta es:

si la propiedad calculada no se usa (en ninguna parte), no se supone que se evalúe

El uso de watch evalúa la propiedad. De hecho, el watch es muy similar a la re-renderización de plantillas (en vue 3, la re-renderización es de hecho un efecto de reloj poco especial)

Porque para ver (cualquier cosa):

  1. Vue 1st necesita ejecutar el código, en este caso notUsedInTemplate getter, para averiguar a qué datos reactivos está accediendo (por lo que this.counter se rastrea como dependencia)
  2. Cuando cambia this.counter , el observador ejecuta el captador notUsedInTemplate nuevamente para que pueda comparar el nuevo valor con el anterior
  3. Si el valor cambió, ejecuta la devolución de llamada (que está iniciando sesión en su ejemplo)

Así que para responder a las preguntas:

  1. sí, este es el comportamiento deseado ya que su observador no está rastreando los cambios de la propiedad computada notUsedInTemplate sino los datos subyacentes que usa para calcular su valor
  2. Watcher está accediendo a la propiedad calculada, no hay necesidad de usarla en ningún otro lugar

OK, más detalles POR QUÉ esto funciona de esta manera

La reactividad de Vue siempre tiene 2 fases:

  1. fase 1: ejecute el código (ya sea template o watch expression/fn ) y recopile todas las dependencias (por ejemplo, cualquier dato reactivo que el código haya "tocado")
  2. fase 2 - seguimiento de las dependencias. Si alguna dependencia cambia, vuelva a ejecutar la devolución de llamada (o la función de procesamiento)

Consulte este capítulo en los documentos - Cómo se rastrean los cambios : el ejemplo menciona explícitamente solo la representación de la plantilla (que usa el observador creado por el propio Vue), pero todo esto se aplica a todos los observadores , incluidos los creados por el usuario.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Tienes razón sobre la propiedad calculada. Cualquier cosa en la propiedad calculada se adjuntará a la instancia de vue y será accesible en la plantilla.

Por lo tanto, si no se usa en la plantilla, no debe calcularse.

las propiedades computed son declarativas en donde el watch es imperativo.

 computed: { // a computed getter reversedMessage: function () { // `this` points to the vm instance return this.message.split('').reverse().join('') } }

Y la mejor parte es que hemos creado esta relación de dependencia de forma declarativa: la función captadora calculada no tiene efectos secundarios, lo que hace que sea más fácil de probar y comprender.

watch son funciones que buscan cambios y actualizan el valor.

 watch: { firstName: function (val) { this.fullName = val + ' ' + this.lastName }, lastName: function (val) { this.fullName = this.firstName + ' ' + val } }

Al usar la propiedad de obtención computada, solo le facilita a vue el seguimiento de los cambios y la actualización de forma declarativa; sin embargo, puede hacer lo mismo con el watch , pero es imperativo y vue necesita buscar cambios y cada cambio requiere esa llamada de función para ser activador y luego ejecutar esa función.

más información

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda