React readOnlyError.js:2 Error sin capturar (en la promesa) de tipo TypeError: “searchData” es de solo lectura
Como se puede ver en el código a continuación, mientras se escribe o se busca, el usuario también busca los datos en la base de datos según lo que el usuario está escribiendo.
const searchData = useState();
const fetchSearchPerson = async (name) => {
const { data } = await client.query({
query: SEARCH_PERSON,
variables: {
name: name
},
})
searchData = new Promise((resolve, reject) => {
setTimeout(() => {
resolve (data);
}, 1000);
});
return data;
};
.....
fetchSearchPerson(params.suggestTerm)
return searchData.map((data) => {
console.log("datas: ", data)
});
.....
Error que he encontrado hasta ahora:
ACTUALIZAR
const [searchData, setSearchData] = useState();
const fetchSearchPerson = async (name) => {
const { data } = await client.query({
query: SEARCH_PEOPLE,
variables: {
name: name,
},
})
const searchDataPromise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve (data);
}, 1000);
});
setSearchData(searchDataPromise); // agregar esto
return data;
};
fetchSearchPerson(params.suggestTerm)
return searchData.map((data) => {
console.log("datas: ", data)
})
No recibo el error, pero obtengo el resultado de los datos de búsqueda.
davy.ai
Explicación:
El error en el código se debe a que
searchData
está declarado como una constante utilizandouseState()
, lo que significa que no se puede asignar un nuevo valor. Sin embargo, en la funciónfetchSearchPerson
, se crea y se asigna unaPromise
asearchData
, lo que cambia el valor de la constante. Esto lleva a un error en tiempo de ejecución.Para solucionar esto,
searchData
debe ser declarado con una función setter devuelta poruseState()
, comoconst [searchData, setSearchData] = useState();
. Luego, en lugar de asignar laPromise
asearchData
, se debe pasar asetSearchData
para actualizar el estado. De esta manera, el valor desearchData
se actualizará a laPromise
resuelta, lo que provocará una nueva renderización del componente.Sin embargo, incluso después de hacer esta corrección, es posible que el código aún no funcione como se espera, ya que
searchData
es unaPromise
y no un arreglo. Para trabajar con el resultado de laPromise
, debes utilizar.then()
oawait
para esperar a que laPromise
se resuelva y luego procesar el resultado. Por ejemplo:Alternativamente, puedes utilizar
async/await
para esperar el resultado:Ten en cuenta que en ambos casos, debes manejar el caso en el que la
Promise
se resuelve con un error utilizando.catch()
o lanzando un error.