React + TypeScript + antd 常见开发场景

时间戳转格式


// 获取当前时间戳(示例)
const timestamp = Date.now(); // 或者使用特定的时间戳值// 创建一个新的Date对象,并传入时间戳
const date = new Date(timestamp);// 获取年、月、日的值
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要+1,然后使用padStart方法补零
const day = String(date.getDate()).padStart(2, '0'); // 使用padStart方法补零// 将年、月、日拼接为所需的日期格式
const formattedDate = `${year}-${month}-${day}`;console.log(formattedDate); // 输出:2018-09-12===========================================================方法二const dateString = "Fri Aug 25 2023 14:10:13 GMT+0800 (中国标准时间)";
const regex = /\w{3} (\w{3} \d{2} \d{4}).*/; // 匹配并提取日期部分const match = dateString.match(regex);
const formattedDate = match ? match[1] : "";console.log(formattedDate); // 输出:2023-08-25

禁用的表单

import { Button, Form, Input } from "antd";
import React, { useEffect, useRef } from "react";
const { TextArea } = Input;
const FormPage = () => {const formRef = useRef<any>(null);const data = [{id: 1,num: 10991,name: "黑色耳机",commodityType: "RJ",text: "如果它们不相关,那么存在多个 state 变量是一个好主意,例如本例中的 index 和 showMore。但是,如果你发现经常同时更改两个 state 变量,那么最好将它们合并为一个。",textDate: "2023-10-01 10:36:03",},];// 方法一//   useEffect(() => {//     formRef.current?.setFieldsValue(data[0]);//   }, []);return (<div className="box"><div>{/* 方法二 */}<Button onClick={() => formRef.current?.setFieldsValue(data[0])}>填入内容</Button></div><Formref={formRef}disabledname="basic"labelCol={{ span: 3 }}wrapperCol={{ span: 16 }}><Form.Item label="物品号码" name="num"><Input /></Form.Item><Form.Item label="物品名称" name="name"><Input /></Form.Item><Form.Item label="物品名称(类型)" name="commodityType"><Input /></Form.Item><Form.Item label="物品详细概述" name="text"><TextArea /></Form.Item><Form.Item label="物品录入时间" name="textDate"><TextArea /></Form.Item></Form></div>);
};export default FormPage;

删除多选表格

import React, { useState } from "react";
import { Button, Table, message } from "antd";
import type { ColumnsType } from "antd/es/table";// 可选择删除列表interface DataType {key: React.Key;name: string;age: number;address: string;
}const columns: ColumnsType<DataType> = [{title: "Name",dataIndex: "name",},{title: "Age",dataIndex: "age",},{title: "Address",dataIndex: "address",},{title: "Controls",dataIndex: "Controls",render: () => <Button>显示</Button>,},
];// for (let i = 6; i < 46; i++) {
//   data.push({
//     key: i,
//     name: `Edward King ${i}`,
//     age: 32,
//     address: `London, Park Lane no. ${i}`,
//   });
// }const TablePage: React.FC = () => {/* selectedRowKeys	指定选中项的 key 数组,需要和 onChange 进行配合在此处,通过 rowSelection.selectedRowKeys 来控制选中项。*/const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]);// loading 页面是否加载中const [loading, setLoading] = useState(false);const [data, setData] = useState([{ key: "t", name: "唐诗", age: 18, address: "唐朝" },{ key: "s", name: "宋词", age: 18, address: "宋朝" },{ key: "y", name: "元曲", age: 18, address: "元朝" },{ key: "m", name: "明文", age: 18, address: "明朝" },{ key: "q", name: "清小说", age: 18, address: "清朝" },]);// 点击了清空const start = () => {setLoading(true);// ajax request after empty completingsetTimeout(() => {setSelectedRowKeys([]);setLoading(false);}, 1000);};// onSelectChange 触发了选择改变const onSelectChange = (newSelectedRowKeys: React.Key[]) => {console.log("selectedRowKeys changed: ", newSelectedRowKeys);setSelectedRowKeys(newSelectedRowKeys);};// 开启可选则按钮const rowSelection = {selectedRowKeys,onChange: onSelectChange,};//禁用const hasSelected = selectedRowKeys.length > 0;// 删除const deleteList = () => {console.log(selectedRowKeys);const dataVale = data.filter((item) => !selectedRowKeys.includes(item.key));setData(dataVale);console.log(dataVale);// 提示框message.success("删除成功!");};return (<div><div style={{ marginBottom: 16 }}><Buttontype="primary"onClick={start}disabled={!hasSelected}loading={loading}>清空</Button>{" "}&nbsp;<Button onClick={deleteList}>删除</Button><span style={{ marginLeft: 8 }}>{hasSelected ? `你选择了 ${selectedRowKeys.length}` : ""}</span></div>{/* rowSelection :表格行是否可选择,配置项columns	表格列的配置描述dataSource	数据数组*/}<Table rowSelection={rowSelection} columns={columns} dataSource={data} /></div>);
};export default TablePage;

