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);


相关文章
|
Windows
windows开启路由转发
windows开启路由转发
1793 0
|
JSON JavaScript 前端开发
Vue项目使用mock数据的几种方式
Vue项目使用mock数据的几种方式
|
存储 前端开发
react-几步搞定redux-persist-持久化存储
其实在vuex-persist持久化,用的也是这个东西 这个东西 就是持久化,其实所谓的持久化,在前端而言,一般都是指存储到 localStorage里面,因为刷新也还在嘛,不像存在其他地方刷新就没了,这里不讨论存储到本地文件 我们在react再玩一遍,看看有啥不同,找点新鲜感
1275 0
react-几步搞定redux-persist-持久化存储
|
缓存 前端开发 JavaScript
浅浅阅读umi中InitialState插件源码 - 杨磊
InitialState插件源码的简要介绍
1223 0
浅浅阅读umi中InitialState插件源码 - 杨磊
|
前端开发 小程序
【微信小程序-原生开发】实用教程20 - 生成海报(实战范例为生成活动海报,内含生成指定页面的小程序二维码,保存图片到手机,canvas 系列教程)
【微信小程序-原生开发】实用教程20 - 生成海报(实战范例为生成活动海报,内含生成指定页面的小程序二维码,保存图片到手机,canvas 系列教程)
684 0
|
12月前
|
JavaScript
JS中的splice的三种用法(删除,替换,插入)
JS中的splice的三种用法(删除,替换,插入)
968 4
|
网络协议 Go C语言
在golang中调试时的指令和使用技巧
【7月更文挑战第4天】 本文介绍 Go调试工具`dlv`常用命令概览及其使用技巧。
516 2
在golang中调试时的指令和使用技巧
|
存储 小程序 JavaScript
【微信小程序】-- 全局数据共享 - MobX(四十三)
【微信小程序】-- 全局数据共享 - MobX(四十三)
Vue3——tdesign-vue-next如何按需加载动态渲染ICON
如题,在vue3中进行按需加载来动态的渲染icon图标;
384 1
|
人工智能 搜索推荐 算法
智能之网:AI在互联网技术中的应用与挑战
本文深入探讨了人工智能(AI)如何革新互联网技术,提升用户体验,并优化数据处理流程。通过分析AI在搜索引擎、社交媒体、网络安全以及个性化服务中的实际应用,揭示了AI技术带来的便捷与效率。同时,文章也未忽视伴随技术进步而来的隐私保护、算法偏见和人机关系等挑战,为读者提供了一个全面而深刻的视角。