热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

对Reactredux中connect要领的明白

关于React-reduxRedux是React百口桶的重要一员,之前在知乎上也看到相似的发问:该怎样通俗易懂的明白Redux?Redux是JavaScript的状况容器,Redu

关于React-redux

Redux是React百口桶的重要一员,之前在知乎上也看到相似的发问:该怎样通俗易懂的明白Redux?
Redux是Javascript的状况容器,Redux的观点简朴明了:

1. 运用中一切的状况都是以一个对象树的情势存储在一个单一的store中;
2. 当你想要转变运用的中的状况时,你就要dispatch一个action,这也是唯一的转变state的要领;
3. 经由过程编写reducer来保护状况,返回新的state,不直接修正本来数据;

为何会有Redux

在React中,数据的通报重要采纳state和props,props得由父级分发下来,而state是组件中可自行治理的状况,这意味着React并没有让数据回溯的才能,数据只能单向向下分发,或许自行内部处置惩罚,举一个简朴的例子,父组件能够运用props向子组件通报数据,子组件能够经由过程触发还调函数来转变父组件的状况,假如是那种没有嵌套关联的组件,该怎样来完成通讯呢?为了处理这个题目,Redux的要领就是将store放在根目录顶层组件中,一层层往下分发给各子组件,在子组件中举行挪用,Redux的作用是让状况变得越发可展望、而且更轻易治理。

Redux由Flux框架演化而来,但在Flux的基础上Redux转变了全部框架中某些角色的作用,比方在Flux中你能够具有多个store,每一个store存储本身对应的那部份状况,在Redux中,你只能保护一个store,存储了全部运用的一切状况,Redux更倾向于把store分发下去,dispatch action的时刻,reducer依据状况对象的key值再将store举行拆分,reducer能拿到store中对应的那一部份举行处置惩罚,Redux供应createStore、combineReducers、applyMiddleware等一系列要领来合营React-redux运用帮我们更好的对这个store举行治理,这里要详讲的是React-redux中的connect要领。

Store与视图层的绑定

Provider组件

想要把store绑定在视图层上,得用到React-redux中的两个主角:Provider和Connect,在api文档第一段话,作者说通常情况下你没法运用connect()去connect一个没有继续Provider的组件,也就是说假如你想在某个子组件中运用Redux保护的store数据,它必需是包裹在Provider中而且被connect过的组件,Provider的作用相似于供应一个大容器,将组件和Redux举行关联,在这个基础上,connect再举行store的通报。

Provider组件源码:

export function createProvider(storeKey = 'store', subKey) {
......
class Provider extends Component {
getChildContext() {
return { [storeKey]: this[storeKey], [subscriptionKey]: null }
}
constructor(props, context) {
super(props, context)
this[storeKey] = props.store;
}
render() {
return Children.only(this.props.children)
}
}
}

从源码中能够看到,作者用了React的Context,Context处理了一个React中很罕见的题目:当你的组件嵌套越来越深的时刻,context能让你父组件和别的里层组件之间的通讯变的更轻易,createProvider要领将返回一个Provider组件,该组件接收store和子组件,在Provider中定义了getChildContext要领来通报store,那末在子组件中应用contextTypes,你就可以应用context访问到父级组件通报的store数据了。

Props

  1. store:运用中唯一的状况store

  2. children: 运用的子组件

例子:








connect要领

来看下connect函数究竟是怎样将store和组件联络在一起的,注重到api文档中有如许的一句话:

It does not modify the component class passed to it; instead, it returns a new, connected component class for you to use.

connenct并不会转变它“衔接”的组件,而是供应一个经由包裹的connect组件。 conenct接收4个参数,分别是mapStateToProps,mapDispatchToProps,mergeProps,options(运用时注重参数位置递次)。

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

mapStateToProps(state, ownProps) 要领许可我们将store中的数据作为props绑定到组件中,只需store更新了就会挪用mapStateToProps要领,mapStateToProps返回的效果必需是object对象,该对象中的值将会更新到组件中,例子:

const mapStateToProps = (state) => {
return ({
count: state.counter.count
})
}

mapDispatchToProps(dispatch, [ownProps]) 第二个参数许可我们将action作为props绑定到组件中,mapDispatchToProps愿望你返回包括对应action的object对象,比方:

const mapDispatchToProps = (dispatch, ownProps) => {
return {
increase: (...args) => dispatch(actions.increase(...args)),
decrease: (...args) => dispatch(actions.decrease(...args))
}
}
export default connect(mapStateToProps, mapDispatchToProps)(yourComponent)

当你想对组件的render更新举行更好的掌握的时刻,它也支撑返回function要领,详细能够点击#279检察,例子:

const mapDispatchToProps = {
// increment: () => increment(1),
increase, // import increase function from action
decrease
}

mergeProps(stateProps, dispatchProps, ownProps) 该参数非必需,redux默许会帮你把更新保护一个新的props对象,相似挪用Object.assign({}, ownProps, stateProps, dispatchProps)。

而options是为了更好的定制化设置的一个参数,许可返回5个boolean、function的值,我日常平凡基本上没有接触到,想相识的能够参考api文档。

附参考文档:

  1. Redux中文文档

  2. Redux api引见

(本身日常平凡写的一些总结,有误的处所迎接交换斧正)


推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了将HashRouter改为Router后,页面全部变为空白页且没有报错的问题。作者提到了在实际部署中需要在服务端进行配置以避免刷新404的问题,并分享了route/index.js中hash模式的配置。文章还提到了在vueJs项目中遇到过类似的问题。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 详解react组件通讯方式(多种)
    这篇文章主要介绍了详解react组件通讯方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着 ... [详细]
  • React提供三种方式创建Refs:字符串Refs(将被废弃)回调函数RefsReact.createRef(从React16.3开始)第一种方式不推荐使用,原因在此,并且可能会在之后的版本移除。classMyComponentextendsReact.Component{constructor(props){sup ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了如何使用MATLAB调用摄像头进行人脸检测和识别。首先需要安装扩展工具,并下载安装OS Generic Video Interface。然后使用MATLAB的机器视觉工具箱中的VJ算法进行人脸检测,可以直接调用CascadeObjectDetector函数进行检测。同时还介绍了如何调用摄像头进行人脸识别,并对每一帧图像进行识别。最后,给出了一些相关的参考资料和实例。 ... [详细]
  • Parity game(poj1733)题解及思路分析
    本文是对题目"Parity game(poj1733)"的解题思路进行分析。题目要求判断每次给出的区间内1的个数是否和之前的询问相冲突,如果冲突则结束。本文首先介绍了离线算法的思路,然后详细解释了带权并查集的基本操作。同时,本文还对异或运算进行了学习,并给出了具体的操作步骤。最后,本文给出了完整的代码实现,并进行了测试。 ... [详细]
author-avatar
x将臣x
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有