文字内容


import Button from "antd/lib/button";
import "./index.css";
import { ShareAltOutlined } from "@ant-design/icons";
const TextContent = () => {return (<div className="box"><div className="textContent"><p>1. 当一个组件需要在多次渲染间“记住”某些信息时使用 state 变量。 </p><p>2. Hook 是以 `use` 开头的特殊函数。它们能让你 “hook” 到像 state 这样的 React 特性中。</p></div><br /><div><Button type="primary">提交表单校验 <ShareAltOutlined /></Button></div></div>);
};export default TextContent;
================================================css
.textContent {border: solid 1px #c9c9c9;background-color: #f7f8fa;padding: 10px;width: 680px;
}.textContent p {margin: 0;padding: 0;color: #636364;
}.textContent p:first-child {/* 样式规则 */margin: 0 0 10px 0;
}

筛选对象


const filteredData = Object.fromEntries(Object.entries(dataList).filter(([key, value]) => value !== undefined)
);======================add
specificationModel/create1.  dataLength: 32
1.  goodsSpecificationModel: "2|1|34|wer|we|we|we|we|fg|gf|fgd"
1.  headId: "01H7HWTXWRWJMF6Z30BG556H0T"

自封装表格

import "./index.css";
import React from "react";
import { Switch } from "antd";
import { useState } from "react";const TableModule = () => {const data: any = [{materialNo: "asfcas21345r1c",goodsName: "红茶",codeTs: 11012,antd: "109",},{materialNo: "asfcas21345r1c",goodsName: "鼠标垫",codeTs: 11013,antd: "109",},{materialNo: "asfcas21345r1c",goodsName: "楼房",codeTs: 11014,antd: "109",},];const table = ["商品料号", "商品名称", "商品编码"];//const uniqueData: any = [];const uniqueValues: any = {};for (const obj of data) {const values = Object.values(obj).join("-");if (!uniqueValues[values]) {uniqueValues[values] = true;uniqueData.push(obj);}}console.log(36, uniqueData);return (<div className="box"><div className="table-container"><div className="header-column">{table.map((item, index) => {return (<div key={index} className="header-row">{item}</div>);})}</div>{data.map((item: any) => {return (<div className="data-column" key={item.codeTs}><div className="data-row">{item.codeTs}</div><div className="data-row">{item.goodsName}</div><div className="data-row">{item.materialNo}</div></div>);})}</div></div>);
};export default TableModule;
==============================================css.table-container {box-shadow: 0 0 0 1px #b0b0b0;display: flex;
}.header-column,
.data-column {border-left: 1px solid #b0b0b0;flex: 1;
}.header-row,
.data-row {border-top: 1px solid #b0b0b0;padding: 8px;
}
.header-row {background-color: #efefef;
}.header-row:last-child,
.data-row:last-child {border-bottom: 1px solid #b0b0b0;
}

模态框

