React与Redux整合技术简介

说明:阅读本篇文章需要对Redux有一定的了解,对Redux不了解的同学可先看看这篇文章Redux技术架构简介(一)

1. React中引入react-redux

为了让Redux和React更好的配合,Facebook专门开发了一个npm包--react-redux,可以这样引入你的项目:
npm install --save react-redux
当然不引用也完全可以(Redux包是必须要引用的),只不过会增加一些开发量,还会带来一些额外的性能开销。

2. 展示组件与容器组件

Redux的React绑定库的基本开发思想是展示组件与容器组件相分离。展示组件只负责页面呈现,不处理数据,不维护状态;容器组件负责页面的运行逻辑,获取展示组件中的消息,处理内部数据,更新状态等。

3. 展示组件的实现

React引入redux后,应用中只有单一的state树,react的每个组件都可以抛弃state的相关逻辑,改为从props获取,包括要执行的一些用户事件行为。
引入redux后的react组件变为:

class MainContent extends React.Component{
    constructor(props){
        super(props);
        this.sortResult = this.sortResult.bind(this);
        this.showSlider = this.showSlider.bind(this);
    }
    sortResult(data){
        this.props.setPhoto(data);
    }
    showSlider(index){
        this.props.showSlider(index);
    }
    componentDidMount () {
        this.props.fetchPosts();
    }
    render(){
        let {isFetching,isValidate} = this.props;
        let sliderNode = null;
        if(this.props.photo.length){
            sliderNode = <PhotoSliderContainer data={this.props.photo} />;
        }
        return (
            <div className="mainContent">   
                <Header  title="photo" />
                <SortContainer data={this.props.photo} sortResult={this.sortResult}/>
                <PhotoItemsContainer data={this.props.photo} showSlider = {this.showSlider}/>
                {sliderNode}
            </div>
        );
    }
};

可以看到,MainContent组件除了展示外,几乎没有任何的逻辑处理(subscribe和dispatch的逻辑都放到了容器组件),所有的数据都是通过this.props从父组件中获取。

4. 容器组件的实现

容器组件实现了将展示组件和redux关联在一起。技术上讲,容器组件就是使用 store.subscribe() 从 Redux state 树中读取部分数据,并通过 props 来把这些数据提供给要渲染的组件。建议每个展示组件对应一个容器组件,这样可以很清晰的找到映射关系。

mapStateToProps函数

从名字上可以看出,这个函数实现了从state(reducer中定义的)到展示组件props 的映射。示例代码如下:

const mapStateToProps = (state,ownProps) => {
    return {
        photo : state.photomainReducer.photoData,video : state.photomainReducer.videoData,isFetching : state.photomainReducer.isFetching,isValidate : state.photomainReducer.isValidate
    }
}

传入的state是应用中唯一的状态树,我们从相应组件的reducer中读取state,分别映射到一个自定义属性中,这样就可以在展示组件中直接调用对应属性(props)了。
mapStateToProps会订阅 Store,每当state更新的时候,就会自动执行,重新计算 UI 组件的参数,从而触发 UI 组件的重新渲染。

mapDispatchToProps函数

同样我们也可以猜到,这个函数的作用是将期望执行的dispatch方法的返回值映射到展示组件的props上。示例代码如下:

const mapDispatchToProps = (dispatch,ownProps) => {
    return {
        slider:(data) => dispatch(photomainAction.showSlider(data))
    }
}

比如我们想dispatch一个showSlider的action,通过这个方法映射之后,就可以直接这样写:

this.props.slider(data)

即mapDispatchToProps封装了dispatch方法。此外,还可以通过redux提供的bindActionCreators函数进一步封装,上面的代码可以改写如下:

const mapDispatchToProps = (dispatch,ownProps) => {
    return bindActionCreators({
        slider:photomainAction.showSlider
    },dispatch);
}

如果import时的action名和你想定义的属性名一样,甚至还可以简化:

const mapDispatchToProps = (dispatch,ownProps) => {
    return bindActionCreators({slider},dispatch);
}

connect函数

上面2个方法实现了state和action到props的映射,我们还需要把这2个函数连接在一起,并且要关联到一个具体的展示组件,这样就可以在展示组件中使用这种映射关系了。示例代码如下:

const PhotomainContainer = connect(
    mapStateToProps,mapDispatchToProps
)(Photomain);

其中,Photomain是一个展示组件。
每一个容器组件都包含一个对应的展示组件,我们可以把这些容器组件当做一个普通的react组件进行组合,整合的最后一步就是如何把store传入到每个组件中。

5. 传入Store

Store保存了整个应用的单一状态树,所有容器组件都需要从store中读取,我们可以store作为属性传递给每个组件,子组件通过props获取,但是如果嵌套过深,写起来会很麻烦。还好,react-redux提供一个叫provider的组件,他可以让所有组件都可以访问到store(他的实现原理实际上是利用了react的context功能),而不必显示的一层层传递了。

ReactDOM.render(
    <Provider store={store}>
        <PhotomainContainer></PhotomainContainer>
    </Provider>,$(".main-wrap")[0]
);

有一点要注意,provider内的组件只能有一个,所以需要将所有组件先封装成一个组件再用provider包裹起来。

6. 总结

Redux的引入使React彻底脱离了对数据状态的管理,可以让React更专注于View的展现,实际上这也是react善于做的事情。单独看react,我们甚至感觉不到redux的存在,使逻辑层和视图层更加清晰(redux负责逻辑,react负责视图),当然一部分原因要归功于react-redux包做了很好的封装。

以上就是React与Redux整合的简单实现。

参考

Redux 中文文档
Redux 入门教程-阮一峰

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom