日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

React狀態管理器Rematch的使用詳解_React

作者:Ethan01 ? 更新時間: 2022-11-03 編程語言

Rematch使用

1. Rematch介紹

Rematch是沒有樣板文件的Redux的最佳實踐,沒有action typesaction creators, 狀態轉換或thunks。

2. Rematch特性

Redux 是一個了不起的狀態管理工具,由良好的中間件生態系統和優秀的開發工具支持。RematchRedux 為基礎,減少樣板文件并強制執行最佳實踐。

  • 小于 2kb 的大小
  • 無需配置
  • 減少 Redux 樣板
  • React 開發工具支持
  • 支持動態添加reducer
  • Typesctipt支持
  • 允許創建多個store
  • 支持React Native
  • 可通過插件擴展

3. 基本使用

以一個計數器(count)應用為例子:

a. 定義模型(Model) Model集合了state、reducersasync actions,它是描述Redux store的一部分以及它是如何變化的,定義一個模型只需回答三個小問題:

- 如何初始化`state`? **state**
- 如何改變`state`? **reducers**
- 如何處理異步`actions`? **effect** with async/await
// ./models/countModel.js
export const count = {
  state: 0, // 初始化狀態
  reducers: {
    // reducers中使用純函數來處理狀態的變化
    increment(state, payload) {
      return state = payload
    },
  },
  effects: dispatch => ({
    // effects中使用非純函數處理狀態變化
    // 使用async/await處理異步的actions
    async incrementAsync(payload, rootState) {
      await new Promise(resolve => setTimeout(resolve, 1000))
      dispatch.count.increment(payload)
    }
  })
}
// ./models/index.js
import { count } from './count'

export const models = {
  count
}

b. 初始化store 使用init方法初始化store, init是構建配置的Redux存儲所需的唯一方法。init的其他參數可以訪問api了解。

// store.js
import { init } from '@rematch/core'
import * as models from './models'
const store = init({models})
export default store

c. Dispatch actions 可以通過使用dispatch來改變你的store中的reducereffects,而不需要使用action typesaction creators; Dispatch可以直接被調用,也可以使用簡寫dispatch[model][action](payload)。

const { dispatch } = store
// state = { count: 0 }
// reducers
dispatch({ type: 'count/increment', payload: 1 }) // state = { count: 1 }
dispatch.count.increment(1) // state = { count: 2 }
// effects
dispatch({ type: 'count/incrementAsync', payload: 1 }) // 延時1秒后 state = { count: 3 }
dispatch.count.incrementAsync(1) // 延時1秒后 state = { count: 4 }

d. RematchRedux一起使用 Rematch可以和原生Redux集成一起使用,看下邊這個例子:

// App.js
import React from 'react'
import ReactDOM from 'react-dom'
import { Provider, connect } from 'react-redux'
import store from './store'

const Count = (props) => (
    <div>
        The count is {props.count}
        <button onClick={props.increment}>increment</button>
        <button onClick={props.incrementAsync}>incrementAsync</button>
    </div>
)
const mapState = (state) => ({
    count: state.count,
})

const mapDispatch = (dispatch) => ({
    increment: () => dispatch.count.increment(1),
    incrementAsync: () => dispatch.count.incrementAsync(1),
})

const CountContainer = connect(
    mapState,
    mapDispatch
)(Count)

ReactDOM.render(
    <Provider store={store}>
        <CountContainer />
    </Provider>,
    document.getElementById('root')
)

原文鏈接:https://juejin.cn/post/7140846955088838664

欄目分類
最近更新