import "./index.css";
import React, { useState } from "react";
import { Button, Checkbox, Form, Input, Modal, Select } from "antd";
import { useEffect } from "react";
import { InfoCircleOutlined } from "@ant-design/icons";const { Option } = Select;type FieldType = {username?: string;password?: string;remember?: string;
};const ModalBox: React.FC = () => {const [open, setOpen] = useState(false);const [confirmLoading, setConfirmLoading] = useState(false);const [specification, setSpecification] = useState<any>("");const [form] = Form.useForm();//   const [zf, setZf] = useState("");//   const [energy, setEnergy] = useState("");//   const [dbz, setDbz] = useState("");//   const [tshhw, setTshhw] = useState("");//   const [tang, setTang] = useState("");//   const [na, setNa] = useState("");//   const [wss, setWss] = useState("");const onFinish = (values: any) => {console.log("Success:", values);};const onFinishFailed = (errorInfo: any) => {console.log("Failed:", errorInfo);};const onChangeEnergy = (value: string) => {console.log(value);};const onChangeWss = (value: string) => {console.log(value);};const onValuesChange = (value: any) => {// setZf(value.zf && zf);// setEnergy(value.energy && energy);// setDbz(value.dbz && dbz);// setTshhw(value.tshhw && tshhw);// setTang(value.tang && tang);// setNa(value.na && na);// setWss(value.wss && wss);console.log(50, value);};useEffect(() => {const getFormValueData = () => {};}, [specification]);// 显示模态框const showModal = () => {setOpen(true);};// 点击了确定const handleOk = () => {setConfirmLoading(true);setTimeout(() => {setOpen(false);setConfirmLoading(false);}, 1000);};// 点击了取消const handleCancel = () => {console.log("Clicked cancel button");setOpen(false);};return (<div className="box"><Button type="primary" onClick={showModal}>添加</Button><Modaltitle="申报规范"width={"40%"}open={open}onOk={handleOk}confirmLoading={confirmLoading}onCancel={handleCancel}><div className="modalInputBox"><span>商品信息:</span><Input className="modalInput" disabled value="100237-普洱茶" /></div><div><br /><h3 className="modal-h">规格型号 (根据 LZ 公司规定,需全部填写)</h3><div className="modal-form"><FormlabelCol={{ span: 4 }}wrapperCol={{ span: 19 }}name="basic"initialValues={{ remember: true }}// 提交表单且数据验证成功后回调事件onFinish={onFinish}// 提交表单且数据验证失败后回调事件onFinishFailed={onFinishFailed}autoComplete="off"// 字段值更新时触发回调事件//   onValuesChange={onValuesChange}layout="horizontal"labelWrap><Form.Itemlabel="能量"name="energy"rules={[{ required: true, message: "请填写内容" }]}tooltip={{title: "补充能量,增强体质",icon: <InfoCircleOutlined />,}}><Select onChange={onChangeEnergy} allowClear><Option value="100g">100g</Option><Option value="500g">500g</Option><Option value="1000g">1000g</Option></Select></Form.Item><Form.Itemlabel="蛋白质"name="dbz"tooltip="蛋白质"rules={[{ required: true, message: "请填写内容" }]}><Input /></Form.Item><Form.Itemlabel="脂肪"name="zf"rules={[{ required: true, message: "请填写内容" }]}><Input /></Form.Item><Form.Itemlabel="碳水化合物"name="tshhw"rules={[{ required: true, message: "请填写内容" }]}><Input /></Form.Item><Form.Itemlabel="--糖"name="tang"rules={[{ required: true, message: "请填写内容" }]}><Input /></Form.Item><Form.Itemlabel="钠"name="na"rules={[{ required: true, message: "请填写内容" }]}><Input /></Form.Item><Form.Itemlabel="茶多酚柑皮因子"name="tang"rules={[{ required: true, message: "请填写内容" }]}><Input /></Form.Item><Form.Itemlabel="维生素"name="wss"rules={[{ required: true, message: "请填写内容" }]}><Select onChange={onChangeWss} allowClear><Option value="维生素 A">维生素 A</Option><Option value="维生素 B">维生素 B</Option><Option value="维生素 C">维生素 C</Option></Select></Form.Item><Form.Itemlabel="碳酸氢钠"name="tsqn"rules={[{ required: true, message: "请填写内容" }]}><Input /></Form.Item></Form></div></div><div className="modalInputBox"><br /><span>规格型号:</span><InputclassName="modalInput"disabled// value={//   zf +//   "|" +//   energy +//   "|" +//   dbz +//   "|" +//   tshhw +//   "|" +//   tang +//   "|" +//   na +//   "|" +//   wss// }/></div></Modal></div>);
};export default ModalBox;========================================================css
.modalInputBox {margin: 0 0 0 7%;
}
.modalInput {width: 80%;
}.modal-h {font-weight: 700;
}.modal-form {width: 100%;height: 300px;overflow: auto;border: solid 1px #e0e0e0;padding: 10px;
}/* 修改滚动条轨道的样式 */
::-webkit-scrollbar {width: 10px; /* 设置滚动条的宽度 */
}/* 修改滚动条的滑块样式 */
::-webkit-scrollbar-thumb {background-color: #e0e0e0; /* 设置滚动条滑块的背景色 */border-radius: 5px;
}/* 修改滚动条的滑轨样式 */
::-webkit-scrollbar-track {background-color: #f1f1f1; /* 设置滚动条轨道的背景色 */
}

步骤条

