当前位置:网站首页>测试开发【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>
边栏推荐
- Transferrin-modified osthole long-circulating liposomes/PEG-PLGA nanoparticles loaded with notoginsenoside R1 ([email prot
- 【greenDao】Cannot access ‘org.greenrobot.greendao.AbstractDaoSession‘ which is a supertype of
- QoS Quality of Service Eight Congestion Avoidance
- Pt/CeO2单原子纳米酶|[email protected] NPs纳米酶|碳纳米管负载铂颗粒纳米酶|白血病拮抗多肽修饰的FeOPtPEG复合纳米酶
- cordova 安装错误 Command failed: powershell 解决方法
- 【Knowledge Sharing】What is SEI in the field of audio and video development?
- 网络虚拟化
- 1D Array Dynamics and Question Answers
- 优化是一种习惯●出发点是'站在靠近临界'的地方
- 一维数组动态和问题答记
猜你喜欢

常见端口及服务

几行深度学习代码设计包含功能位点的候选免疫原、酶活性位点、蛋白结合蛋白、金属配位蛋白

网络虚拟化

从 Delta 2.0 开始聊聊我们需要怎样的数据湖
[Go WebSocket] 你的第一个Go WebSocket服务: echo server

@Autowired annotation --required a single bean, but 2 were found causes and solutions

电脑如何去掉u盘写保护的状态

苹果字体查找

Optimization is a habit The starting point is to 'stand close to the critical'

QoS Quality of Service Eight Congestion Avoidance
随机推荐
【毕业设计】基于Stm32的智能疫情防控门禁系统 - 单片机 嵌入式 物联网
UE4 - 河流流体插件Fluid Flux
QoS Quality of Service Seven Switch Congestion Management
cordova 安装错误 Command failed: powershell 解决方法
[教你做小游戏] 只用几行原生JS,写一个函数,播放音效、播放BGM、切换BGM
idea汉化教程[通俗易懂]
我们用48h,合作创造了一款Web游戏:Dice Crush,参加国际赛事
YOLOv3 SPP源码分析
皮质-皮质网络的多尺度交流
servlet映射路径匹配解析
Echart饼状图标注遮盖解决方案汇总
MATLAB设计,FPGA实现,联合ISE和Modelsim仿真的FIR滤波器设计
运维面试题(每日一题)
力扣150-逆波兰表达式求值——栈实现
不止跑路,拯救误操作rm -rf /*的小伙儿
关于npm/cnpm/npx/pnpm与yarn
血红素-金纳米颗粒(Heme-AuNP)复合纳米酶|金纳米颗粒核多孔空心碳纳米球壳([email protected])纳米酶
Transferrin-modified vincristine-tetrandrine liposomes | transferrin-modified co-loaded paclitaxel and genistein liposomes (reagents)
七月券商金工精选
铁蛋白颗粒Tf包载多肽/凝集素/细胞色素C/超氧化物歧化酶/多柔比星(定制服务)