当前位置:网站首页>测试开发【Mock 平台】08 开发:项目管理(四)编辑功能和Component抽离
测试开发【Mock 平台】08 开发:项目管理(四)编辑功能和Component抽离
2022-08-10 19:08:00 【InfoQ】
1.项目编辑功能
render: (text, record) => ()
Project(...)
const Project = () => {
// 迁移列到内部,并添加editAction方法透传record
const projectColumns = [
{dataIndex:"id",title:"编号",},
...省略...
{dataIndex:"option",title:"操作",
render: (text, record) => (
<Space>
<a onClick={()=>editAction(record)}>编辑</a>
<a>删除</a>
</Space>
),
},
]
// 定义项目编辑操作,并动态赋值到新的详细项目变量
const [projectInfo, setProjectInfo] = useState({});
const editAction = (record) => {
setProjectInfo(record);
}
}
initialValues
initialValue
// 控制显示编辑项目对话框表单
const [projectEditVisible, setProjectEditVisible] = useState(false);
... 省略部分...
<Modal
id="p_edit"
title="项目修改"
visible={projectEditVisible}
destroyOnClose="true"
onCancel={()=>setProjectEditVisible(false)}
onOk={() => {
// 暂时不实现接口操作,先看交互是否满足
}}
>
<Form
initialValues={projectInfo}
>
<Form.Item name='id' label='编号'>
<Input disabled></Input>
</Form.Item>
<Form.Item
name='name'
label='名称'
rules={[
{
required: true,
message: '项目名称为必填项!',
},
]}
>
<Input placeholder="请输入项目名称"></Input>
</Form.Item>
<Form.Item name='owner' label='负责人'>
<Input placeholder="项目相负责人"></Input>
</Form.Item>
<Form.Item name="desc" label="更多信息">
<TextArea/>
</Form.Item>
</Form>
</Modal>
destroyOnClose

setFieldsValue
const [formEditProject] = Form.useForm();
- //const [projectInfo, setProjectInfo] = useState({});
const editAction = (record) => {
- // setProjectInfo(record);
+ formEditProject.setFieldsValue(record);
setProjectEditVisible(true);
}
<Form
+ form={formEditProject}
- // initialValues={projectInfo}
>
- 定义useForm Hook 并绑定编辑Form;
- 点击编辑按钮无需再赋予projectInfo,直接调用表单setFieldsValue动态赋值。
onOk={() => {
formEditProject
.validateFields()
.then(async (values) => {
const data = {
id: values.id,
name: values.name,
owner: values.owner,
desc: values.desc,
type: 'public',
operator: '大奇'
}
const resp = await saveProduct(data);
if (resp.success) {
formEditProject.resetFields();
setProjectEditVisible(false);
reloadProjectList();
}
})
.catch((info) => {
console.log('修改项目信息失败', info);
});
}}
formEditProject
id: values.id
formEditProject.resetFields();
setProjectEditVisible(false);
console.log('修改项目信息失败', info);

2.编写Component
UpsertProject
import React, { useState } from 'react';
/* 抽离出来的组件,用于优化页面代码 */
const UpsertProject = (props) => {
return (
<>
</>
)
}
export default UpsertProject;
2.1 编码index.jsx
// Components 需要留在上级的变量(重新定义原有的将注释掉)
const [upsertVisible, setUpsertVisible] = useState(false); //控制抽离的组件显隐
const [upsertAction, setUpsertAction] = useState('ADD'); // 标记组件的动作默认增加
const [upsertDetail, setUpsertDetail] = useState({}); // 编辑动作下选择行详细信息
- 原有p_add和p_edit可以全部删掉,使用新的组件
- 新的组件里会用一些变量和方法直接透传
- 修改addAction添加按钮方法逻辑,标记动作为ADD并设置状态显示
- 修改editAction表操作列,标记动作为EDIT,赋值编辑行详细信息,同样设置状态显示
import UpsertProject from "@/pages/Project/components/UpsertProject";
const addAction = () => {
// setProjectVisible(true);
setUpsertAction("ADD");
setUpsertVisible(true);
}
const editAction = (record) => {
// setProjectInfo(record);
// formEditProject.setFieldsValue(record);
// setProjectEditVisible(true);
setUpsertDetail(record);
setUpsertAction('EDIT');
setUpsertVisible(true);
}
return (
<>
<Button
...省略...
>
项目添加
</Button>
{/*原来的增加和修改Modal都可以删掉了, 引入抽离的组件*/}
<UpsertProject
upsertAction={upsertAction}
upsertVisible={upsertVisible}
setUpsertVisible={setUpsertVisible}
upsertDetail={upsertDetail}
reloadProjectList={reloadProjectList}
/>
<Table
...省略...
/>
</>
)
2.2 组件UpsertProject
import React, { useEffect, useState } from "react";
import { Form, Input, Modal } from "antd";
const { TextArea } = Input;
import { saveProduct } from "@/pages/Project/service";
/* 抽离出来的组件,用于优化页面代码 */
const UpsertProject = (props) => {
const [form] = Form.useForm();
// 副作用钩子,给定一个参数,当props内容有变化是执行此Hook
useEffect(()=>{
if(props.upsertAction==='EDIT'){
form.setFieldsValue(props.upsertDetail);
} else {
form.resetFields();
}
},[props]) //
return (
<Modal
title={props.upsertAction==='ADD'?'增加项目':'修改项目'} // 动态判断标题
visible={props.upsertVisible}
destroyOnClose
onCancel={()=>props.setUpsertVisible(false)}
onOk={() => {
form
.validateFields()
.then(async (values) => {
const data = {
id: props.upsertAction==='ADD'? undefined: values.id, // 根据增加还是修改给定id值
name: values.name,
owner: values.owner,
desc: values.desc,
type: 'public',
operator: '大奇'
}
const resp = await saveProduct(data);
if (resp.success) {
form.resetFields(); // 表单清除历史
props.setUpsertVisible(false);
props.reloadProjectList();
}
})
.catch((info) => {
console.log('保存项目信息失败', info);
});
}}
>
<Form form={form}>
{/*通过hidden属性决定是否隐藏此项目,在新增操作时候隐藏*/}
<Form.Item hidden={props.upsertAction==='ADD'} name='id' label='编号'>
<Input disabled></Input>
</Form.Item>
<Form.Item
name='name'
label='名称'
rules={[
{
required: true,
message: '项目名称为必填项!',
},
]}
>
<Input placeholder="请输入项目名称"></Input>
</Form.Item>
<Form.Item name='owner' label='负责人'>
<Input placeholder="项目相负责人"></Input>
</Form.Item>
<Form.Item name="desc" label="更多信息">
<TextArea/>
</Form.Item>
</Form>
</Modal>
)
}
export default UpsertProject;
2.3 集成测试
- Case1: 验证对话框弹出和关闭正常
- Case2: 项目添加表单为空
- Case3: 项目编辑值正确初始化