import React from "react";
import { Steps } from "antd";
import { CheckCircleFilled } from "@ant-design/icons";
import "./index.css";
import { useState } from "react";const StepsModule: React.FC = () => {const [editState, setEditState] = useState(false);return (<div className="box"><Stepsdirection="vertical"current={1}size="small"items={[{title: (<divclassName="finishedBox"onClick={() => setEditState(!editState)}><p className="finishedText"><span>审核通过 2023-01-04</span><span className="finishedSpan"></span><span>13:14:35</span></p><pclassName={editState? "finishedCuntent ": "finishedCuntent finishedNone"}>一级审核人员:大河,审核已通过</p></div>),icon: <CheckCircleFilled />,},{title: (<divclassName="finishedBox"onClick={() => setEditState(!editState)}><p className="finishedText"><span>审核通过 2023-01-04</span><span className="finishedSpan"></span><span>13:14:35</span></p><p className="finishedCuntent ">一级审核人员:大河,审核已通过</p></div>),icon: <CheckCircleFilled />,},{title: (<divclassName="finishedBox"onClick={() => setEditState(!editState)}><p className="finishedText"><span>审核通过 2023-01-04</span><span className="finishedSpan"></span><span>13:14:35</span></p><pclassName={editState? "finishedCuntent ": "finishedCuntent finishedNone"}>一级审核人员:大河,审核已通过</p></div>),icon: <CheckCircleFilled />,},]}/></div>);
};export default StepsModule;============================================================css.finishedBox {width: 300px;display: flex;flex-direction: column;padding: 0;margin: 0 0 20px 0;border: solid 1px #1677ff;
}.finishedText {color: #1677ff;font-weight: 500;margin: 5px 5px 5px 10px;
}.finishedSpan {width: 60px;display: inline-block;
}.finishedCuntent {padding: 0 0 5px 10px;margin: 0;
}.finishedNone {display: none;
}

搜索框

import type { ProFormColumnsType } from "@ant-design/pro-components";
import { BetaSchemaForm } from "@ant-design/pro-components";type DataItem = {name: string;state: string;
};const columns: ProFormColumnsType<DataItem>[] = [{valueType: "dependency",name: ["type"],columns: ({ type }) => {return [{dataIndex: "discount",width: "m",},];},},
];const MainPage = () => {return (<><BetaSchemaForm<DataItem>layoutType="QueryFilter"onFinish={async (values) => {console.log(values);}}columns={columns}/></>);
};// export default
export default MainPage;

Tree 树

import React, { useMemo, useState } from "react";
import { Input, Tree } from "antd";
import type { DataNode } from "antd/es/tree";
import "./index.css";const { Search } = Input;const defaultData: DataNode[] = [{key: "adult",title: "成年人",children: [{key: "man",title: "男人",children: [{key: "father",title: "父亲",},],},{key: "woman",title: "女人",children: [{key: "mother",title: "母亲",},],},],},{key: "juveniles",title: "未成年人",children: [{key: "boy",title: "男孩",children: [{key: "son",title: "儿子",},],},{key: "girl",title: "女孩",children: [{key: "daughter",title: "女儿",},],},],},
];const dataList: { key: React.Key; title: string }[] = [];
const generateList = (data: DataNode[]) => {for (let i = 0; i < data.length; i++) {const node = data[i];const { key } = node;dataList.push({ key, title: key as string });if (node.children) {generateList(node.children);}}
};
generateList(defaultData);const getParentKey = (key: React.Key, tree: DataNode[]): React.Key => {let parentKey: React.Key;for (let i = 0; i < tree.length; i++) {const node = tree[i];if (node.children) {if (node.children.some((item) => item.key === key)) {parentKey = node.key;} else if (getParentKey(key, node.children)) {parentKey = getParentKey(key, node.children);}}}return parentKey!;
};const TestPage: React.FC = () => {const [expandedKeys, setExpandedKeys] = useState<React.Key[]>([]);const [searchValue, setSearchValue] = useState("");const [autoExpandParent, setAutoExpandParent] = useState(true);// 展开/收起节点时触发const onExpand = (newExpandedKeys: React.Key[]) => {setExpandedKeys(newExpandedKeys);setAutoExpandParent(false);};//   const onChangeClict = (e) => {//     console.log("触发搜索");//     onChange(e);//   };// 触发搜索const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {const { value } = e.target;const newExpandedKeys = dataList.map((item) => {if (item.title.indexOf(value) > -1) {return getParentKey(item.key, defaultData);}return null;}).filter((item, i, self) => item && self.indexOf(item) === i);setExpandedKeys(newExpandedKeys as React.Key[]);setSearchValue(value);setAutoExpandParent(true);};// 数据const treeDataList = useMemo(() => {const loop = (data: DataNode[]): DataNode[] =>data.map((item) => {const strTitle = item.title as string;const index = strTitle.indexOf(searchValue);const beforeStr = strTitle.substring(0, index);const afterStr = strTitle.slice(index + searchValue.length);const title =index > -1 ? (<span>{beforeStr}<span className="site-tree-search-value">{searchValue}</span>{afterStr}</span>) : (<span>{strTitle}</span>);if (item.children) {return { title, key: item.key, children: loop(item.children) };}return {title,key: item.key,};});return loop(defaultData);}, [searchValue]);return (<div><Searchstyle={{ marginBottom: 8 }}placeholder="搜索"onChange={onChange}/>{/* expandedKeys	(受控)展开指定的树节点onExpand   展开/收起节点时触发autoExpandParent	是否自动展开父节点 */}<TreeonExpand={onExpand}expandedKeys={expandedKeys}autoExpandParent={autoExpandParent}treeData={treeDataList}/></div>);
};export default TestPage;

