dva+umi+antd項目從搭建到使用

先建立一個新項目,具體步驟請參考http://www.javashuo.com/article/p-zrkjfapr-dm.htmlcss

一.添加document.ejs文件(參考文檔:https://umijs.org/zh/guide/app-structure.html#src-pages-document-ejs
在pages文件夾下建立document.ejs文件,有這個文件時,會覆蓋默認的 HTML 模板。
模板裏需至少包含根節點的 HTML 信息  <div id="root"></div>html

二.刪除umirc.js文件(參考文檔:https://umijs.org/zh/config/
config/config.js 和 .umirc.js只能存在一個.因此咱們刪除.umirc.js文件,使用本身配置的config.js
在根目錄建立config/config.js
config.js文件的具體配置能夠查閱官方文檔
config.js裏面設置路由:
默認狀況下,pages文件目錄就是路由。配置的話須要在config.js裏面,以下:(注意:component 是相對於 src/pages 目錄的)react

export default {
  outputPath:'./content',
  treeShaking: true,

  ... 

  history: 'hash', // 默認是 browser
  routes: [ // 自定義路由
    {
      title:'',
      path: '/',
      component:'./layouts/root',
      routes: [
        {
          title:'login',
          path: '/',
          component:'./login/login', //component 是相對於 src/pages 目錄的
        },
        {
          path: '/manage', component: './layouts/manage',
          routes: [
            { path: '/manage', component: './manage/query',title:'首頁' }
          ],
        }
      ]
    }
  ]
}

 

三.添加模板文件夾layouts
刪除根目錄下的layouts文件夾,在pages文件夾下新增layouts文件夾,而且增長root.js和manage.js
root.js最外層的路由。manage.js是登錄有有導航菜單的路由redux

 

圖一是默認的目錄,圖二是自定義後的目錄:
圖一​        圖二 antd

 

使用的話就更簡單了:
有以下目錄pages/login.js,models/login.js
model/login.js代碼以下:app

import { login } from '../services/query';
import router from 'umi/router';

export default {
  namespace: 'login', /// namespace 表示在全局 state 上的 key
  state: {
    userinfo:null
  },
  reducers: { //reducers 等同於 redux 裏的 reducer,接收 action,同步更新 state
    suerinfoRenducers(state,{ payload }){
      return {
        ...state,
        userinfo:payload
      }
    }
  },
  effects:{
    * login({ payload }, { call, put, select }) {
      const response = yield call(login, payload?payload:'');    
      yield put({ 
        type: 'suerinfoRenducers',
        payload:response
      })
    }
  }
};

 

pages/login.js代碼以下:ide

import React from 'react';
import style from './login.css';
import { connect } from 'dva/index';

class Login extends React.Component {
  login() {
    // 調用login命名空間下的login方法
    this.props.dispatch({
      type: 'login/login',
      payload: {},
    });
  }
  render() {
    return (
      <div className={style.login}>
        ...
        <button onClick={() => this.login()}>登錄</button>
      </div>
    );
  }
}


const mapStateUsers = (state) => {
  return {
    login: state.login, //這裏的login表示後面用this.props.login獲取state(根節點)中login命名空間(model的login.js中的state全部數據)的數據
  };
};
export default connect(mapStateUsers)(Login);

 

此時訪問login頁面,點擊登錄按鈕,就會出發login方法啦!ui

 

umi中使用loading:
@connect(({loading}) => ({ loading })) 
添加了@connect(({loading}) => ({ loading })) 修飾器後,就打印出this.props就能夠看到有loading了
this

effects下面就是對應的請求,(能夠打印this.props.loading.effects['login/login']的值看下結果)
login/login發起請求的前this.props.loading.effects['login/login']的值爲true,
login/login請求完成後this.props.loading.effects['login/login']的值就變爲false

具體使用以下:spa

...
import { Pagination,Spin,Alert } from 'antd';

@connect(({loading}) => ({
  loading
}))
class Login extends React.Component {
  login() {
    // 調用login命名空間下的login方法
    this.props.dispatch({
      type: 'login/login',
      payload: {},
    });
  }
  render() {
    return (
      <div className={style.login}>
        <Spin spinning={this.props.loading.effects['login/login']}>
          <Alert
            message="Alert message title"
            description="Further details about the context of this alert."
            type="info"
          />
        </Spin>
        ...        
        <button onClick={() => this.login()}>登錄</button>
      </div>
    );
  }
}

...

好啦,就是這麼簡單!

相關文章
相關標籤/搜索