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
同样是一个方法 该方法接收两个参数 state
和 action
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
需要包裹在Provider
中 Provider
中需要一个必传 的 store
参数,就是我们之前说的 redux
的 store
因此,原来的 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
可以对 action
的 type
进行区分 并根据 action
的 val
修改相对应的数据
1.2 reducer使用
reducer
修改 其实也是类似于 vuex
通过 useDispatch
函数(hooks) 进行操作
js
// 引入 useDispatch
import { useDispatch } from 'react-redux'
// hooks 使用
const dispatch = useDispatch()
结束
至此,reducer
已经可以完整使用了