封装axios

// 封装axios
import axios from 'axios'const instance = axios.create({baseURL: 'http://geek.itheima.net/v1_0/',timeout: 5000
})// 添加请求拦截器
instance.interceptors.request.use(function (config) {// 在发送请求之前做些什么return config},function (error) {// 对请求错误做些什么return Promise.reject(error)}
)// 添加响应拦截器
instance.interceptors.response.use(function (response) {// 对响应数据做点什么return response},function (error) {// 对响应错误做点什么return Promise.reject(error)}
)export default instance

CSS滚动样式

/* 设置滚动条的整体样式 */
::-webkit-scrollbar {width: 10px; /* 滚动条的宽度 */height: 8px;background-color: #f2f2f2; /* 滚动条的背景颜色 */
}/* 设置滚动条的滑块样式 */
::-webkit-scrollbar-thumb {margin: 4px 0;background-color: #d9dadc; /* 滑块的颜色 */border-radius: 5px; /* 滑块的圆角 */
}/* 设置滚动条鼠标悬停时滑块的样式 */
::-webkit-scrollbar-thumb:hover {background-color: #9a9a9a; /* 鼠标悬停时滑块的颜色 */box-shadow: 2px 2px 5px;
}/* 设置滚动条轨道样式 */
::-webkit-scrollbar-track {background-color: #ebebeb; /* 轨道的背景颜色 */
}

Tree

import "./index.css";
import {CarryOutOutlined,CaretDownOutlined,FormOutlined,CheckOutlined,
} from "@ant-design/icons";
import { Select, Switch, Tree } from "antd";
import { useState } from "react";const treeData = [{title: "parent 1",key: "0-0",icon: <CarryOutOutlined />,children: [{title: "parent 1-0",key: "0-0-0",icon: <CarryOutOutlined />,children: [{title: "leaf",key: "0-0-0-0",icon: <CarryOutOutlined />,},{title: (<><div>multiple line title</div><div>multiple line title</div></>),key: "0-0-0-1",icon: <CarryOutOutlined />,},{title: "leaf",key: "0-0-0-2",icon: <CarryOutOutlined />,},],},{title: "parent 1-1",key: "0-0-1",icon: <CarryOutOutlined />,children: [{title: "leaf",key: "0-0-1-0",icon: <CarryOutOutlined />,},],},{title: "parent 1-2",key: "0-0-2",icon: <CarryOutOutlined />,children: [{title: "leaf",key: "0-0-2-0",icon: <CarryOutOutlined />,},{title: "leaf",key: "0-0-2-1",icon: <CarryOutOutlined />,switcherIcon: <FormOutlined />,},],},],},{title: "parent 2",key: "0-1",icon: <CarryOutOutlined />,children: [{title: "parent 2-0",key: "0-1-0",icon: <CarryOutOutlined />,children: [{title: "leaf",key: "0-1-0-0",icon: <CarryOutOutlined />,},{title: "leaf",key: "0-1-0-1",icon: <CarryOutOutlined />,},],},],},
];const Treemodule = () => {return (<div className="box-tree "><TreeshowLine={<CheckOutlined />}defaultExpandedKeys={["0-0"]}switcherIcon={<CaretDownOutlined />}treeData={treeData}/></div>);
};export default Treemodule;

Form

import React from "react";
import "./index.css";
import { Button, Form, Input, Select, Row, Col } from "antd";
import type { FormInstance } from "antd/es/form";const { Option } = Select;const itemLayout = {labelCol: {span: 5,},wrapperCol: {span: 19,},
};const FromE = () => {const formRef = React.useRef<FormInstance>(null);const onGenderChange = (value: string) => {switch (value) {case "male":formRef.current?.setFieldsValue({note: 1111,num: 1001,computeNum: "只",});break;case "female":formRef.current?.setFieldsValue({ note: 2222 });break;case "other":formRef.current?.setFieldsValue({ note: 3333 });break;default:break;}};const onFinish = (values: any) => {console.log(values);};return (<div className="from-box"><Formref={formRef}name="search-form"initialValues={{}}onFinish={onFinish}layout="inline"labelWrap><Row><Col span={8}><Form.ItemclassName="inline-form-item"label="标签1342312312312323"><input className="inline-input" /></Form.Item></Col><Col span={8}><Form.ItemclassName="inline-form-item"label="标签1342312312312323"><input className="inline-input" /></Form.Item></Col><Col span={8}><Form.Item className="inline-form-item" label="标2312312323"><input className="inline-input" /></Form.Item></Col><Col span={8}><Form.Item className="inline-form-item" label="标签13"><input className="inline-input" /></Form.Item></Col><Col span={8}><Form.Item className="inline-form-item" label="标312312312323"><input className="inline-input" /></Form.Item></Col><Col span={8}><Form.Item className="inline-form-item" label="标2323"><input className="inline-input" /></Form.Item></Col></Row></Form></div>);
};export default FromE;

简单 Form

import { Button, Form, Input, Col, Row } from "antd";
import { useRef } from "react";
import "./index.css";
// const { Option } = Select;const FormC = () => {//------------------------------------------dataconst [form] = Form.useForm();const formRef = useRef();const itemLayout = {labelCol: {span: 5,},wrapperCol: {span: 19,},};//------------------------------------------functionconst onFinish = (values) => {console.log("Success:", values);};const onReset = () => {form.resetFields();};//------------------------------------------htmlreturn (<Formform={form}ref={formRef}name="search-form"initialValues={{}}onFinish={onFinish}><Row><Col span={6}><Form.Item name="productId" label="产品ID" {...itemLayout}><Input /></Form.Item></Col><Col span={6}><Form.Item name="productName" label="产品名称" {...itemLayout}><Input /></Form.Item></Col><Col span={6}><Form.Item name="industry" label="所属品类" {...itemLayout}><Input /></Form.Item></Col><Col span={6}><Form.Item name="eqType" label="设备类型" {...itemLayout}><Input /></Form.Item></Col><Col span={6}><Form.Item name="agreeType" label="协议类型21313231" {...itemLayout}><Input /></Form.Item></Col><Col span={6}><Form.Item name="creatTime" label="创建时间" {...itemLayout}><Input /></Form.Item></Col><Col span={6}><Form.Item {...itemLayout}><Button type="primary" htmlType="submit">查询</Button><Button htmlType="button" onClick={onReset}>重置</Button></Form.Item></Col></Row></Form>);
};export default FormC;

表格

import { Table, Button } from "antd";
import "./index.css";
import {useState,forwardRef,useImperativeHandle,useRef,createContext,
} from "react";
import { titleData, mokeData } from "../../moke/index";
import Form from "../form";export const ThemeContext = createContext(null);const Tabulation = forwardRef(({ newValue }, ref) => {const [newMokeData, setNewMokeData] = useState(mokeData);const [ControlsNewValue, setControlsNewValue] = useState();const [echoData, setEchoData] = useState({ciqName: "种用大麦",ciqType: "D/M",codeTs: "1003100000",});const columns = [{title: titleData[0],key: "1",dataIndex: "key",rowScope: "row",width: 100,},{title: titleData[1],dataIndex: "ciqCode",key: "2",width: 200,},{title: titleData[2],dataIndex: "ciqName",key: "3",width: 200,},{title: titleData[3],dataIndex: "ciqType",key: "4",width: 200,},{title: titleData[4],dataIndex: "codeTs",key: "5",width: 200,},{title: titleData[5],dataIndex: "commRate",key: "6",width: 200,},{title: titleData[6],dataIndex: "createTime",key: "7",width: 200,},{title: titleData[7],dataIndex: "createUserId",key: "8",width: 300,},{title: titleData[8],dataIndex: "createUserId",key: titleData[8].length + 1,width: 300,},{title: titleData[9],dataIndex: "dclUnit",key: titleData[9].length + 1,width: 200,},{title: titleData[10],dataIndex: "deleted",key: titleData[10].length + 1,width: 200,},{title: titleData[10],dataIndex: "deleted",key: titleData[10].length + 1,width: 200,},{title: titleData[10],dataIndex: "deleted",key: titleData[10].length + 1,width: 200,},{title: "操作列",key: "operation",fixed: "right",width: 250,render: (id) => (<div><Button onClick={() => viewData(id)}>查看</Button>&nbsp;&nbsp;<Button>修改</Button>&nbsp;&nbsp;<Button type="primary">更多</Button></div>),},];const viewData = (id) => {setEchoData(id);formRef.current.showModal();console.log("ck", id, echoData);};const editMokeData = () => {setControlsNewValue({id: 1,key: Date.now(),...newValue,codeTs: "1003100000",commRate: "null",createTime: 1690334576223,createUserId: "01H321BXCVNJMK38KE3BJ29EKE",createUserName: "张三",dclUnit: "002",deleted: 0,firstUnit: "1009",goodsModel:"0:品牌类型|1:出口享惠情况|2:是否改良种用|3:品种|4:GTIN|5:CAS|6:其他",goodsName: "种用大麦",});console.log(newValue);setNewMokeData([...newMokeData, ControlsNewValue]);};useImperativeHandle(ref, () => ({editMokeData,}));const formRef = useRef(null);return (<ThemeContext.Provider value={echoData}><div className="box"><Tablecolumns={columns}dataSource={newMokeData}scroll={{x: 1300,y: 200,}}/><Form ref={formRef}></Form></div></ThemeContext.Provider>);
});export default Tabulation;

Button

import type { MenuProps } from "antd";
import { Button, Dropdown } from "antd";
import "./index.css";const items: MenuProps["items"] = [{key: "1",label: (<atarget="_blank"rel="noopener noreferrer"href="https://www.antgroup.com"><div className="but">删除</div></a>),},{key: "2",label: (<atarget="_blank"rel="noopener noreferrer"href="https://www.aliyun.com"><div className="but">变更</div></a>),},
];const ButtonModule = () => {return (<div><Button>查看</Button>&nbsp;<Button>修改</Button>&nbsp;<Dropdown menu={{ items }} trigger={["click"]} placement="bottomRight"><Button type="primary">更多</Button></Dropdown>&nbsp;</div>);
};export default ButtonModule;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/45685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构建 NodeJS 影院微服务并使用 docker 部署它(02/4)

一、说明 构建一个微服务的电影网站&#xff0c;需要Docker、NodeJS、MongoDB&#xff0c;这样的案例您见过吗&#xff1f;如果对此有兴趣&#xff0c;您就继续往下看吧。 图片取自网络 — 封面由我制作 这是✌️“构建 NodeJS 影院微服务”系列的第二篇文章。 二、对第一部分的…

商城-学习整理-高级-商城业务-异步线程池(十三)

目录 一、线程1、初始化线程的 4 种方式2、线程池的七大参数3、线程池的运行流程&#xff1a;4、例子5、常见的 4 种线程池6、开发中为什么使用线程池 二、CompletableFuture 异步编排0、业务场景&#xff1a;1、创建异步对象2、计算完成时回调方法3、handle 方法4、线程串行化…

什么是webpack?如何在项目中安装配置webpack?

webpack 是前端项目工程化的具体解决方案。 它提供了友好的前端模块化开发支持&#xff0c;以及代码压缩混淆、处理浏览器端 JavaScript 的兼容性、性能优化等强大的功能。 让程序员把工作的重心放到具体功能的实现上&#xff0c;提高了前端开发效率和项目的可维护性。目前企业…

CSS 字体修饰属性

前言 字体修饰属性 属性说明font-family指定文本显示字体font-size设置字体的大小font-weight设置字体的粗细程度font-style设置字体的倾斜样式text-decoration给文本添加装饰线text-indent设置文本的缩进text-align设置文本的对齐方式line-height设置行高color设置文本的颜色…

会话跟踪Session

前面介绍的时候&#xff0c;我们提到 Session &#xff0c;它是服务器端会话跟踪技术&#xff0c;所以它是存储在服务器端的。而 Session 的底层其实就是基于我们刚才所介绍的 Cookie 来实现的。 1.如果我们现在要基于 Session 来进行会话跟踪&#xff0c;浏览器在第一次请…

阿里巴巴常用的12个后端开发工具

1 阿尔萨斯Java在线诊断工具 Arthas是一款用于Java应用程序的在线诊断工具&#xff0c;由阿里巴巴于2018年9月开源。 典型场景&#xff1a; 您不知道从中加载类的特定JAR包。 您想弄清楚为什么您的系统会抛出各种与类相关的异常。 您不知道为什么修改后的代码无法执行。您不…

Docker实战:docker compose 搭建Redis

1、配置文件准备 redis 配置文件&#xff1a;https://pan.baidu.com/s/1YreI9_1BMh8XRyyV9BH08g2、创建目录并赋权 mkdir -p /home/docker/redis/data /home/redis/logs /home/redis/conf chmod -R 777 /home/docker/redis/data* chmod -R 777 /home/docker/redis/logs*3、re…

css题库

什么是css&#xff1f; CSS 是“Cascading Style Sheet”的缩写&#xff0c;中文意思为“层叠样式表”&#xff0c;它是一种标准的样式表语言&#xff0c;用于描述网页的表现形式&#xff08;例如网页元素的位置、大小、颜色等&#xff09;。 为什么最好把 CSS 的 link 标签放在…

Docker 的基本概念和优势,在应用程序开发中的实际应用。

Docker是一个开源的容器化平台&#xff0c;让开发者能够轻松地打包、运输和运行应用程序。其基本概念包括&#xff1a; 镜像(Image)&#xff1a;一个镜像是一个只读的软件包&#xff0c;它包含了运行应用所需的所有代码、库文件、环境变量和配置文件等。 容器(Container)&…

Nginx转发请求到后端服务报400 Bad Request

问题描述 系统部署好后&#xff0c;进行测试时发现有部分接口出错&#xff0c;项目采用Nginx作为后端代理服务器&#xff0c;有Nginx统一将请求转发到后端的网关服务&#xff0c;再由网关服务路由到具体的服务上&#xff0c;发布好后&#xff0c;大部分接口都是正常的&#xff…

Linux 线程并发运行

一、并发与并行 并行&#xff1a;两个线程在同一时刻同时执行&#xff0c;需要有两个处理器。 并发&#xff1a;两个线程在同一时刻交替执行&#xff0c;只有一个处理器。 并行是一种特殊的并发。 二、线程并发运行 代码如下&#xff1a; 代码分析&#xff1a; 主函数中第…

第 111 场LeetCode 双周赛题解

A 统计和小于目标的下标对数目 数据量小&#xff0c;直接枚举数对 class Solution { public:int countPairs(vector<int> &nums, int target) {int n nums.size();int res 0;for (int i 0; i < n; i)for (int j 0; j < i; j)if (nums[i] nums[j] < tar…

[Go版]算法通关村第十二关青铜——不简单的字符串转换问题

目录 题目&#xff1a;转换成小写字母思路分析&#xff1a;大写字母ASCII码 32 小写字母ASCII码Go代码Go代码-优化: 大写字母ASCII码 | 32 小写字母ASCII码 题目&#xff1a;字符串转换整数&#xff08;atoi&#xff09;思路分析&#xff1a;去除首部空格 明确正负 读取数…

【Spring Boot】详解条件注解以及条件拓展注解@Conditional与@ConditionOnXxx

Spring Conditional Spring 4.0提供的注解。作用是给需要装载的Bean增加一个条件判断。只有满足条件才会装在到IoC容器中。而这个条件可以由自己去完成的&#xff0c;可以通过重写Condition接口重写matches()方法去实现自定义的逻辑。所以说这个注解增加了对Bean装载的灵活性。…

STM32 CubeMX (第四步Freertos内存管理和CPU使用率)

STM32 CubeMX STM32 CubeMX &#xff08;第四步Freertos内存管理和CPU使用率&#xff09; STM32 CubeMX一、STM32 CubeMX设置时钟配置HAL时基选择TIM1&#xff08;不要选择滴答定时器&#xff1b;滴答定时器留给OS系统做时基&#xff09;使用STM32 CubeMX 库&#xff0c;配置Fr…

通过安全日志读取WFP防火墙放行日志

前言 之前的文档中&#xff0c;描写了如何对WFP防火墙进行操作以及如何在防火墙日志中读取被防火墙拦截网络通讯的日志。这边文档&#xff0c;着重描述如何读取操作系统中所有被放行的网络通信行为。 读取系统中放行的网络通信行为日志&#xff0c;在win10之后的操作系统上&am…

高阶数据结构-图

高阶数据结构-图 图的表示 图由顶点和边构成&#xff0c;可分为有向图和无向图 邻接表法 图的表示方法有邻接表法和邻接矩阵法&#xff0c;以上图中的有向图为例&#xff0c;邻接表法可以表示为 A->[(B,5),(C,10)] B->[(D,100)] C->[(B,3)] D->[(E,7)] E->[…

FPGA原理与结构——ROM IP的使用与测试

一、前言 本文介绍Block Memory Generator v8.4 IP核 实现ROM&#xff0c;在学习一个IP核的使用之前&#xff0c;首先需要对于IP核的具体参数和原理有一个基本的了解&#xff0c;具体可以参考&#xff1a; FPGA原理与结构——块RAM&#xff08;Block RAM,BRAM&#xff09;http…

供应链安全和第三方风险管理:讨论如何应对供应链中的安全风险,以及评估和管理第三方合作伙伴可能带来的威胁

第一章&#xff1a;引言 在当今数字化时代&#xff0c;供应链的安全性越来越受到重视。企业的成功不仅仅依赖于产品和服务的质量&#xff0c;还取决于供应链中的安全性。然而&#xff0c;随着供应链越来越复杂&#xff0c;第三方合作伙伴的参与也带来了一系列安全风险。本文将…

C#中的委托

目录 概述&#xff1a; 举例&#xff1a;​ 总结: 概述&#xff1a; 中文的角度来说:指的是把事情托付给别人或别的机构(办理)&#xff0c;造个句子&#xff1a;别人委托的事情&#xff0c;我们一定要尽力而为&#xff0c;不遗余力的去办成。 在C#中&#xff0c;委托是一种…