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.

Accediendo a los valores de referencia de los componentes.

Aquí está el código de mi aplicación Vue3:

<template>
  {{ names_data }}
</template>

<script>
import getData from "./composables/getData";

export default {
  name: "App",
  setup() {
    var filenames = ["test1.json", "test2.json"];
    const { names data, error, load data } = getData(
      filenames
    );
    load data();
    console.log("names", names data)

console.log("error", error)

return { names_data };
  },
};
</script>

La función componible importada es la siguiente:

import { ref } from "@vue/runtime-core";

const getData = (filenames) => {
  const names_data = ref([])
  const error = ref(null)

  const load data = async () => {
    try {
      var promises = [];
      for (let i = 0; i < filenames.length; i++) {
        var filename = filenames[i]
        promises.push(
          fetch(`data/${filename}`).then(
            (res) => (res.ok && res.json()) || Promise.reject(res)
          )
        );
      }
      const data = await Promise.all(promises);
      names_data.value = data
    } catch (err) {
      error.value = err.message;
      console.log(error.value);
    }
  };
  return { names_data, error, load_data }
};

export default getData

y los archivos de datos contienen lo siguiente:

test1.json

{
  "members": {
    "0": "Alice",
    "1": "Bob",
    "2": "Charlie"
  }
}

test2.json

{
  "members": {
    "0": "David",
    "1": "Elizabeth",
    "2": "Fred"
  }
}

Todo esto funciona: puedo ver el names_data del template que se muestra en la pantalla. Sin embargo, en la consola, el names_data aparece de la siguiente manera:

> RefImpl { shallow: false, dep: undefined, _v_isRef: true, _rawValue: Array(0), _value: Proxy}
dep: Set(1) {ReactiveEffect}
_v_isRef: true
_rawValue: (2) [{…}, {…}]
_shallow: false
_value: Proxy {0: {…}, 1: {…}}
value: (...)
[[Prototype]]: Object

Quiero poder acceder a los valores de names_data para su posterior procesamiento, como ponerlos en una tabla, pero cuando hago console.log(names_data.value) en la App, obtengo un objeto Proxy a un array vacío.

Creo que el objeto names_data pierde reactividad de alguna manera, ya que no se actualiza cuando se llama a load_data(). Pero claramente es reactivo en la plantilla. Así que estoy confundido sobre lo que está sucediendo aquí.

¿Cómo puedo acceder al valor de la referencia para procesarlo más?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para acceder al valor del ref names_data y procesarlo más a fondo, puede simplemente usar la propiedad .value del ref. Así que en lugar de console.log(names_data.value) en el método setup() del componente App, puede usar console.log(names_data.value) para imprimir la matriz de datos en la consola.

    La razón por la cual inicialmente estaba viendo un objeto Proxy en lugar de los datos reales es porque Vue.js utiliza proxies para crear objetos reactivos. Cuando crea un ref usando ref(), obtiene un objeto proxy que intercepta el acceso y la mutación de propiedades para desencadenar la reactividad. En otras palabras, el proxy es un envoltorio alrededor de los datos reales que proporciona reactividad. Cuando accede a names_data en la plantilla, Vue.js automáticamente desenrolla el proxy y le da el valor real, por eso funciona allí. Sin embargo, cuando intenta acceder a la propiedad value del ref fuera de la plantilla, debe desenrollar explícitamente el proxy usando la propiedad value.

Comments are closed.