Taro react 数据管理之redux

React Redux

Taro 中可以自由地使用 React 生态中非常流行的数据流管理工具 Redux 来解决复杂项目的数据管理问题。

Redux 安装

这里需要安装两个,一个是 redux 一个是 react-redux

同样,需要配合 包管理工具 逆行安装

bash 复制代码
# 可以根据个人爱好其他包管理工具进行安装
$ npm i redux react-redux
# yarn 二选一即可
$ yarn add redux react-redux

使用(数据获取)

1. 创建仓库

src 目录下新增 store 文件夹【文件夹命名规则非强制,不过是一个约定俗成的说法,可以自定义名称】 并在 store 文件夹内新增 index.ts 文件,表示 redux

效果如下:

2. 创建redux

新版 redux 采用的是 legacy_createStore 方法创建仓库,若旧版,采用的是 createStore 首先,需要引入 legacy_createStore

js 复制代码
import { legacy_createStore } from 'redux' 

legacy_createStore 是一个方法,需要接收 reducer(即一个方法)效果类似:

js 复制代码
import reducer from './reducer'
const store = legacy_createStore(reducer)
// reducer 是我们接下来的一步的内容

export default store

3. 编辑reducer

reducer 同样是一个方法 该方法接收两个参数 stateaction
state 代表的是仓库,它定义了我们redux中存放哪些数据

ts 复制代码
// 比如,我现在有一个叫 defaultState 的变量,用它作为我的仓库
// 该仓库中有一个叫做user的数据
const defaultState: {user: any} = {
    user: {}
}

那么 现在的 reducer 就编辑为如下内容

ts 复制代码
// action暂时没涉及,暂定any类型
// state 的数据类型上文有提及 = defaultState 是给state一个默认值
const reducer = (state: {user:any} = defaultState, action: any) => {
    // reducer方法
}

reducer方法需要返回的是一个state

因此,上文的方法可以拓展为

ts 复制代码
// action暂时没涉及,暂定any类型
// state 的数据类型上文有提及 = defaultState 是给state一个默认值
const reducer = (state: {user:any} = defaultState, action: any) => {
    return state
}

但是,reducer 是不允许直接修改 state 的,我们想要修改,只需要拷贝一下 state

ts 复制代码
// action暂时没涉及,暂定any类型
// state 的数据类型上文有提及 = defaultState 是给state一个默认值
const reducer = (state: {user:any} = defaultState, action: any) => {
    const newState = JSON.parse(JSON.stringify(state))
    return newState
}
// 最后,只需要导出一下 reducer 即可正常使用
export default reducer

目前效果如下:

4. 页面中使用

4.1 修改 项目入口文件

将原先项目中 src 目录下的 app.ts 修改为 app.tsx 文件

4.2 引入 Provider

Provider可以理解成一个是一个ReactNode节点(当然,不完全是)
redux需要包裹在ProviderProvider中需要一个必传store 参数,就是我们之前说的 reduxstore

因此,原来的 app.tsx

tsx 复制代码
// src/app.tsx
import { useEffect } from 'react'  
import { useDidShow, useDidHide } from '@tarojs/taro'  
// 全局样式  
import './app.scss'  
  
function App(props) {  
// 可以使用所有的 React Hooks  
useEffect(() => {})  
  
// 对应 onShow  
useDidShow(() => {})  
  
// 对应 onHide  
useDidHide(() => {})  
  
return props.children  
}  
  
export default App

需要修改为

tsx 复制代码
// src/app.tsx
import { useEffect } from 'react'  
import { useDidShow, useDidHide } from '@tarojs/taro'  
// 全局样式  
import './app.scss'  

// 这里引入
import { Provider } from 'react-redux'  
import store from './store'  

function App(props) {  
// 可以使用所有的 React Hooks  
useEffect(() => {})  
  
// 对应 onShow  
useDidShow(() => {})  
  
// 对应 onHide  
useDidHide(() => {})  
  // 这里出现变化
return <Provider store={ store }>  
{ props.children }  
</Provider>  
}  
  
export default App

效果如下:

4.3 在页面中使用

随便找个页面, 比如首页 src/pages/index/index.tsx 现在react最优秀的地方在于react hooks 因此,直接使用hooks
useSelector 就是 react-redux 提供的 hooks

tsx 复制代码
// 引入部分
import { useSelector } from 'react-redux'
// 正常使用
const { user }: { user: any } = useSelector((state: any) => ({  
    user: state.user  
}))

使用(数据修改)

1.1 reducer修改

这里才要对上文没提及的 action 进行编辑了 action 的数据类型为 {type: string, val: any}
type 类型为 string
val 类型为 任意 val是我们最后修改的数据

reducer 中 通过 switch 可以对 actiontype 进行区分 并根据 actionval 修改相对应的数据

1.2 reducer使用

reducer 修改 其实也是类似于 vuex 通过 useDispatch 函数(hooks) 进行操作

js 复制代码
// 引入 useDispatch
import { useDispatch } from 'react-redux'
// hooks 使用
const dispatch = useDispatch()

结束

至此,reducer 已经可以完整使用了

相关推荐
HarderCoder1 天前
ByAI:Redux中间件的原理和ts简化实现
前端·redux
HarderCoder1 天前
ByAI:Redux及中间件原理和实现
redux
不爱吃糖的程序媛4 天前
鸿蒙版Taro 搭建开发环境
华为·harmonyos·taro
PyAIGCMaster5 天前
react+taro 开发第五个小程序,解决拼音的学习
react.js·小程序·taro
程序员小刘6 天前
【HarmonyOS 5】鸿蒙Taro跨端框架
华为·harmonyos·taro
市民中心的蟋蟀9 天前
第九章 案例 3 - Valtio 【上】
前端·react.js·redux
君的名字14 天前
怎么判断一个Android APP使用了taro 这个跨端框架
android·react native·taro
PyAIGCMaster14 天前
项目 react+taro 编写的微信 小程序,什么命令,可以减少console的显示
react.js·微信·taro
蓉妹妹17 天前
React+Taro 微信小程序做一个页面,背景图需贴手机屏幕最上边覆盖展示
react.js·微信小程序·taro
时间识人17 天前
【无标题】
vue.js·微信小程序·taro