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

相关推荐
少恭写代码4 天前
Taro首个支持鸿蒙的 UI 库,同时还兼容 React Native、小程序、H5
react native·鸿蒙·taro·duxapp
HyaCinth12 天前
taro3.x + tailwindcss + zustand微信小程序模板
前端·react.js·taro
getaxiosluo14 天前
react搭建router,redux教程
前端·react.js·arcgis·redux·router
学前端的小朱15 天前
Redux的简介及其在React中的应用
前端·javascript·react.js·redux·store
少恭写代码16 天前
duxapp放弃了redux,在duxapp中局部、全局状态的实现方案
react native·taro·redux·duxapp
Engss22 天前
Taro React-Native Android apk 打包
android·react native·taro
少恭写代码1 个月前
通过duxapp提供的基础方法、UI组件、全局样式,快速编写项目
react native·移动开发·taro·duxapp
Feather_741 个月前
taro微信小程序assets静态图片不被编译成base64
微信小程序·小程序·taro
hammer10101 个月前
taro底部导航,Tabbar
前端·typescript·taro
那就可爱多一点点1 个月前
Taro构建的H5页面路由切换返回上一页存在白屏页面过渡
前端·微信小程序·taro