什么是Dva?
dva 首先是一个基于 redux 和 redux-saga 的数据流方案,然后为了简化开发体验,dva 还额外内置了 react-router 和 fetch,所以也可以理解为一个轻量级的应用框架
官方地址:https://dvajs.com/
// 1.导入dva // 因为dva里面内置了react-router,react,react-Dom,react-saga,react-redux,因此这些都再次导入 import dva,{connect} from 'dva' // 2.创建实例对象 let app = new dva(); let homeModel = { // 指定命名空间区分不同的model namespace:'home', // 保存state中的数据 state: { count: 666 }, // 相当于react-reducer,保存当前命名空间的一个reducer reducers:{ // add是key,相当于一个type // {type:Add, playload} add:(state,action)=>{ return { count: state.count + action.count } }, sub:(state,action)=>{ return { count: state.count - action.count } } } } const mapStateToProps = (state) =>{ return{count: state.home.count} } const mapDispatchToProps = (dispatch) =>{ return { increment(){ dispatch({type:"home/add",count:1}) }, decrement(){ dispatch({type:"home/sub",count:1}) } } } const AdvHome = connect(mapStateToProps,mapDispatchToProps)(Home) //3.定义组件 function Home(props){ return( <div> Home <p>{props.count}</p> <button onClick={()=>props.increment()}>增加</button> <button onClick={()=>props.decrement ()}>减少</button> </div> ) } function App(){ return( <div> <AdvHome/> </div> ) } // 4.注册路由表,告诉dva要渲染那个组件 app.router(()=><App/>); // 相当于react-saga,使用model,告诉dva使用哪个model app.model(homeModel) //5.启动dva并且把它 渲染到index.html的root上 app.start('#root')
运行效果.png
增加.png
减少.png
感觉这个玩意咋说呢,写法有点复杂,但是核心思想很值得借鉴,不过有点耗费时间成本,我今天因为reducers写成了reducer找了半小时bug,差点把我气坏了,主要是也没有任何的报错提示,难怪state中的数字可以显示,但是按按钮一直效果,气死我了