在Reactjs中使用Redux

本文介绍如何使用Redux解决React应用中的多组件通信问题。首先定义actions和reducer,随后创建store并将其提供给React组件树,最后通过connect将状态和操作绑定到组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最开始使用Reactjs时没有觉得必须要用Redux,也就没有学这部分内容。最近遇到了一个多组件通信的问题,觉得到了使用Redux的时候了就在网上找了文档看了看。下面写一些初步的使用方法。
1. 首先要定义actions。也就是描述你自定义的组件带着什么数据与别的组件进行交互,改变别的组件的状态。例如在下面的代码中的action用于通知新增一个按键,消息名称为ADD_BUTTON,消息携带的数据有id和active。

let btnId = 0;
export const addBtn = (active = false) => ({
    type: 'ADD_A_BUTTON',
    id: btnId++,
    active
})
  1. 然后定义reducer。reducer用于定义组件的初始状态和收到消息后更新状态。下面代码中的reducer处理了ADD_BUTTON这个消息,并且向状态中添加了新的数据。注意btns这个名称,状态会以这个名称被传递到组件中,可以使用this.props.btns来访问。此外,状态中存储的内容主要看reducer。
import { combineReducers } from 'redux'

const btns = (state = [], action) => {
    switch(action.type) {
        case 'ADD_A_BUTTON':
            return [...state, 
                {
                    id: action.id,
                    active: action.active
                }]
        default:
            return state
    }
}
const myReducer = combineReducers({btns})

export default myReducer
  1. 这时可以开始在组件入口处定义store。一个要注意的点是:Provider只能有一个子节点。我记得见过将Router作为字节点的。
import { createStore } from 'redux'
import { Provider } from 'react-redux'
const store = createStore(myReducer)
const ReduxDemo = () => (
    <div>
        <BtnGroupContainer></BtnGroupContainer>
        <AddBtnContainer></AddBtnContainer>
        <RemoveBtnContainer></RemoveBtnContainer>
        <DynamicViewContainer></DynamicViewContainer>
    </div>
)
class Com3 extends React.Component{
    render(){
        return  (
            <Provider store={store}>
                <ReduxDemo></ReduxDemo>
            </Provider>
        )
    }
}
  1. 然后开始定义组件。既可以使用函数式定义组件也可以将组件定义为对象。个人觉得定义为对象比较方便。下面组件的主要作用是用户点击按键,增加一个新的按键。所以它其实没有state,只需要向外发消息。mapState2Props其实没用。我试了下,如果不写mapState2Props,传null也可以。mapState2Props和mapDispatch2Props其实是将状态和组件向外发送action的函数封装成了props传递给了组件。所以组件的props有两个:state和addBtn。
const AddBtn = ({state, addBtn}) => {
    return (
        <button onClick={() => addBtn()}>Add a new Btn</button>
    )
}

const mapDispatch2Props = {
    addBtn: addBtn
}

const mapState2Props = (state) => {
    return state
}

const AddBtnContainer = connect(mapState2Props, mapDispatch2Props)(AddBtn)
export default AddBtnContainer

我把代码传到了github上https://github.com/Kenneth111/reactjs4study。除了redux,还有router和别的一些内容。有兴趣可以看看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值