umi中@umijs/plugin-dva的使用,及实现一套增删改

简介: 符合以下规则的文件会被认为是 model 文件:• src/models 下的文件• src/pages 下,子目录中 models 目录下的文件• src/pages 下,所有model.ts 文件(不区分任何字母大小写)

首先创建models文件夹

符合以下规则的文件会被认为是 model 文件:

  • src/models 下的文件
  • src/pages 下,子目录中 models 目录下的文件
  • src/pages 下,所有model.ts 文件(不区分任何字母大小写)

然后在models文件夹写以下代码

import { Effect, ImmerReducer, Reducer, Subscription } from 'umi';
export interface IndexModelState {
  name: string;
}
export interface IndexModelType {
  namespace: 'index';
  state: IndexModelState;
  effects: {
    query: Effect;
  };
  reducers: {
    save: Reducer<IndexModelState>;
    // 启用 immer 之后
    // save: ImmerReducer<IndexModelState>;
  };
  subscriptions: { setup: Subscription };
}
const IndexModel: IndexModelType = {
  namespace: 'index',
  state: {
    name: '',
  },
  effects: {
    *query({ payload }, { call, put }) {},
  },
  reducers: {
    save(state, action) {
      return {
        ...state,
        ...action.payload,
      };
    },
    // 启用 immer 之后
    // save(state, action) {
    //   state.name = action.payload;
    // },
  },
  subscriptions: {
    setup({ dispatch, history }) {
      return history.listen(({ pathname }) => {
        if (pathname === '/') {
          dispatch({
            type: 'query',
          });
        }
      });
    },
  },
};
export default IndexModel;

在.umirc.ts进行开启

dva: {
  immer: true,
}

在其他组件进行使用

import React from 'react';
import { IndexModelState, ConnectRC, Loading, connect } from 'umi';
interface PageProps {
  index: IndexModelState;
  loading: boolean;
}
const IndexPage: ConnectRC<PageProps> = ({ index, dispatch }) => {
  const { name } = index;
  return <div>Hello {name}</div>;
};
export default connect(
  ({ index, loading }: { index: IndexModelState; loading: Loading }) => ({
    index,
    loading: loading.models.index,
  }),
)(IndexPage);

如何实现增删改的一个效果

models.ts文件中写以下代码

import { Effect, ImmerReducer, Reducer, Subscription } from 'umi';
const IndexModel: IndexModelType = {
    namespace: 'index',
    state: {
        todolist: [
            {
                id: 1,
                name: "蜘蛛侠",
                age: 18,
            },
            {
                id: 2,
                name: "钢铁侠",
                age: 18,
            },
            {
                id: 3,
                name: "蝙蝠侠",
                age: 18,
            }
        ],
    },
    effects: {
        *query({ payload }, { call, put }) { },
    },
    reducers: {
        // 启用 immer 之后
        save(state, action) {
            return {
                ...state,
                ...action.payload,
            };
        },
        pushtodolist(state, action) {
            // console.log(state, action);
            state.todolist.push(action.action)
            // return {
            //     ...state,
            //     ...action.payload,
            // };
        },
        deletetodolist(state, action) {
            state.todolist = state.todolist.filter((res, index) => {
                return res.id != action.action
            })
        },
        edittodolistdata(state, action) {
            state.todolist = state.todolist.filter((res, index) => {
                if (res.id == action.action.id) {
                    res.name = action.action.name
                }
                return res
            })
        }
    },
    subscriptions: {
        setup({ dispatch, history }) {
            return history.listen(({ pathname }) => {
                if (pathname === '/') {
                    dispatch({
                        type: 'query',
                    });
                }
            });
        },
    },
};
export default IndexModel;

组价文件中写以下代码

