德胜云资讯,添加一些关于程序相关的内容,仅供大家学习交流(https://www.wxclwl.com)

网站地图

搜索
德胜云咨询
前端分类 javascript CSS 正则表达式 html 前端框架 typescript Ajax
热门标签:
最新标签:

ReduxReact Redux超简单入门redux mobx速看,

日期:2023/03/20 18:38作者:方一强人气:

导读:在React或者React Native等中,兄弟组件之间的状态共享是一件麻烦的事情,当然我们可以把状态提升到它们的共同父组件,但项目大了之后会...

在React或者React Native等中,兄弟组件之间的状态共享是一件麻烦的事情,当然我们可以把状态提升到它们的共同父组件,但项目大了之后会很麻烦。因此,我们可以使用一些状态管理库,例如Redux。很多教程都写得比较复杂,这里想以简单的方式介绍一下,所以例子会非常简单。

概述——Redux和React Redux

Redux(redux)是一个状态管理库,可以用于很多框架,不仅是React,而React Redux(react-redux)是一个可以使得Redux更方便地应用于React应用的模块,当然也适用于React Native应用。

基本概念

在Redux中,主要解决的问题就是状态共享,使得兄弟组件之间不需要状态提升也可以共享状态,通俗地讲就是把状态不放在组件中,而是放在一个叫做store的地方。

在Store中,存储状态(state),类似于组件中的状态(state),可以直接读取,但不能直接修改,而是需要通过一个叫做dispatch的函数修改,dispatch()函数接收一个参数,这个参数叫做action,代表一个动作。

store可以使用createStore()函数生成,该函数接收一个函数作为参数,这个作为参数的函数叫做Reducer。虽然createStore()函数已被废弃,但我们这里暂且还是先使用createStore()函数。

Reducer接收两个参数,第一个参数是状态更新前的旧的状态(旧state),第二个参数是使用dispatch函数传递过来的action。在Reducer中,需要根据传递进来的action,返回新的状态(新state),若action的类型为其它时,则需要返回旧state。

action是一个JS对象,必须有的键名为type,代表action的类型(或者说是操作),以计数器为例,Action可以有加1、重置等,我们可以把type的值设为"ADD"、"RESET"等。action还可以带上一些其它的键,用于存储一些其它需要在Reducer中用到的参数。

以计数器为例,初始的state可以如下:

{count:0}

Reducer可以如下:

(state={count:0},action)=>{ switch(action.type){ case "ADD": return {count:state.count+1}; case "RESET": return {count:0}; default: return state; }

在组件中的使用

在组件中,Store中存储的state我们不能直接使用,而需要将Store中的state和dispatch映射为props,在组件中,通过props进行使用,函数组件和类组件均可,注意:一个是作为函数参数传递进来的props、不需要加this,一个是成员变量、不要忘记加上this,下文中省略this。

为了能够映射,我们不能直接导出我们写的函数组件或者类组件,而是需要导出使用由react-redux提供的connect()函数生成的组件。

connect()函数接收两个参数,都是函数。

第一个参数,接收store中存储的state(以下简称为state),需要返回一个对象,这个对象的键为props的名称,值可以从该函数的参数(state)中取值,该函数的参数(state)即为存储在store中的state,当然如果你想将props设置为和存储在store中的state同名同值的话,可以直接返回该函数的参数(state)。

第二个参数传入一个代表dispatch的函数(以下简称为dispatch),我们需要返回一个对象,键名为props中我们想要取的一个函数名称,值为一个函数,在这个函数中,我们可以通过调用dispatch()函数传入一个Action来触发一个Action,此时props.函数名称就代表一个在组件中可以调用的函数,调用该函数,就会调用在以上定义的dispatch函数触发一个Action。

connect()函数会返回一个函数,需要传入我们写的函数组件或者类组件作为参数。

例如假设我们写的组件叫做Counter,state和reducer同上,store为使用createStore()函数传入上述reducer生成的Store,我们需要在该组件中,使用和Store中的state同名同值的状态(例如count),还需要两个函数分别叫做add和reset用于触发ADD和RESET这两个Action,那么导出的形式可以这样写:

export default connect((state)=>(state),(dispatch)=>({ add:dispatch({type:"ADD"}), reset:dispatch({type:"RESET"}) }))(Counter);

此时,我们就能在组件中通过props.count获取存储在store中的state的count的值了,也能通过使用props.add()和props.reset()函数来修改Store中的状态(state)了。

Provider

为了能够在组件中能够处理Store,我们需要在最外层组件的外面套一个Provider组件,比如说在App组件的外面套一层Provider组件。Provider组件是由react-redux提供的,它需要传入一个名为store的props,它的值是上面由createStore()函数创建的Store。

需要注意的是在例如React Navigation提供的Tab.Screen组件中,有两种方式传递子组件,一种是通过component属性,一种是通过在开始和结束标签内部使用函数返回子组件。前者不能使用由connect()函数导出的组件,而后者则可以。

网站地图

Copyright © 2002-2022 香港德胜云网络 版权所有 | 备案号:蜀ICP备2023007363号-5

声明: 本站内容全部来自互联网,非盈利性网站仅供学习交流