Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

200
Visualizações
llamar a useQuery condicionalmente devuelve una salida incorrecta solo por primera vez

Por favor, ayúdame a entender por qué no recibo artículos en la primera solicitud. Tengo este componente ExportData que llama a Context solo cuando se le solicita, dialogConfirmation está vinculado a un botón, fragmento:

Exportar datos:

 import useItem from '../../context/ItemsContext' const ExportData = () => { const { items, getAll } = useItem() const dialogConfirmation = confirm => { if (confirm) { getAll() } } }

ElementosContexto:

 import React, { useState, useReducer, createContext, useContext, useEffect, } from 'react' import { useQuery } from '@apollo/client' import { CURRENT_MONTH, ALL_ITEMS } from '../graphql/queries' import itemReducer from '../reducers/itemReducer' export const ItemProvider = ({ children }) => { let items = [] const [all, setAll] = useState(false) const selectedMonth = dayjs(new Date()).format('YYYY-MM') const [state, dispatch] = useReducer(itemReducer, []) const result = useQuery(all ? ALL_ITEMS : CURRENT_MONTH, { variables: all ? null : { selectedMonth }, }) if (result.data && result.data.getCurrentMonth) { items = [...result.data.getCurrentMonth] } if (result.data && result.data.getItems) { items = [...result.data.getItems] } useEffect(() => { if (result.data && result.data.getCurrentMonth) { dispatch({ type: 'ALL', items: result.data.getCurrentMonth, }) } if (result.data && result.data.getItems) { dispatch({ type: 'ALL', items: result.data.getItems, }) } }, [result.data]) const getAll = () => { setAll(true) } const value = { items: state.items, getAll, } return <ItemContext.Provider value={value}>{children}</ItemContext.Provider> }

Reductor:

 const itemReducer = (state, action) => { switch (action.type) { case 'ALL': return { ...state, items: action.items, } default: return state } }

La consulta CURRENT_MONTH devuelve solo elementos del mes actual; ese debería ser el predeterminado.

La consulta ALL_ITEMS devuelve todos los elementos de la base de datos.

Lo que sucede actualmente, cuando uso la función getAll en ExportData , en el primer intento, devuelve solo los elementos del mes actual; sin embargo, en el segundo intento, devuelve la salida correcta (todos los datos).

Al depurar itemReducer, todos los elementos están en action.items sin embargo, la salida dentro del componente solo obtiene los datos antiguos... Sin embargo, en el segundo intento, funciona bien.

¿Qué estoy haciendo mal aquí?

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Que está sucediendo aquí:

  1. El componente se representa inicialmente (aún no hay datos)
  2. useEffect s son disparados: (dentro del componente) no hace nada, (dentro useQuery ) dispara la solicitud a gql api
  3. después de un tiempo cuando la solicitud se cumple, el estado dentro useQuery se establece con datos
  4. Debido a que ese componente se vuelve a procesar (los datos están presentes pero aún no se usan en state.items porque el envío aún no se activó)
  5. useEffect s se disparan y esta vez se llama a dispatch.
  6. El componente se vuelve a representar porque el envío cambió el estado de useReducer y este estado de tiempo tiene elementos dentro

En este proceso reaccionan los renders 3 veces. Si coloca console.log(state.items) dentro del componente, se verá así:

 [] // no data yet [] // data is present but not yet used by `state` [<your data>] // data is present and used by state

Puede resolver eso eliminando useEffect y useReducer:

  1. El componente se representa inicialmente (aún no hay datos)
  2. useEffect s son disparados: (dentro del componente) no hace nada, (dentro useQuery ) dispara la solicitud a gql api
  3. después de un tiempo cuando la solicitud se cumple, el estado dentro useQuery se establece con datos
  4. Debido a que ese componente se vuelve a renderizar (los datos se pasan directamente al valor)

En este proceso reaccionan los renders 2 veces. Si coloca console.log(items) dentro del componente, se verá así:

 [] // no data yet [<your data>] // data is present and used
 import React, { useState, createContext, useContext, } from 'react' import { useQuery } from '@apollo/client' import { CURRENT_MONTH, ALL_ITEMS } from '../graphql/queries' export const ItemProvider = ({ children }) => { const [all, setAll] = useState(false) const selectedMonth = dayjs(new Date()).format('YYYY-MM') const result = useQuery(all ? ALL_ITEMS : CURRENT_MONTH, { variables: all ? null : { selectedMonth }, }) const getAll = () => { setAll(true) } const items = result?.data.getCurrentMonth || result?.data.getItems || [] const value = { items, getAll, } return <ItemContext.Provider value={value}>{children}</ItemContext.Provider> }
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda