小程序——Taro集成dva状态管理工具
一、什么是DvaJs?
dva 首先是一个基于 redux 和 redux-saga 的数据流方案,还额外内置了 react-router 和 fetch,所以也可以理解为一个轻量级的应用框架。
如果你在使用Taro时,用的React语法,那么dva可能是你最好的选择;如果你使用的Vue,那么Vuex就是你的不二选择。
【DvaJs传送门】
二、安装dva
在Taro集成dva时,我们需要安装dva-core和dva-loading
yarn add dva-core dva-loading
// 或者
npm install dva-core dva-loading --svae
三、如何配置
新建src/utils/dva.js
import { create } from "dva-core";
import createLoading from "dva-loading";
let app = {
dispatch: null,
};
let store;
let dispatch;
function createApp(opt) {
app = create(opt);
app.use(createLoading({}));
if (!global.registered) {
opt.models.forEach((model) => app.model(model));
}
global.registered = true;
app.start();
store = app._store;
app.getStore = () => store;
dispatch = store.dispatch;
app.dispatch = dispatch;
return app;
}
export default {
createApp,
getDispatch: () => {
return app.dispatch;
},
};
四、如何使用
- app.js
import React, { Component } from "react";
import { Provider } from "react-redux";
import dva from "@/utils/dva";
import models from "./models/index";
import "./app.scss";
const dvaApp = dva.createApp({
initialState: {},
models,
});
const store = dvaApp.getStore();
class App extends Component {
render() {
return <Provider store={store}>{props.children}</Provider>;;
}
}
export default App;
- 新建src/models/index.js
import Taro from "@tarojs/taro";
import { getUserInfo } from "@/api";
export default {
// 这是模块名
namespace: "global",
// 初始化数据
state: {
userInfo: null
},
// 这里主要调用异步方法
effects: {
*getUserInfo( payload, { call, put }) {
const res = yield call(getUserInfo);
yield put({
type: "setUserInfo",
payload: res,
});
},
},
// 同步方法, 修改state值
reducers: {
setUserInfo(state, { payload }) {
return { ...state, userInfo: payload };
},
},
};
- 组件中调用userInfo
- page/index.js
import { connect } from 'react-redux';
import { View } from '@tarojs/components'
function HomePage (props) {
// dva-loading
// loading状态变化 undefined -> true -> false
// loading在第一次是undefined,所以这里我们默认true,
// 有时候我们需要等state变化以后才加载组件,这就需要我们通过dva-loading去判断
const { userInfo, loading = true } = props;
if(loading) {
return <View>加载中...</View>
}
return (
<View>我的名字是:{userInfo.username}</View>
)
}
export default connect(({ globle, loading })=>({
...globle,
loading: loading.models.global
}))(HomePage)
这里只是简单介绍了下Taro如果集成dva,以及dva简单使用,关于dva更加详细的内容,可以参考官方文档【DvaJs传送门】