javascript - 在每个渲染上调度 Action

标签 javascript reactjs redux use-effect

我在 ProductList 组件的每次安装上调度操作 addProducts ,而我想使用 useEffect 钩子(Hook)调度一次操作并将数据存储在 redux 中然后使用它。

下面是我的操作文件和 ProductList 组件文件。

actions.js 文件

export const addProducts = () => async (dispatch) => {
  let Products = await axios.get("https://api.npoint.io/2a4561b816e5b6d00894");
  return dispatch({
    type: ADD_PRODUCTS,
    payload: Products.data,
  });
};

ProductList.js组件文件

import { addProducts } from "../actions/Index";
const ProductList = () => {
  const dispatch = useDispatch();
  useEffect(() => {
   dispatch(addProducts()); 
  },[]);
  const Products = useSelector((state) => state.products);
  console.log(Products)

最佳答案

您可以只在组件中分派(dispatch)该操作,但如果产品可用,则在 thunk 操作中不执行任何操作:

export const addProducts = () => async (
  dispatch,
  getState,//thunk also get a getState function
) => {
  //you should write a dedicated selector function so you could do:
  //  const productsInState = selectProducts(getState())
  const productsInState = getState().products
  //whatever would make state.products available
  //  reducers are missing in your question
  if(productsInState){
    //do nothing if products are already in state
    return;
  }
  let Products = await axios.get(
    'https://api.npoint.io/2a4561b816e5b6d00894',
  );
  return dispatch({
    type: ADD_PRODUCTS,
    payload: Products.data,
  });
};

在你的组件中,你可以只在每个渲染上调度,如果你的页面有多个组件调度此操作,那么你可以创建一个 grouped action

关于javascript - 在每个渲染上调度 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64890923/

相关文章:

php - Ajax PHP 未向我提供任何响应文本

javascript - 这个链式 ES6 箭头函数是什么?

javascript - 如何使用 Jest 和 Enzyme 测试具有 Router、Redux 和两个 HOC 的 React 组件?

ios - React 不变违规 : Minified React error #267

reactjs - 如何使用 FormData 发送 event.target 以模拟函数

javascript - redux getState() 不返回更新后的状态

javascript - Node JS - 我应该执行 "return cb(..)"还是先执行 cb(..) 然后返回?

javascript - 如何像日历一样通过拖动选择html单元格并突出显示

javascript - 捕获错误的正确方法是什么?

javascript - 在 Modal 中传递函数时 React Native "onPress is not a function"