taro开发微信小程序-数据共享于缓存使用Redux(十五)

版权声明:本文是原创博文,转载请保留原创地址。 https://blog.csdn.net/museions/article/details/86360474

一taro集成Redux

taro集成Redux方式也比较简单:
首先安装 redux@tarojs/redux@tarojs/redux-h5,以及一些需要用到的 redux 中间件

##yarn
$ yarn add redux @tarojs/redux @tarojs/redux-h5 redux-thunk redux-logger
##npm
$ npm install --save redux @tarojs/redux @tarojs/redux-h5 redux-thunk redux-logger
taro redux集成和使用

二taro配置中间件

在项目 src 目录下新增一个 store 目录,在目录下增加 index.js 文件用来配置 store,按自己喜好设置 redux 的中间件,例如使用 redux-thunkredux-logger 这两个中间件

// src/store/index.js
import { createStore, applyMiddleware } from 'redux'
import thunkMiddleware from 'redux-thunk'
import { createLogger } from 'redux-logger'
import rootReducer from '../reducers'

const middlewares = [
  thunkMiddleware,
  createLogger()
]

export default function configStore () {
  const store = createStore(rootReducer, applyMiddleware(...middlewares))
  return store
}

引入store至项目

在项目入口文件 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 {
  config = {
    pages: [
      'pages/index/index'
    ],
    window: {
      navigationBarTitleText: 'Test'
    }
  }

  render() {
    return (
      <Provider store={store}>
        <Index />
      </Provider>
    )
  }
}

Taro.render(<App />, document.getElementById('app'))

四在项目中使用redux

增加一下目录:
constants 目录,用来放置所有的 action type 常量
actions 目录,用来放置所有的 actions
reducers 目录,用来放置所有的 reducers
例如实现一个增减计数器:
**1.新增 action type

// src/constants/counter.js
export const ADD = 'ADD'
export const MINUS = 'MINUS'

**2.新增reducer 处理

// src/reducers/counter.js
import { ADD, MINUS } from '../constants/counter'

const INITIAL_STATE = {
  num: 0
}

export default function counter (state = INITIAL_STATE, action) {
  switch (action.type) {
    case ADD:
      return {
        ...state,
        num: state.num + 1
      }
     case MINUS:
      return {
        ...state,
        num: state.num - 1
      }
     default:
       return state
  }
}
// src/reducers/index.js
import { combineReducers } from 'redux'
import counter from './counter'

export default combineReducers({
  counter
})

**3.新增action 处理

// src/actions/counter.js
import {
  ADD,
  MINUS
} from '../constants/counter'

export const add = () => {
  return {
    type: ADD
  }
}
export const minus = () => {
  return {
    type: MINUS
  }
}

// 异步的 action
export function asyncAdd () {
  return dispatch => {
    setTimeout(() => {
      dispatch(add())
    }, 2000)
  }
}

完成了以上步骤才算是集成完毕了,一下是在具体组件中使用方法

五在组件中使用redux

通过 tarojs/redux 提供的 connect 方法将 redux 与我们的页面进行连接

// src/pages/index/index.js
import Taro, { Component } from '@tarojs/taro'
import { View, Text } from '@tarojs/components'
import { connect } from '@tarojs/redux'
import './index.scss'

import { add, minus, asyncAdd } from '../../actions/counter'

@connect(({ counter }) => ({
  counter
}), (dispatch) => ({
  add () {
    dispatch(add())
  },
  dec () {
    dispatch(minus())
  },
  asyncAdd () {
    dispatch(asyncAdd())
  }
}))
class Index extends Component {
  config = {
    navigationBarTitleText: '首页'
  }

  render () {
    return (
      <View className='todo'>
        <Button className='add_btn' onClick={this.props.add}>+</Button>
        <Button className='dec_btn' onClick={this.props.dec}>-</Button>
        <Button className='dec_btn' onClick={this.props.asyncAdd}>async</Button>
        <View>{this.props.counter.num}</View>
      </View>
    )
  }
}

export default Index

⚠️connect 方法接受两个参数 mapStateToProps 与 mapDispatchToProps
mapStateToProps,函数类型,接受最新的 state 作为参数,用于将 state 映射到组件的 props
mapDispatchToProps,函数类型,接收 dispatch() 方法并返回期望注入到展示组件的 props 中的回调方法

本栏目其他文章:
[专栏] taro开发微信小程序

猜你喜欢

转载自blog.csdn.net/museions/article/details/86360474