在React和Redux中有关连接react-redux(详细教程)

本篇文章主要介绍了浅谈react和redux的连接react-redux,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

之前一直在探索React相关的东西,手上有个SPA项目,于是准备上Redux试试水。Redux本身和React并没有之间的关联,它是一个通用Javscript App模块,用做App State的管理。要在React的项目中使用Redux,比较好的方式是借助react-redux这个库来做连接,这里的意思是,并不是没有react-redux,这两个库就不弄一起用了,而是说react-redux提供了一些封装,一种更科学的代码组织方式,让我们更舒服地在React的代码中使用Redux。

之前仅通过Redux文档来了解react-redux,在一段时间的实践后准备翻一翻源代码,顺便做些相关的总结。我看的代码的npm版本为v4.0.0,也就是说使用的React版本是0.14.x。

react-redux提供两个关键模块:Provider和connect。

Provider

Provider这个模块是作为整个App的容器,在你原有的App Container的基础上再包上一层,它的工作很简单,就是接受Redux的store作为props,并将其声明为context的属性之一,子组件可以在声明了contextTypes之后可以方便的通过this.context.store访问到store。不过我们的组件通常不需要这么做,将store放在context里,是为了给下面的connect用的。

这个是Provider的使用示例:

// config app rootconst history = createHistory()const root = (    )// renderReactDOM.render( root, document.getElementById('root'))

登录后复制

connect

这个模块是算是真正意义上连接了Redux和React,正好它的名字也叫connect。

先考虑Redux是怎么运作的:首先store中维护了一个state,我们dispatch一个action,接下来reducer根据这个action更新state。

映射到我们的React应用中,store中维护的state就是我们的app state,一个React组件作为View层,做两件事:render和响应用户操作。于是connect就是将store中的必要数据作为props传递给React组件来render,并包装action creator用于在响应用户操作时dispatch一个action。

好了,详细看看connect这个模块做了什么。先从它的使用来说,它的API如下:

connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])

登录后复制

mapStateToProps是一个函数,返回值表示的是需要merge进props的state。默认值为() => ({}),即什么都不传。

(state, props) => ({ }) // 通常会省略第二个参数

登录后复制

mapDispatchToProps是可以是一个函数,返回值表示的是需要merge仅props的actionCreators,这里的actionCreator应该是已经被包装了dispatch了的,推荐使用redux的bindActionCreators函数。

