Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

171
Views
Respuesta API en efecto de uso con redux

Quiero llamar productos desde mi servidor con axios en mi proyecto de reacción. Estoy usando redux. Cuando activé las acciones en el componente con useeffect, mis productos no llegaron, pero mis productos llegaron sin usar useeffect.

en mi componente:

 async function get(){ await props.getProducts() console.log(props.products) } useEffect(() => { get() }, []); when I write 'get or get()' in square brackets , products loop coming to console continuous }

mis acciones:

 import axios from "axios" const url="https://my-expressjs-ap.herokuapp.com/products" export const getProducts=()=> (dispatch: (arg0: { type: any; payload: any }) => any)=>{ axios .get( `https://my-expressjs-ap.herokuapp.com/products` ) .then((response) => dispatch({ type: "GET_PRODUCTS_SUCCESS", payload: response.data }) ) .catch((error) => dispatch({ type: "GET_PRODUCTS_ERROR", payload: error })); // fetch(url).then(res=> res.json()) // .then(response=>dispatch(({type:"GET_PRODUCTS_SUCCESS",payload:response})) // ).catch(error=>dispatch({type:"GET_PRODUCTS_ERROR", payload:error})) }

mis reductores:

 const INITIAL_STATE={ products:[], message:'' } export const reducer=(state=INITIAL_STATE,action: any)=>{ switch(action.type){ case'GET_PRODUCTS_SUCCESS': return {...state, products:action.payload}; case 'GET_PRODUCTS_ERROR': return{...state, message:action.payload} default: return state; } }
about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Entonces, la razón por la que su console.log(props.products) no muestra ningún producto cuando llama a get() en este useEffect:

 useEffect(() => { get() }, []);

se debe a que el enlace useEffect se ejecuta solo una vez, es decir, cuando se monta el componente, por lo que después de que se complete su llamada api await props.getProducts() a través de redux, no podrá ver el nuevo valor porque el useEffect no se ejecutará de nuevo .

Con respecto a este comentario, usted en su código: cuando escribo 'get or get ()' entre corchetes, los productos llegan a la consola continuamente . haciendo que su gancho useEffect se ejecute nuevamente, lo que implica una nueva llamada api, que devuelve nuevos resultados, el resultado que creo que son accesorios para el componente, provoca otro procesamiento, luego se crea una nueva instancia de get ... useEffect se ejecuta nuevamente ... Entonces te queda un bucle infinito.

Sin embargo, lo que puede hacer es crear una versión memorizada de get y usarla como dependencia en el gancho useEffect, es decir

 const getProductsAsync = useCallback(async() => { await props.getProducts() console.log(props.products) }, [props.getProducts]); useEffect(() => { getProductsAsync() }, [getProductsAsync]); // Now that we have this in the dep array, this hook only gets called if there a change in reference for getProductsAsync. }

Yo personalmente no haría lo anterior. Yo solo haría lo siguiente:

 useEffect(() => { const getProductsAsync = async() => { await props.getProducts() console.log(props.products) }; getProductsAsync(); }, [props.getProducts]);

Tampoco está claro por qué necesita el enlace useEffect para registrar los productos después de una llamada API exitosa. Si tiene que realizar alguna acción en el resultado de la llamada API, le sugiero que agregue otro useEffect con los products como dependencia en la matriz de dependencia del gancho.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!