react 如何使用reducer?
React 如何 reducer 使用
2023-09-14 09:13:49 时间
由于react 组件化,跨组件传递数据往往不是很方便,于是就考虑数据共享
例如,商品列表,选择商品后,通过添加,删除控制在右侧显示已选择的角色点击下方的按钮区域,传递已选择商品数据
该类型可以考虑使用react hooks 的useReducer
但是useReducer 通过自定义,才能有更好的使用效果
以商品列表为例,商品列表的初始数据需要从接口获取,这个适合可以写一个函数接收该数据作为参数,然后将数据作为依赖的形式。利用依赖触发(dispatch)初始的action
使用方式如下:
组件associateProduct.js
import useSelectedProductReducer from '../hooks/useSelectedProductReducer';
const selectedProductCodesByRequest = useMemo(() => {
return selectedProductsByRequest.reduce((pre, next) => {
pre.push(next.productCode);
return pre;
}, []);
}, [selectedProductsByRequest]); // selectedProductsByRequest 通过接口获取作为依赖
const [selectedProductCodes, dispatch] = useSelectedProductReducer(selectedProductCodesByRequest);
useSelectedProductReducer.js代码如下:
import React, { useReducer, useEffect } from 'react';
const reducer = (state, { type, payload }) => {
switch (type) {
case 'add':
return [...state, ...payload];
case 'remove':
return state.filter((productCode) => !payload.includes(productCode));
default:
return [...payload];
}
};
function useSelectedProductReducer(depData) {
const [selectedProductCodes, dispatch] = useReducer(reducer, []);
useEffect(() => {
if (depData) {
dispatch({
type: 'default',
payload: depData
});
}
}, [depData]);
return [selectedProductCodes, dispatch];
}
export default useSelectedProductReducer;
相关文章
- React v18.x 在 react-router v6 使用 lazy 动态加载组件实现
- React + Redux + GraphQL 环境搭建
- react面试如何回答才能让面试官满意
- React源码解读之更新的创建
- 前端必读2.0:如何在React 中使用SpreadJS导入和导出 Excel 文件
- 问:你是如何进行react状态管理方案选择的?
- react源码分析:babel如何解析jsx
- web3-react 库介绍: 帮助前端用户连接MetaMask(或任何钱包)
- React 的 setState 是同步还是异步?
- 你是如何使用React高阶组件的?_2023-02-28
- 前端面试之React
- React组件设计模式之-纯组件,函数组件,高阶组件
- React 开发 | 常用 Hooks
- react源码分析--深度理解React.Context
- 前端一面必会react面试题(持续更新中)
- React源码中的Fiber
- 从react源码角度看React-Hydrate原理
- 你是如何使用React高阶组件的-面试进阶
- React源码学习进阶(五)beginWork如何处理Fiber
- React 如何实例化组件?
- 问:你是如何进行react状态管理方案选择的?_2023-03-13
- react源码解析16.concurrent模式_2023-03-15