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 已经可以完整使用了

相关推荐
aiguangyuan2 天前
Taro多端适配技术解析
taro·前端开发·移动端开发
Airser3 天前
npm启动Taro框架报错
前端·npm·taro
Dragon Wu6 天前
Taro 自定义tab栏和自定义导航栏
前端·javascript·小程序·typescript·前端框架·taro
菜鸟una11 天前
【微信小程序 + 消息订阅 + 授权】 微信小程序实现消息订阅流程介绍,代码示例(仅前端)
前端·vue.js·微信小程序·小程序·typescript·taro·1024程序员节
需要兼职养活自己18 天前
react 之redux
前端·react.js·redux
GISer_Jing21 天前
AI/CICD/Next/React Native&Taro内容
人工智能·react native·taro
小小前端_我自坚强25 天前
React Hooks 使用详解
前端·react.js·redux
GISer_Jing1 个月前
大前端——Taro、React-Native、Electron 大前端
前端·javascript·electron·taro
前端人类学2 个月前
React框架详解:从入门到精通(详细版)
react.js·redux
海海思思2 个月前
Redux Toolkit的前世今生:从繁琐到简洁的状态管理革命
react.js·redux