(dispatch, props) => ({ // 通常会省略第二个参数 ...bindActionCreators({  ...ResourceActions }, dispatch)})

登录后复制

更方便的是可以直接接受一个对象,此时connect函数内部会将其转变为函数,这个函数和上面那个例子是一模一样的。

mergeProps用于自定义merge流程,下面这个是默认流程,parentProps值的就是组件自身的props,可以发现如果组件的props上出现同名,会被覆盖。

(stateProps, dispatchProps, parentProps) => ({ ...parentProps, ...stateProps, ...dispatchProps})

登录后复制

options共有两个开关:pure代表是否打开优化,详细内容下面会提,默认为true,withRef用来给包装在里面的组件一个ref,可以通过getWrappedInstance方法来获取这个ref,默认为false。

connect返回一个函数,它接受一个React组件的构造函数作为连接对象,最终返回连接好的组件构造函数。

然后几个问题:

React组件如何响应store的变化?

为什么connect选择性的merge一些props,而不是直接将整个state传入?

pure优化的是什么?

我们把connect返回的函数叫做Connector,它返回的是内部的一个叫Connect的组件,它在包装原有组件的基础上,还在内部监听了Redux的store的变化,为了让被它包装的组件可以响应store的变化:

trySubscribe() { if (shouldSubscribe && !this.unsubscribe) {  this.unsubscribe = this.store.subscribe(::this.handleChange)  this.handleChange() }}handleChange () { this.setState({  storeState: this.store.getState() })}

登录后复制

但是通常,我们connect的是某个Container组件,它并不承载所有App state,然而我们的handler是响应所有state变化的,于是我们需要优化的是:当storeState变化的时候,仅在我们真正依赖那部分state变化时,才重新render相应的React组件,那么什么是我们真正依赖的部分?就是通过mapStateToProps和mapDispatchToProps得到的。

具体优化的方式就是在shouldComponentUpdate中做检查,如果只有在组件自身的props改变,或者mapStateToProps的结果改变,或者是mapDispatchToProps的结果改变时shouldComponentUpdate才会返回true,检查的方式是进行shallowEqual的比较。

所以对于某个reducer来说:

export default (state = {}, action) => { return { ...state } // 返回的是一个新的对象,可能会使组件reRender // return state // 可能不会使得组件reRender}

登录后复制

另外在connect的时候,要谨慎map真正需要的state或者actionCreators到props中,以避免不必要的性能损失。

最后,根据connect的API我们发现可以使用ES7 decorator功能来配合React ES6的写法:

@connect( state => ({  user: state.user,  resource: state.resource }), dispatch => ({  ...bindActionCreators({   loadResource: ResourceActions.load  }, dispatch) }))export default class Main extends Component {}

登录后复制

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

有关JS排序算法总结

使用JS+canvas如何制作圆锥

在vue-router中如何实现路由懒加载

在Angular2中如何实现断点调试ts文件

如何实现网页快报向上滚动

在vue中有关文件夹结构配置

以上就是在React和Redux中有关连接react-redux(详细教程)的详细内容,更多请关注【创想鸟】其它相关文章!

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

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2749270.html

(0)
上一篇 2025年3月8日 04:58:45
下一篇 2025年2月24日 09:33:43

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 详细解读react-navigation的导航使用

    本篇文章主要介绍了react native react-navigation 导航使用详解,详解的介绍了react-navigation导航的使用,具有一定的参考价值,有兴趣的可以了解一下 一、开源库介绍 今年1月份,新开源的react-n…

    2025年3月8日
    200
  • 在react-navigation中如何判断用户是否登录跳转到登录页

    本篇文章主要介绍了react-navigation 如何判断用户是否登录跳转到登录页的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文介绍了react-navigation 如何判断用户是否登录跳转到登录页的方法,分享给大家,也…

    编程技术 2025年3月8日
    200
  • 使用vue,angular,react如何实现数据双向绑定

    本篇文章主要介绍了浅谈vue,angular,react数据双向绑定原理分析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 传统做法 前端维护状态,手动操作DOM更新视图。前端框架对服务器数据通过模版进行渲染。…

    2025年3月8日
    100
  • 关于react-native之ART绘图的方法

    本篇文章主要介绍了react-native之art绘图方法详解,内容挺不错的,现在分享给大家,也给大家做个参考。 背景 在移动应用的开发过程中,绘制基本的二维图形或动画是必不可少的。然而,考虑到Android和iOS均有一套各自的API方案…

    2025年3月8日 编程技术
    200
  • React Native使用Flexbox布局的介绍

    react中引入了flexbox概念,flexbox是属于web前端领域css的一种布局方案,下面这篇文章主要给大家介绍了关于react native基础入门之初步使用flexbox布局的相关资料,文中通过示例代码介绍的非常详细,需要的朋友…

    2025年3月8日 编程技术
    200
  • react实现点击选中的li高亮的方法

    本篇文章主要介绍了react实现选中的li高亮的示例代码,页面上有很多个li,要实现点击到哪个就哪个高亮。内容挺不错的,现在分享给大家,也给大家做个参考。 虽然只是一个简单的功能,还是记录一下比较好。页面上有很多个li,要实现点击到哪个就哪…

    2025年3月8日
    200
  • React+mongodb的使用与配置

    这篇文章主要介绍了关于react+mongodb的使用与配置,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 React环境搭建 (一步一步走) React 基本配置 (React 是一个用于构建用户界面的 JAVASCRIP…

    2025年3月8日 编程技术
    200
  • React中常用一些技巧总结(代码)

    本篇文章给大家带来的内容是关于React中常用一些技巧总结(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 一.React-classnames库 在实际应用中,经常会遇到根据某些状态增加或更改组件属性中类名的情况,…

    2025年3月8日
    200
  • Vue和React区别在哪里?

    本章给大家带来vue和react区别在哪里?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 一、监听数据变化的实现原理不同    Vue 通过 getter/setter 以及一些函数的劫持,能精确知道数据变化,不需要特别的…

    2025年3月8日
    200
  • react是什么?react的基本使用介绍(附实例)

    本篇文章主要的讲述了关于react的一些基础知识,让大家多多了解一些关于react的基础。现在就让我们一起来看这篇文章吧 React入门系列一(初识React)一、React简介React是一个用于构建用户界面的JavaScript库。Re…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论