写这篇文章主要是将本身学会的知识再表达出来,本身虽然理解了这块知识,可是是否能用本身的话再讲出来,那又是另一种境地,只有能本身讲述后才算完成转化。 传送门react
dva 是阿里体验技术部开发的 React 应用框架,命名是根据守望先锋中的任务D.va而来。 主要用于解决组件之间的通行问题, 在之前react项目中解决数据流问题会引入redux,又因为redux没有异步操做,因此须要引入redux-saga或redux-thunk,这样的缺点就是 引入多个库,导致项目结构复杂。而如今:redux
dva = React-Router + Redux + Redux-sagabash
将上面三个 React 工具库包装在一块儿,简化了 API,让开发 React 应用更加方便和快捷。app
dva的最简结构:框架
import dva from 'dva';
const App = () => <div>Hello dva</div>;
// 建立应用
const app = dva();
app.model(model)
// 注册视图
app.router(() => <App />);
// 启动应用
app.start('#root');
复制代码
state是用于数据存储保存全局状态。view是react组件构成的UI层,当state变化时会触发ui层视图的变化。异步
action是用于描述一个事件的一个对象函数
{
type: 'submit-form-data',
payload: formData
}
复制代码
dispatch则用来发送Action到State工具
connect 是一个函数,绑定 State 到 View,connect 方法返回的也是一个 React 组件,一般称为容器组件,是用于生成State到Prop的映射ui
// 第一种写法这里使用来修饰器@
@connect((state) => {
return {
dept: state.dept,
version: state.version,
};
})
// 第二种写法
connect(({ state}) => ({state}))(App);
复制代码
dva中的model是全部的应用逻辑都定义在里面spa
model的栗子🌰:
export default {
namespace: 'modelName',
state: {
num: 0
},
subscriptions: {
setup({dispatch,history}){
return history.listen(({pathname, query})=>{
dosomething....
})
}
}
effects: {
*addAfter1Second({payload}, { call, put, select }) {
yield call(delay, 1000);
yield put({ type: 'add' , payload: 10});
const num = yield select(state => state.modelNmae.num);
console.log(num)
},
},
reducers: {
add(state, action) {
return{
...state,
num: action.payload
}
},
},
}
复制代码
model对象的属性由namespace,state, effect,reducers,subscriptions组成。
namespace当前 Model 的名称。整个应用的 State,由多个小的 Model 的 State 以 namespace 为 key 合成,当在ui层触发变化时,能够利用namespace来区分触发那个model的方法。从而改变state.
dispatch({
type: 'modelname/add',
payload: 10
})
复制代码
数据保存在state,直接决定了视图层的输出.
effects和reducers都是action的处理器,不一样的是reducers处理的是同步的action,effects处理的是异步的action,effects是基于 redux-saga实现,effect是一个Generator函数,内部使用yield关键字,标识每一步的操做。effect提供了供内部使用的三个方法。
subscriptions通常用于监听路由变化,当知足某些要求时,能够触发一些事件