增加dva models

配置使用dva

在umi@2中要使用dva的功能很简单,只要使用 umi-plugin-react 插件并配置 dva:true 即可。 我们使用create-umi初始化项目的时候,选中了antd和dva功能,在《使用CLI创建初始化项目》这一小节里面。 如果你在创建的时候,没有选中dva功能,或者不确定自己是否选中,你可以打开umi的配置文件。

./umirc.js

  1. // ref: https://umijs.org/config/
  2. export default {
  3. plugins: [
  4. // ref: https://umijs.org/plugin/umi-plugin-react.html
  5. ['umi-plugin-react', {
  6. antd: true,
  7. dva: true,
  8. dynamicImport: false,
  9. title: 'hero',
  10. dll: false,
  11. routes: {
  12. exclude: [],
  13. },
  14. hardSource: false,
  15. }],
  16. ],
  17. }

确认配置表里, dva:true

新增model文件

我们知道umi在使用dva功能时,约定了 ./src/models/ 目录下的js文件,都会被视为全局model,被自动引用,并且可以在任何页面中使用。所以我们在该目录下面新建hero.js 为了防止输入错误,还有简化记忆,我们依旧使用cli来创建model

  1. $ umi g dva:model hero

./src/models/hero.js

  1. export default {
  2. state: 'hero',
  3. subscriptions: {
  4. setup({ dispatch, history }) {
  5. },
  6. },
  7. reducers: {
  8. update(state) {
  9. return `${state}_hero`;
  10. },
  11. },
  12. effects: {
  13. *fetch({ type, payload }, { put, call, select }) {
  14. },
  15. },
  16. }

关于这个文件的详细说明,可以查看导读的《五分钟掌握最小知识体系》 这里需要说明的是,umi约定了如果model中不存在 namespace 将会使用文件名当作该model的namespace。为了不出现错误,应该保持所有的model文件(不管是全局model还是页面model)文件名不同。

在页面中使用model

在这里我们需要引入dva的connet将页面和model绑定在一起,我们稍微改造一下页面的结构。

./src/pages/hero.js

  1. import styles from './hero.css';
  2. import { connect } from 'dva'; ---step1
  3. function Hero(props) { ---step2
  4. console.log(props.hero); ---step4
  5. return (
  6. <div className={styles.normal}>
  7. <h1>Page hero</h1>
  8. <h2>This is {props.hero}</h2>
  9. </div>
  10. );
  11. }
  12. export default connect(({ hero }) => ({ hero }))(Hero); --- step3
  • step1 在文件头部引入了dva的connect
  • step2 把之前的匿名函数,改成实名函数Hero
  • step3 使用connect连接了页面和models
  • step4 从属性中取出namespace为hero的model的state数据。

    这里有一点点绕口,比如我们现在定义的是

    1. state: 'hero',
    2. console.log(props.hero);
    3. hero

    如果定义的是一个对象

    1. state: {
    2. text: 'page work',
    3. list: []
    4. },
    5. console.log(props.hero);
    6. {
    7. text: 'page work',
    8. list: []
    9. }

    编辑完保存,启动umi开发服务器。

WX20181206-212150@2x.png | center | 664x478

同样的方法新建 ./src/models/item.js./src/models/summoner.js 并同步修改 ./src/pages/item.js./src/pages/summoner.js

最终效果

2018-12-06 21.28.23.gif | center | 747x334

最终我们的目录结构

  1. .
  2. ├── app.js
  3. ├── assets
  4. └── yay.jpg
  5. ├── global.css
  6. ├── layouts
  7. ├── index.css
  8. └── index.js
  9. ├── models
  10. ├── hero.js
  11. ├── item.js
  12. └── summoner.js
  13. └── pages
  14. ├── hero.css
  15. ├── hero.js
  16. ├── index.css
  17. ├── index.js
  18. ├── item.css
  19. ├── item.js
  20. ├── summoner.css
  21. └── summoner.js

代码回顾:这节课的全部代码