es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cuando se modifican datos dentro de la función de observación, el DOM no se actualiza.

A continuación se muestra la traducción al español de los documentos de IT mencionados:

A continuación se presentan los datos en un componente:

datos: function () {
      return {
        sltAreaStyle: {
          paddingTop: "3%",
        },
        checkedTypes: ["krw", "btc", "usdt"],
      };
    },

A continuación se encuentra la función de vigilancia de los datos checkedTypes:

watch: {
      checkedTypes: {
        handler: function (newVal, oldVal) {
          if (newVal.length < 1) {
              alert("Choose one or more.");
              var last = oldVal[0];
              this.$data.checkedTypes = [last];
          }
        },
      },
    },

A continuación se encuentra mi plantilla HTML:

<div class="ckbxArea">
        <input type="checkbox" value="krw" v-model="checkedTypes">KRW</input>
        <input type="checkbox" value="btc" v-model="checkedTypes">BTC</input>
        <input type="checkbox" value="usdt" v-model="checkedTypes">USDT</input>
      </div>

Deseo cambiar el último valor a los datos checkedTypes cuando todas las casillas de verificación estén desmarcadas. Si la primera casilla de verificación finalmente no está seleccionada, los checkedTypes serían ‘krw’ como checkedTypes = ['krw']. Los datos checkedTypes son ['krw'], pero todas las etiquetas de las casillas de verificación están desmarcadas. Es decir, el DOM no se ha actualizado. No creo que entienda bien el ciclo de vida de Vue. Creo que este problema está relacionado con el ciclo de vida de v-model y los componentes, pero no sé cuál es el problema. Por favor, explique por qué ocurre este problema y explique cómo resolverlo.

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema ocurre porque cuando actualizas el array checkedTypes en la función watch, Vue observa que el array ha sido modificado, pero no detecta los cambios realizados en los inputs individuales de los checkboxes. Por lo tanto, el DOM no se actualiza para reflejar los cambios y los checkboxes siguen sin estar marcados.

    Para solucionar este problema, puedes forzar la actualización del DOM usando el método $nextTick(). Esto asegurará que el DOM se actualice después de que el watcher haya realizado los cambios en los datos del componente. Mira la función watch actualizada a continuación:

    watch: {
      checkedTypes: {
        handler: function (newVal, oldVal) {
          if (newVal.length < 1) {
            alert("Elige uno o más.");
            var last = oldVal[0];
            this.$data.checkedTypes = [last];
            var that = this;
            this.$nextTick(function() {
              that.$forceUpdate();
            });
          }
        },
      },
    },
    

    Aquí hemos agregado el método $nextTick() para actualizar el DOM y $forceUpdate() para forzar al componente a volver a renderizarse. Esto asegurará que los inputs de los checkboxes se actualicen correctamente.

    ¡Espero que eso ayude! Avísame si tienes alguna otra pregunta.

Comments are closed.