reactjs - 将 useEffect 与 React-redux 一起使用
问题描述
我有个问题。据我了解,钩子 useEffect 没有运行。我有应该从服务器获取数据的操作。
export const getProducts = () => {
return dispatch => {
dispatch(getProductsStarted());
fetch('https://shopserver.firebaseapp.com/get-products')
.then(res => {
dispatch(getProductsSuccess(res.json()));
})
.catch(err => {
dispatch(getProductsFailure(err.message));
});
}
}
const getProductsSuccess = todo => ({
type: "ADD_TODO_SUCCESS",
payload: {
...todo
}
});
const getProductsStarted = () => ({
type: "ADD_TODO_STARTED"
});
const getProductsFailure = error => ({
type: "ADD_TODO_FAILURE",
payload: {
error
}
});
我有一个减速器。
const initialState = {
loading: false,
products: [],
error: null
}
export const ProductReducer = (state = initialState, action) => {
switch (action.type) {
case "ADD_TODO_SUCCESS":
return {
...state,
loading: false,
error: null,
todos: [...state.products, action.payload.products]
}
case "ADD_TODO_STARTED":
return {
...state,
loading: true
}
case "ADD_TODO_FAILURE":
return {
...state,
loading: false,
error: action.payload.error
}
default:
return state
}
}
我有一个要在其中呈现结果的组件。
import React from 'react';
import { CardItem } from "./cardItem";
import { useSelector } from 'react-redux';
import { useEffect } from 'react';
import { getProducts } from '../Redux/Actions/productAction'
export const ProductCard = () => {
useEffect(() => {
getProducts();
console.log('111111')
})
const data = useSelector(state => state.ProductReducer.products);
return (
<div>
{data.map( element =>
CardItem (element)
)}
</div>
)
}
渲染页面后没有任何反应。ReduxDevTools 显示没有发送操作。请帮我解决它。谢谢你。
解决方案
我认为您应该像这样调用异步操作:
import { useDispatch, useSelector } from 'react-redux';
[...]
export const ProductCard = () => {
const dispatch = useDispatch();
useEffect(() => {
// I guess getProducts is an async redux action using redux-thunk
dispatch(getProducts());
console.log('111111')
}, []);
[...]
}
我假设您只想在组件诞生时加载产品,所以我传递一个空数组作为 useEffect 的第二个参数(https://reactjs.org/docs/hooks-reference.html#useeffect)。
推荐阅读
- asp.net-core - 如何在我的 Dotnet 核心项目中添加 Temples
- java - 如何一次更新所有 JavaFX 元素?
- reactjs - 如何在组件内部使用 Dispatch
- python-3.x - 如何高效地找到适当因子的多重性?
- youtube - Youtube 数据 API:来自 youtube 搜索请求的视频总数不正确
- javascript - 如何在 laravel 框架中更新没有表单和 javascript 的表值
- java - 获得所有辅音和元音组合的方法,该方法消耗足够的内存
- c - 汇编中的 Memmove
- magento - 带有消息“必须设置消息收件人数据”的异常“Mage_Core_Exception”。在应用程序/Mage.php:595
- sqlite - 带有修改列值的 sql where 闭包