糾正下,零配置是由umi幫咱們實現的,不是dva幫咱們作的,可是dva-cli在下一個版本(即dva-cli 1.0)已經內置了umi,簡直開發者福音,有興趣朋友能夠體驗下最新版本。html
npm i dva-cli@next -g //安裝下一代dva-cli,內置umi
dva new dvaTest
cd dvaTest
npm start
複製代碼
咱們這裏仍是從最基本的dva開始講起,瞭解流程。重點:dva並無發明新的概念,全都是之前提到的。只是進行了一層封裝,對redux、saga中的概念很清楚的話,dva就是白給你的,沒有難點,不會來找我。前端
因爲dva比較簡單,沒有什麼新概念用例子講解會更明白。最後要實現一個異步獲取數據 num,而後點擊計數器 + num的效果react
import React from 'react';
import dva from 'dva';
import Counter from './Counter';
//dva是一個函數,經過執行它能夠拿到一個app對象
let app = dva();
//一個模板就是一個狀態,而後把reducer和狀態 寫在一塊兒了,
//添加一個模塊
app.model({
xxxx
});
//參數是一個函數,此應用自己就是要渲染函數的返回值
app.router(() => <Counter />);
//本質是啓動應用,就是經過app.router獲取組件,而且經過ReactDOM渲染到容器內容
app.start('#root');
複製代碼
以上是最基本的dva的主入口文件,簡單的3個API,app.model、app.router、app.start,就已經講react、redux-router、redux、redux-saga整合一塊兒,簡直開發者福音。咱們講解下怎麼用git
app.model({
//命名空間。由於一個應用會有不少個模型,每一個模型要有一個名字
namespace: 'counter',
//此命名空間的默認狀態
state: { current: 0, highest: 0 },
//它是用來接收action,修改倉庫狀態的
reducers: {
save(state, action) {
return { current:state.current+action.payload };
}
}
});
複製代碼
看見這些名詞應該很熟悉吧github
在強調遍,dva沒有發明新的概念,只是進行了一層封裝。讓狀態更利於維護express
import React from 'react';
import { connect } from 'dva';
class Counter extends React.Component {
render() {
return (
<div className="container">
<div className="current">
當前記錄:{this.props.current}
</div>
<div className="addButton">
<button onClick={() => this.props.dispatch({ type: 'counter/save',payload:2 })}>+</button>
</div>
</div>
)
}
}
export default connect(
state => {
return state.counter;
}
)(Counter);
複製代碼
不過多解釋,有2個地方須要注意:npm
目前爲止,dva流程已經跑通了,是否是很簡單,咱們測試下是否能點擊加2json
完美實現,說好的異步呢,接下來咱們用express編寫一個簡單接口redux
咱們用express編寫簡單接口,不講解express用法。 express直通車跨域
let express = require('express');
let cors = require('cors'); //解決跨域的包
let app = express();
app.use(cors()); //使用中間件cors
app.get('/amount', function (req, res) {
res.send({ num: 5 });
});
app.listen(3000);
複製代碼
因爲案例比較簡單,都寫在了src/index.js中
function getAmount() {
return fetch('http://localhost:3000/amount', {
headers: {
"Accept": "application/json"
}
}).then(res => res.json());
}
複製代碼
effects: {
//表示這是一個generator effect=redux-saga/effects
*add(action, { call, put }) {
let { num } = yield call(getAmount);
yield put({ type: 'save', payload: num });
}
},
複製代碼
先異步獲取數據,而後再派發動做修改狀態,接着刷新視圖
<button onClick={() => this.props.dispatch({ type: 'counter/save',payload:2 })}>同步加2</button>
<button onClick={() => this.props.dispatch({ type: 'counter/add' })}>異步記數</button>
複製代碼
測試結果
dva 簡化了redux和redux-saga使用上的諸多繁瑣操做,便於咱們開發,可維護性也更高,配合umi使用,號稱零配置,下篇文章會講解dva+umi使用