【问题标题】:useReducer not accepting array or stateuseReducer 不接受数组或状态
【发布时间】:2021-11-13 06:25:00
【问题描述】:

无法在包含对象数组的 useReducer 钩子的初始化中传递数据(这是数组), 在产品初始化中获取子组件空数组的结果。

我希望子组件中的数据与我传递的相同。

代码:

import React, { createContext, useContext, useEffect, useReducer, useState } from 'react'
import faker from "faker";
import { cartReducer } from './Reducer';

export const Cart = createContext();
const Context = ({ children }) => {

    const [data, setProduct] = useState();

    useEffect(() => {
        var axios = require('axios');

        var config = {
            method: 'get',
            url: '<apicalling here>',
            headers: {
                'Authorization': 'Token xyz'
            }
        };

        axios(config)
            .then(function (response) {
                setProduct(response.data.cart[0].items);

            })
            .catch(function (error) {
                console.log(error);
            });

    }, []);


    console.warn("hello", data); //yes working, data rendering here

    const [state, dispatch] = useReducer(cartReducer, {
        products: data,
        cart: [],
    });

 
    return <Cart.Provider value={{ state, dispatch }}>{children} </Cart.Provider>;
};

export default Context;

【问题讨论】:

    标签: javascript reactjs react-redux


    【解决方案1】:

    发生这种情况是因为 在 API 调用解析之前设置了减速器的状态

    并且您在 console.log 中获得了这些更新的数据,因为您将其更新为 data 状态,但减速器可以访问相同的先前数据(原因:减速器集的状态在 API 调用解析之前

    因此,您的问题的解决方案是创建一个操作,在您从 API 获得响应后调度您更新的 Products 值

    import React, { createContext, useContext, useEffect, useReducer, useState } from 'react' import faker from "faker"; import { cartReducer } from './Reducer';
    
    const cartReducer = (state, { type, payload = {} }) => {
    switch (type) {
        case 'setProducts': {
         return {...state, products: payload};
        }
        /*
           Other actions
        */
        default: {
          // your default action
        }
      }
    }
    
    export const Cart = createContext(); 
    
    const Context = ({ children }) => {
    
    const [data, setProduct] = useState();
    
    useEffect(() => {
        var axios = require('axios');
    
        var config = {
            method: 'get',
            url: '<apicalling here>',
            headers: {
                'Authorization': 'Token xyz'
            }
        };
    
        axios(config)
            .then(function (response) {
                setProduct(response.data.cart[0].items);
                dispatch({type: 'setProducts', payload: response.data.cart[0].items}) // <--- dispatch once you get data
    
            })
            .catch(function (error) {
                console.log(error);
            });
    
    }, []);
    
    
    console.warn("hello", data); //yes working, data rendering here
    
    const [state, dispatch] = useReducer(cartReducer, {
        products: [],
        cart: [],
    });
    
    const value = {
       products: state.products; // <-- access it from state
       cart: state.cart
    }
    
    return <Cart.Provider value={value}>{children} </Cart.Provider>; // <--- change value here
    };
    
    export default Context;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 2022-01-12
      • 2018-05-31
      • 1970-01-01
      • 2023-04-11
      相关资源
      最近更新 更多