dva

2019-07-28  本文已影响0人  冷r

介绍

dva 首先是一个基于 reduxredux-saga的数据流方案,然后为了简化开发体验,dva 还额外内置了 react-routerfetch,所以也可以理解为一个轻量级的应用框架。

特性

配置index.js

import dva from "dva";

let app=dva();//创建应用,返回 dva 实例
app.use(hooks);//配置 hooks 或者注册插件。(插件最终返回的是 hooks )
app.model();//注册model
app.router(路由对象);//必须是函数创建的React
app.start("#root");//挂载节点

配置model

export default {
    //    命名空间  以便调用
    namespace: 'home',
    //初始值
    state: {
        list: []
    },
    //用于处理同步操作,可以修改state
    reducers: {
        //save前面调用的一个key值
        save(state, action) {
            state.list = action.payload;
            return {...state };
        }
    },
    //用于处理异步操作和业务逻辑,不直接修改state
    effects: {
        //add 前面调用的一个key值
        * add({ payload }, { call, put }) {
            //第一个参数是接的参数
            //call(函数,传的参数)一般用于请求数据 
            const result = yield call(getlist);
            //put一般调用reducers的方法来修改state里的值
            yield put({ type: 'save', payload: result.data });
        }
    }
};

路由对象

import React from 'react';
import { Router, Switch, Route, Redirect } from 'dva/router';
import RouterView from './router/RouterView';
import routes from './router/routes';

function App({ history }) {
   return (
      <Router history={history}>
         <div className="app">
            <Switch>
              <Route path="/home" component={Home}/>
              <Redirect from="/" to="/home"></Redirect>
            </Switch>
         </div>
      </Router>
   );
}
export default App;

页面

import React, { Component } from 'react';
import { connect } from 'dva';

class Home extends Component {
   componentDidMount() {
      if (this.props.home.list.length > 0) {
         return;
      } else {
        //调用home库里的add方法获取数据
         this.props.dispatch({
            type: 'home/add'
         });
      }
   }
   render() {
      let { list } = this.props.home;
      return (
         <div>
            <div className="main">
               home page
               {list.map(item => {
                  return <div key={item.id} >{item.name}</div>;
               })}
            </div>
         </div>
      );
   }
}
const mapStateToProps = state => {
   console.log(state, 'state');
   return {
      home: state.home
   };
};
export default connect(mapStateToProps)(Home);

connect和redux用法差不多 不同之处dva里的connect一般只需要取数据 修改数据一般调用this.props.dispatch

在使用HashRouter进行开发过程中,会遇到这个问题会报一个警告

Warning: hash history cannot push state it is ignored

hash模式下不能进行push state操作,解决办法是使用1,不使用2

1.this.props.history.push({ pathname: ${url}, state: { nodeType: nodeType }}) //1
2.this.props.history.push(${url}, { nodeType: nodeType }) //2

上一篇下一篇

猜你喜欢

热点阅读