React-Redux

本文介绍了如何在多模块React应用中利用react-redux库来避免通过props逐层传递Reduxstore的繁琐过程。通过创建Provider组件,可以在整个应用中共享store,并使用connect函数将dispatch和state映射到子组件的props,使得状态管理更为简洁高效。
摘要由CSDN通过智能技术生成

问题
    在多模块文件的React应用中,如果在根模块中创建 Redux store,然后通过props依次传递给所有的子组件,实在太麻烦了

方案
    react-redux模块可用于使用了Redux的React项目中,提供了两方面的扩展功能
        ① 一个“Context.Provider”:为它所包含的所有子组件提供store使用
        ② 一个HOC高阶组件函数:connect()函数将自定义组件提升为“高阶组件”,将Redux的dispatch和state映射为被包装组件的props

步骤
    ① 安装依赖模块  npm  i    redux   react-redux
    ② 顶级组件中创建 store 和 reducer,使用Provider为子组件共享store
    ③ 将store.dispatch()映射为子组件的props
    ④ 将store.getState()映射为子组件的props
 

@index
import React from "react";
import ReactDOM from "react-dom/client";
import { createStore } from "redux";
import CartShow from "./components/CartShow";
import CartModify from "./components/CartModify";
import { Provider } from "react-redux";

// state
let initState = {
    buyCount: 5,
};
// action
// {type:"ENCREASE"}
// {type:"DECREASE"}

// reducer
function appReducer(state = initState, action) {
    console.log("state updated");
    if (action.type === "ENCREASE") {
        return { ...state, buyCount: state.buyCount + 1 };
    } else if (action.type === "DECREASE") {
        let buyCount = state.buyCount - 1;
        buyCount = buyCount < 0 ? 0 : buyCount;
        return { ...state, buyCount };
    } else {
        return state;
    }
}
// store
let store = createStore(appReducer);

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
    <Provider store={store}>
        <CartShow></CartShow>
        <hr />
        <CartModify></CartModify>
    </Provider>
);
components\CartShow.js
import React from "react";
import { connect } from "react-redux";

function CartShow(props) {
    return <div>当前数量:{props.bc}</div>;
}
function mapStateToProps(state) {
    return {
        bc: state.buyCount,
    };
}
export default connect(mapStateToProps, null)(CartShow);
@components\CartModify.js
import React from "react";
import { connect } from "react-redux";

function CartModify(props) {
    return (
        <div>
            <button onClick={props.dec}>-</button>
            <button onClick={props.enc}>+</button>
        </div>
    );
}
function mapDispathToProps(dispatch) {
    return {
        enc: () => {
            dispatch({ type: "ENCREASE" });
        },
        dec: () => {
            dispatch({ type: "DECREASE" });
        },
    };
}
export default connect(null, mapDispathToProps)(CartModify);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值