react 如何使用reducer ?

由于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;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最新在学ReactHooks这个新特性,把学习笔记记下来,供大家分享。 原先的函数组件是没有生命周期函数的,这样在...
    番茄_tomatoMan阅读 1,779评论 0 0
  • react hooks demo 创建所需要的组件,这个项目我们分成三个组件, 分别是头部,搜索框,电影列表// ...
    Joemoninni阅读 723评论 0 3
  • 一、react新特性 1. context 在一个典型的 React 应用中,数据是通过 props 属性自上而下...
    zxhnext阅读 1,068评论 0 0
  • 关于React Hook React Hook 对于React来说无疑是一个伟大的特性,它将React从类组件推向...
    Mstian阅读 2,391评论 0 11
  • React Hooks 在了解React Hooks之前, 我们先看一下 Class 和函数式 的一般写法 Cla...
    YM雨蒙阅读 2,911评论 0 1