ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

umi + ts + dva中 model的动态使用

2020-12-30 17:59:15  阅读:428  来源: 互联网

标签:shop const name dva namespace ts state model umi


umi + ts 配合使用 dva model

import { connect } from 'umi' 生效条件

1. model文件需放置在 src/models下

2. umi会识别符合条件的models文件

开启dva: .umirc.ts中配置

export default defineConfig({
  ...,
  dva: {  // 配置自己需要的设置即可
    immer: true,
    hmr: true,
  },
});

model文件:src/models/shop.ts

import { Effect, ImmerReducer, Reducer, Subscription } from 'umi';

const namespace = 'shop'
export const namespace_shop = namespace

interface ModelState {
  name: string;
}

interface ModelsType {
  namespace: typeof namespace;
  state: ModelState;
  effects: {
    query: Effect;
  };
  reducers: {
    save: Reducer<ModelState>;
    // 启用 immer 之后
    // save: ImmerReducer<IndexModelState>;
  };
  subscriptions: { setup: Subscription };
}

const ShopModels: ModelsType = {
  namespace,
  state: {
    name: 'shop',
  },
  effects: {
    *query({ payload }, { call, put }) {
      yield put({
        type: 'save',
        payload: { name: '慧慧' }
      })
    },
  },
  reducers: {
    save(state, action) {
      return {
        ...state,
        ...action.payload,
      };
    },
  },
  subscriptions: {
    setup({ dispatch, history }) {
      return history.listen(({ pathname }) => {
        if (pathname === '/shop') {
          dispatch({
            type: 'query',
          })
        }
      });
    }
  }
};

export default ShopModels;

页面page文件:index.ts

import React, { Component, FC } from 'react';
import { connect, Dispatch, ConnectProps, namespace_shop} from 'umi';
const MODELS_NAME  = namespace_shop

interface PageProps extends ConnectProps {
  name: string;
  loading: boolean;
  dispatch: Dispatch
}

interface PageSate {}

class IndexPage extends Component <PageProps, PageSate> {

  handleChangeName = () => {
    this.props.dispatch({
      type: `${MODELS_NAME}/save`,
      payload: {
        name: 'hahahha'
      }
    })
  }

  render() {
    const { name = '' } = this.props
    return <div onClick={() => this.handleChangeName()} >Hello {name}</div>;
  }
}

const mapState = (state: any) => {
  return {
    ...state[MODELS_NAME],
    loading: state.loading.models[MODELS_NAME]
  }
}
export default connect(mapState)(IndexPage);

 

标签:shop,const,name,dva,namespace,ts,state,model,umi
来源: https://blog.csdn.net/xueer43/article/details/111995522

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有