- Case1: 验证项目新增保存成功
- Case2: 验证项目修改保存成功
- Case3: 保存成功后关闭对话框不刷新项目Table

3. useEffect和hidden
3.1钩子useEffect
componentDidMount
componentDidUpdate
componentWillUnmount
upsertAction
- 如果参数二存放变量,当数组存放变量发生改变时,第一个参数,逻辑处理函数将会被执行;
- 如果参数二不传,浏览器会无线循环执行逻辑处理函数;
- 如果参数二传空数组[],相当于挂在完成后执行一次。
3.2组件隐藏Hidden
const showButton= (state) => {
if (state==='OPEN'){
return <Button type='link'>CLOSE</Button>
} else {
return <Button>OPEN</Button>
}
}
<div>{showButton("OPEN")}</div>
<Form.Item hidden={props.upsertAction==='ADD'} name='id' label='编号'>
<Input disabled></Input>
</Form.Item>
边栏推荐
- 转铁蛋白Tf功能化β-榄香烯-雷公藤红素/紫杉醇PLGA纳米粒/雷公藤甲素脂质体(化学试剂)
- 史上最全GIS相关软件(CAD、FME、Arcgis、ArcgisPro)
- 优雅退出在Golang中的实现
- Optimization is a habit The starting point is to 'stand close to the critical'
- [SemiDrive source code analysis] [MailBox inter-core communication] 52 - DCF Notify implementation principle analysis and code combat
- [教你做小游戏] 只用几行原生JS,写一个函数,播放音效、播放BGM、切换BGM
- What is the upstream bandwidth and downstream bandwidth of the server?
- 巧用RoaringBitMap处理海量数据内存diff问题
- 铁蛋白-AHLL纳米颗粒|人表皮生长因子-铁蛋白重链亚基纳米粒子(EGF-5Cys-FTH1)|铁蛋白颗粒包载氯霉素Chloramphenicol-Ferritin
- 【greenDao】Cannot access ‘org.greenrobot.greendao.AbstractDaoSession‘ which is a supertype of
猜你喜欢
几行深度学习代码设计包含功能位点的候选免疫原、酶活性位点、蛋白结合蛋白、金属配位蛋白
电脑如何去掉u盘写保护的状态
2022杭电多校七 Black Magic (签到)
常见端口及服务
mysql踩坑----case when then用法
主动信息收集
[Natural Language Processing] [Vector Representation] PairSupCon: Pairwise Supervised Contrastive Learning for Sentence Representation
你不知道的浏览器页面渲染机制
(10) Sequence and deserialization of image data
Common ports and services
随机推荐
测试/开发程序员值这么多钱么?“我“不会愿赌服输......
(十二) findContours函数的hierarchy详解
idea汉化教程[通俗易懂]
常用Anaconda安装错误解决办法Traceback (most recent call last):[通俗易懂]
转铁蛋白(Tf)修饰去氢骆驼蓬碱磁纳米脂质体/香豆素-6脂质体/多柔比星脂质体
这7个自动化办公模版 教你玩转表格数据自动化
(十)图像数据的序列与反序列化
【C#】WCF和TCP消息通信练习,实现群聊功能
The Biotin-PEG3-Br/acid/NHS ester/alcohol/amine collection that everyone wants to share
线性结构----链表
[Natural Language Processing] [Vector Representation] PairSupCon: Pairwise Supervised Contrastive Learning for Sentence Representation
mysql----group by、where以及聚合函数需要注意事项
[Teach you how to make a small game] Write a function with only a few lines of native JS to play sound effects, play BGM, and switch BGM
Introduction to 3 d games beginners essential 】 【 modeling knowledge
The servlet mapping path matching resolution
QoS Quality of Service Six Router Congestion Management
【毕业设计】基于Stm32的智能疫情防控门禁系统 - 单片机 嵌入式 物联网
「POJ 3666」Making the Grade 题解(两种做法)
keepalived:故障检测自动修复脚本
Redis 持久化机制