开发者问题收集

如何有条件地声明 useState?

2021-11-11
46

对于我的问题,我现在从 api 获取数据,如下所示。

const fetchSomething = () => dispatch => {
    return axios
        .get('productsapi/getsomething', {
        })
        .then(res => {
            dispatch({
                type: FETCH_SOMETHING,
                payload: res.data[0].Groups[0].Products,
                payGroup: res.data[0],
            });
        })
        .catch(err => {
            console.log('fetching error');
            throw err;
        });
};

正如您所见,由于我在组件中遇到的问题,我从 api payloadpaygroup 获取了 2 种数据。

这是组件

let hotProductList = useSelector(state => state.productReducer.hotProduct);
let hotProductGroup = useSelector(
        state => state.productReducer.newHotProductGroups,
);

const [homeHotProductList, setHomeHotProductList] = useState(hotProductGroup.Groups[0].Products);

//No Error
//---------
//const [homeHotProductList, setHomeHotProductList] = useState(hotProductList); 
//---------

正如您在 useState 中看到的那样。如果我想使用来自 payGroup 的数据呈现 initial productList ,我必须声明为 useState(hotProductGroup.Groups[0].Products) 。问题是,这种声明总是返回错误,指出

undefined 不是对象

但是,如果我想使用来自 payload 的数据呈现 initial productList ,则不会发生此错误。

我应该怎么做才能使 declarationpayGroup 起作用而不出现错误

1个回答

我假设 homeHotProductList 是一个数组。您可以在 useEffect 中设置 homeHotProductList 。将 hotProductListhotProductGroup 添加为 useEffect 的依赖项。因此,每当这些值发生变化时,您都可以有条件地在 useEffect 内使用 setHomeHotProductList 设置 homeHotProductList

let hotProductList = useSelector(state => state.productReducer.hotProduct);
let hotProductGroup = useSelector(
        state => state.productReducer.newHotProductGroups,
);

const [homeHotProductList, setHomeHotProductList] = useState([]);


useEffect(() => {
 // here you can set homeHotProductList conditionally

}, [hotProductList, hotProductGroup])

关于此错误

undefined is not an object

如果您没有获得像 hotProductGroup?.Groups?.[0]?.Products 这样的值,则可以使用 可选链接 Nullish 合并运算符 ?? []

Sanket Shah
2021-11-11