当前位置:网站首页>测试开发【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);
}
}
initialValuesinitialValue // 控制显示编辑项目对话框表单
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
setFieldsValueconst [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);
});
}}
formEditProjectid: values.idformEditProject.resetFields();setProjectEditVisible(false);console.log('修改项目信息失败', info);
2.编写Component
UpsertProjectimport 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
componentDidMountcomponentDidUpdatecomponentWillUnmountupsertAction- 如果参数二存放变量,当数组存放变量发生改变时,第一个参数,逻辑处理函数将会被执行;
- 如果参数二不传,浏览器会无线循环执行逻辑处理函数;
- 如果参数二传空数组[],相当于挂在完成后执行一次。
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>
边栏推荐
- 【自然语言处理】【向量表示】PairSupCon:用于句子表示的成对监督对比学习
- 电脑开不了机是什么原因?
- [Natural Language Processing] [Vector Representation] PairSupCon: Pairwise Supervised Contrastive Learning for Sentence Representation
- 水溶性合金量子点纳米酶|CuMoS纳米酶|多孔硅基Pt(Au)纳米酶|[email protected]纳米模拟酶|PtCo合金纳米粒子
- 30分钟使用百度EasyDL实现健康码/行程码智能识别
- 【CNN】刷SOTA的trick
- Keras深度学习实战(17)——使用U-Net架构进行图像分割
- 【LeetCode】42、接雨水
- Colocate Join :ClickHouse的一种高性能分布式join查询模型
- 从 GAN 到 WGAN
猜你喜欢

idea插件 协议 。。 公司申请软件用

leetcode 84.柱状图中最大的矩形 单调栈应用

Keras deep learning combat (17) - image segmentation using U-Net architecture

Tf铁蛋白颗粒包载顺铂/奥沙利铂/阿霉素/甲氨蝶呤MTX/紫杉醇PTX等药物

Apple Font Lookup

@Autowired注解 --required a single bean, but 2 were found出现的原因以及解决方法

主动信息收集

“2022零信任神兽方阵”启动调研,欢迎各单位填报信息

30分钟使用百度EasyDL实现健康码/行程码智能识别

转铁蛋白(Tf)修饰去氢骆驼蓬碱磁纳米脂质体/香豆素-6脂质体/多柔比星脂质体
随机推荐
3D Game Modeling Learning Route
cordova installation error Command failed: powershell solution
leetcode 85.最大矩形 单调栈应用
2022 Hangdian Multi-School Seven Black Magic (Sign-in)
电脑开不了机是什么原因?
The Biotin-PEG3-Br/acid/NHS ester/alcohol/amine collection that everyone wants to share
QoS Quality of Service Eight Congestion Avoidance
(十二) findContours函数的hierarchy详解
【二叉树】二叉搜索树的后序遍历序列
YOLOv3 SPP source analysis
laya打包发布apk
网络虚拟化
Public Key Retrieval is not allowed(不允许公钥检索)【解决办法】
手把手教你Charles抓包工具使用
Keras deep learning combat (17) - image segmentation using U-Net architecture
力扣18-四数之和——双指针法
whois information collection & corporate filing information
UnitTest中的Path must be within the project 问题
【自然语言处理】【向量表示】PairSupCon:用于句子表示的成对监督对比学习
史上最全GIS相关软件(CAD、FME、Arcgis、ArcgisPro)