import React, { useState } from 'react'
import { connect } from "umi"
function Index(props: any) {
  // 添加
  function pushtodolist(event: any) {
    if (event.keyCode == 13) {
      let obj: any = {
        id: Date.now(),
        name: event.target.value,
      }
      // console.log(obj);
      props.dispatch({
        type: "index/pushtodolist",
        action: obj
      })
    }
  }
  // 删除
  function deletetodolist(id: any) {
    props.dispatch({
      type: "index/deletetodolist",
      action: id
    })
  }
  // 控制修改变成input的弹出框
  const [editinput, seteditinput] = useState()
  // 修改
  function edittodolist(data: any) {
    console.log(data);
    seteditinput(data.id)
    seteditinputafter(data.name)
  }
  function edittodolistdata(id: any) {
    seteditinput("")
    let obj ={
      id:id,
      name:editinputafter
    }
    props.dispatch({
      type: "index/edittodolistdata",
      action: obj
    })
  }
  // 控制修改之后的值
  const [editinputafter, seteditinputafter] = useState("")
  function onchangetodolist(e: any) {
    seteditinputafter(e.target.value)
  }
  return (
    <div>
      <input type="text" onKeyDown={pushtodolist} />
      {
        props.todolist123.map((res: any) => {
          return <div key={res.id}>{res.name}<button onClick={() => { deletetodolist(res.id) }}>删除</button>
            <button style={{ display: editinput == res.id ? "none" : "" }} onClick={() => { edittodolist(res) }}>修改</button>
            <button style={{ display: editinput == res.id ? "" : "none" }} onClick={() => { edittodolistdata(res.id) }}>确定</button>
            <input style={{ display: editinput == res.id ? "" : "none" }} type="text" defaultValue={res.name} onChange={onchangetodolist} /></div>
        })
      }
    </div >
  )
}
export default connect((state: any) => {
  return {
    todolist123: state.index.todolist
  }
},
)(Index);


相关文章
|
资源调度 前端开发
React npm i @ant-design/ --save无法导入问题
React npm i @ant-design/ --save无法导入问题
203 0
umi项目中使用recoil替换dva
本文介绍使用recoil库来在umi项目中进行组件间的状态共享,部分替换dva的功能。
750 0
|
15天前
|
前端开发 JavaScript 容器
在 vite+vue 中使用@originjs/vite-plugin-federation 模块联邦
【10月更文挑战第25天】模块联邦是一种强大的技术,它允许将不同的微前端模块组合在一起,形成一个统一的应用。在 vite+vue 项目中,使用@originjs/vite-plugin-federation 模块联邦可以实现高效的模块共享和组合。通过本文的介绍,相信你已经了解了如何在 vite+vue 项目中使用@originjs/vite-plugin-federation 模块联邦,包括安装、配置和使用等方面。在实际开发中,你可以根据自己的需求和项目的特点,灵活地使用模块联邦,提高项目的可维护性和扩展性。
|
2月前
vite.config.js中vite.defineConfig is not defined以及创建最新版本的vite项目
本文讨论了在配置Vite项目时遇到的`vite.defineConfig is not defined`错误,这通常是由于缺少必要的导入语句导致的。文章还涉及了如何创建最新版本的Vite项目以及如何处理`configEnv is not defined`的问题。
100 3
vite.config.js中vite.defineConfig is not defined以及创建最新版本的vite项目
|
1月前
|
Android开发
jmessage-react-plugin的正确引入方法
jmessage-react-plugin的正确引入方法
12 1
|
6月前
|
JavaScript
Vite 按需引入 Ant Design Vue 3.0
Vite 按需引入 Ant Design Vue 3.0
|
6月前
|
JavaScript
如何在vue项目中快速导入marked
如何在vue项目中快速导入marked
227 1
|
6月前
umi的函数
umi的函数
52 0
|
前端开发 JavaScript
rollup从0到1将react组件库打包发布npm
rollup从0到1将react组件库打包发布npm记录全过程
627 1
rollup从0到1将react组件库打包发布npm
dva和Umi中两个小用法
dva和Umi中两个小用法
210 0