taro使用 Redux官方教程
在 Taro 中可以自由地使用React
生態中非常流行的資料流管理工具Redux來解決複雜專案的資料管理問題。而為了更方便地使用Redux
,Taro 提供了與react-reduxAPI 幾乎一致的包@tarojs/redux
來讓開發人員獲得更加良好的開發體驗。
下文中示例程式碼均在taro-redux-sample
首先請安裝redux
、@tarojs/redux
和@tarojs/redux-h5
,以及一些需要用到的redux
中介軟體
隨後可以在專案src
目錄下新增一個store
目錄,在目錄下增加index.js
檔案用來配置store
,按自己喜好設定redux
的中介軟體,例如下面例子中使用redux-thunk
和redux-logger
這兩個中介軟體
接下來在專案入口檔案app.js
中使用@tarojs/redux
Provider
元件將前面寫好的store
接入應用中
// src/app.js
import Taro, { Component } from '@tarojs/taro'
import { Provider } from '@tarojs/redux'
import configStore from './store'
import Index from './pages/index'
import './app.scss'
const store = configStore()
class App extends Component {
render() {
return (
<Provider store={store}>
{this.props.children}
</Provider>
)
}
}
Taro.render(<App />, document.getElementById('app'))
然後就可以開始使用了。如redux
推薦的那樣,可以增加
constants
目錄,用來放置所有的action type
常量actions
目錄,用來放置所有的actions
reducers
目錄,用來放置所有的reducers
例如我們要開發一個簡單的加、減計數器功能
新增action type
新增reducer
處理
新增action
處理
最後,我們可以在頁面(或者元件)中進行使用,我們將通過tarojs/redux
提供的connect
方法將redux
與我們的頁面進行連線
connect
方法接受兩個引數mapStateToProps
與mapDispatchToProps
mapStateToProps
,函式型別,接受最新的state
作為引數,用於將state
對映到元件的props
mapDispatchToProps
,函式型別,接收dispatch()
方法並返回期望注入到展示元件的props
中的回撥方法
#Hooks
#在 Redux 中使用 Hooks
使用 hooks 的基本設定和使用connect
的設定是一樣的,你需要設定你的store
,並把你的應用放在Provider
元件中。
在這樣的情況下,你就可以使用taro-redux
提供的 Hooks API 在函式式元件中使用。
#useSelector
const result : any = useSelector(selector : Function, equalityFn? : Function)
useSelector
允許你使用 selector 函式從一個 Redux Store 中獲取資料。
Selector 函式大致相當於connect
函式的mapStateToProps
引數。Selector 會在元件每次渲染時呼叫。useSelector
同樣會訂閱 Redux store,在 Redux action 被 dispatch 時呼叫。
但useSelector
還是和mapStateToProps
有一些不同:
- 不像
mapStateToProps
只返回物件一樣,Selector 可能會返回任何值。 - 當一個 action dispatch 時,
useSelector
會把 selector 的前後返回值做一次淺對比,如果不同,元件會強制更新。 - Selector 函式不接受
ownProps
引數。但 selector 可以通過閉包訪問函式式元件傳遞下來的 props。
#使用案例
基本使用:
import Taro, { Components } from '@tarojs/taro' import { useSelector } from '@tarojs/redux' export const CounterComponent = () => { const counter = useSelector(state => state.counter) return <View>{counter}</View> }使用閉包決定如何 select 資料:
export const TodoListItem = props => { const todo = useSelector(state => state.todos[props.id]) return <View>{todo.text}</View> }#進階使用
你還可以訪問react-redux 文件瞭解如何使用reselect
快取 selector。
#useDispatch
const dispatch = useDispatch()
這個 Hook 返回 Redux store 的dispatch
引用。你可以使用它來 dispatch actions。
#使用案例
import Taro, { Components } from '@tarojs/taro' import { useDispatch } from '@tarojs/redux' export const CounterComponent = ({ value }) => { const dispatch = useDispatch() return ( <View> <Text>{value}</Text> <Button onClick={() => dispatch({ type: 'increment-counter' })}> Increment counter </Button> </View> ) }當我們使用dispatch
傳遞迴調到一個子元件時,推薦使用useCallback
把回撥快取起來,因為元件可能因為引用改變而重新渲染。
#useStore
const store = useStore()
useStore
返回一個 store 引用和Provider
元件引用完全一致。
這個 hook 可能並不經常使用。useSelector
大部分情況是你的第一選擇,如果需要替換 reducers 的情況下可能會使用到這個 API。