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?
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 deconsole.log(names_data.value)
en el métodosetup()
del componenteApp
, puede usarconsole.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 anames_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 propiedadvalue
del ref fuera de la plantilla, debe desenrollar explícitamente el proxy usando la propiedadvalue
.