Skip to content

Taro 3.0 使用 dva

第一步,安装依赖

bash
npm install --save dva-core dva-loading
npm install --save redux react-redux @tarojs/redux @tarojs/redux-h5 redux-thunk redux-logger

第二步,创建 dva.js 文件

至于你放哪里这看个人喜欢,我本人喜欢放在 src 根目录下。

javascript
import Taro from '@tarojs/taro'
import {
  create
} from 'dva-core'
// import { createLogger } from 'redux-logger'
import createLoading from 'dva-loading'

let app
let store
let dispatch

function createApp(opt) {
  // redux日志
  // opt.onAction = [createLogger()];
  app = create(opt)
  app.use(createLoading({}))

  // 适配支付宝小程序
  if (Taro.getEnv() === Taro.ENV_TYPE.ALIPAY) {
    global = {}
  }
  // 注入model
  if (!global.registered) opt.models.forEach(model => app.model(model))
  global.registered = true
  app.start()
  // 设置store
  store = app._store
  app.getStore = () => store

  dispatch = store.dispatch

  app.dispatch = dispatch
  return app
}

export default {
  createApp,
  getDispatch() {
    return app.dispatch
  }
}

第三步,创建 models.js

至于你放哪里也看个人喜欢,我本人喜欢放在 models/index.js 下。

javascript
import ...
export default [...] // 导出model数组

// 如
// import home from './home'
// import ...
// export default [home, ...]

第四步,修改 app.js

javascript
import React, { Component } from 'react'
import { Provider } from 'react-redux'
import models from './models';
import dva from './dva'
import './app.scss'

const dvaApp = dva.createApp({
  initialState: {},
  models: models
})

const store = dvaApp.getStore();
console.log(store);

class App extends Component {
  componentDidMount() {}

  componentDidShow() {}

  componentDidHide() {}

  componentDidCatchError() {}

  // this.props.children 是将要会渲染的页面
  render () {
    return (
      <Provider store={store}>
        {this.props.children}
      </Provider>
    )
  }
}

export default App

注意

网上很多教程在这里引入的是 import { Provider } from '@tarojs/redux',请改为 import { Provider } from 'react-redux' 否则会出现一堆错误。

PS:不知道是否2.x版本可以用,反正3.x版本会报错。

第五步,验证

在你需要连接 store 的组件

PS:网上这里引入的是 import { connect } from '@tarojs/redux',这里改为引入 import { connect } from 'react-redux'

javascript
import React from 'react'
import { connect } from 'react-redux'
import { View } from '@tarojs/components'

@connect(({ home }) => ({
  home
}))

const Home = props => {
  const { home } = props
    
  return (
  	<View>{home}</View>
  )
}

Released under the MIT License.