procomponents组件库采坑日记

ModalForm组件:

const formRef = useRef<any>();<ModalFormkey={51}title='数据仓库'formRef={formRef} // 用于获取表单数据autoFocusFirstInput // 自动对话框打开后,首个表单项自动获得焦点width="33%"modalProps={{ // 扩展ant modal属性destroyOnClose: true, // 关闭时销毁 Modal 里的子元素onCancel: () => setVisible(false), // 取消按钮回调open: visible, // 对话框是否可见afterClose: async () => {const res = await getTreeNodes();if (res.status === 'success') {if (JSON.stringify(res?.data) != '{}') { // 判断数据源是否为空对象setVisible(false);} else {setVisible(true);message.error('请先添加数据源');}}},// 关闭后的回调maskClosable: false, // 点击蒙层是否允许关闭}}onFinish={async (values) => {const res = await getDataSource(dataSourceId);if (res.code === 200) {setVisible(false);// 更新树getTreeData();message.success('切换成功');}}}// 开启grid布局layout="horizontal"grid={true}><ProFormGroup><ProFormSelectkey={52}label="数据源类型"name="originType"placeholder="请选择"rules={[{ required: true }]}labelCol={{ span: 4 }}options={dataType2}initialValue={dataList?.dsType}fieldProps={{onChange: (value, option:any) => {// 通过formRef.current?.setFieldsValue来清除某个表单项的值formRef.current?.setFieldsValue({origin: undefined,});setDatatype3([]);GainDataSource(value);},}}/></ProFormGroup><ProFormGroup><ProFormSelectkey={53}label="数据源"name="origin"placeholder="请选择"rules={[{ required: true }]}labelCol={{ span: 4 }}options={dataType3}initialValue={dataList?.dsName}fieldProps={{onChange: (value, option:any) => {setDataSourceId(value);},}}/></ProFormGroup></ModalForm>

通过 Input 组件实现: 可新增,编辑,删除的tag组件:

// 这里是封装的Tags.tsx组件import {forwardRef, useImperativeHandle, useState} from 'react';
import {Button, Input, message} from "antd";
import { MinusCircleOutlined } from '@ant-design/icons';
import style from './index.less';
import {updateTableTag} from "@/pages/dataDev/metaMgr/service";const Tags = forwardRef((props, ref) => {const [tags, setTags] = useState<any>([]);const [parentTags, setParentTags] = useState<any>();const [tagName, setTagName] = useState<string>(''); // 输入框的值const [show, setShow] = useState<boolean>(true);const [show2, setShow2] = useState<boolean>(true);const [show3, setShow3] = useState<boolean>(false);const [show4, setShow4] = useState<boolean>(false);useImperativeHandle(ref, () => ({showModal: (record: any) => {setParentTags(record);if (record?.tags != null && record?.tags != '') {setTags(record?.tags.split('|'));} else {setTags([]);}}}));/*请求方法*/const Request = async (type:string,id:any,tags:any) => {const res = await updateTableTag({id:id, tags:tags});if (res.code == 200) {if (type == 'add') {message.success('保存成功');} else {message.success('删除成功');}props?.getList(); // 触发父组件的getList方法} else {if (type == 'add') {message.error('保存失败');} else {message.error('删除失败');}}}/*新增*/const addTag = () => {setShow2(false);setShow(false);setShow4(true);/*const newTags: any = {id: new Date().getTime() + 1 + '',name: tagName};*/const newTags: any = tagName;setTags([...tags, newTags]);setTagName('');}/*保存*/const saveTag = async () => {setShow(true);setShow2(true);setShow3(false);setShow4(false);const newTags = tags.filter((item:any) => item !== '');setTags(newTags);Request('add',parentTags?.id,newTags.join('|'));}/*删除*/const deleteTag = (value:any) => {const newTags = tags.filter((item:any) => item !== value);setTags(newTags);Request('delete',parentTags?.id,newTags.join('|'));}/*赋值*/const changeTag = (e:any, value:any) => {const newTags = tags.map((item:any) => {if (item == value) {item = e.target.value;}return item;})setTags(newTags);}/*取消*/const onCancel = () => {setShow(true);setShow2(true);setShow3(false);setShow4(false);const newTags = tags.filter((item:any) => item !== '');setTags(newTags);setTags(parentTags?.tags.split('|')); // 点击取消时, 将父组件的tags值还原}return (<div key={1} style={{margin: '2% 0'}}><div key={2} className={style.box}><span key={3} className={style.tagText}>标签: </span><div key={4} className={style.tagBox}>{tags?.map((item:any,index:any) => {return (<div key={index} style={{position: 'relative', margin: '0 6px'}}><Input key={6} size="small" value={item} disabled={show} style={{width: '100px'}} onChange={(e) => changeTag(e,item) } />{show2 == true ?<MinusCircleOutlined key={7} className={style.mco} onClick={() => {deleteTag(item);}} />: null}</div>)})}<Button key="add" size='small' type="ghost" disabled={show3} onClick={addTag}>+</Button><Button key="submit" size='small' type="dashed" disabled={show4} style={{margin: '0 8px'}} onClick={() => {setShow3(true);setShow(false);}}>编辑</Button><Button key="cancel" size='small' style={{marginRight: '8px'}} onClick={onCancel}>取消</Button><Button key="back" size='small' type="primary" onClick={saveTag}>保存</Button></div></div></div>);
});export default Tags;

 核心代码:

// 因为react跟vue不一样,vue的数据可以双向绑定,但是react不可行,所以这里的input回显之后,再输入的话需要我们再处理一下/*Input赋值*/const changeTag = (e:any, value:any) => { // e.target.value是输入框的值const newTags = tags.map((item:any) => { // item是数组中的每一项if (item == value) { // 如果数组中的某一项等于输入框的值, 就将该项的值改为输入框的值item = e.target.value; // 将输入框的值赋值给数组中的某一项}return item; // 返回数组中的每一项})setTags(newTags); // 将新的数组赋值给tags}
// 父组件中使用 Tags.tsx组件import Tags from './Tags'; // 引入 Tags.tsxconst cRef = useRef<any>(null); // 用于获取子组件实例/*子组件触发*/
const getTags = () => {getTableInfo(tableId);
}// 在需要的地方进行调用
setTimeout(() => { // 这里的定时器是为了解决调用Tags组件时,Tags组件还没有创建,而引发的问题cRef.current?.showModal(res?.data); // 通过ref调用showModal方法,给标签组件传值
}, 50);// getList是父组件传递给子组件的方法 getTags是子组件传递给父组件的方法
<Tags key={50} ref={cRef} getList={getTags} /> 

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

自动生成spring控制器的menu菜单sql

内容为springboot3 生成方式 获取spring 和knife 注解&#xff0c;解析内容&#xff0c;并生成对应sql脚本。 Tag 注解 RequestMapping 注解 Operation 注解 例如&#xff1a;Controller内容 根据以上内容&#xff0c;需要生成菜单sql脚本如下&#xff1a; 执行器代码&…

700MHz设备对广播电视信号的干扰有哪些?

700MHz&#xff0c;由于其较长的波长&#xff0c;良好的传播与覆盖特性&#xff0c;不仅一直被多国用作广播电视信号频率&#xff0c;4G LTE和5G NR也同样看好这一频段&#xff0c;并在此频段上进行了相应的部署和规划。目前已经有超过45个国家和地区&#xff0c;将700MHz频段部…

win11系统内存完整性不兼容驱动程序查找删除教程

近期很多用户都对进行了升级更新&#xff0c;但是出现了很多不兼容的情况&#xff0c;导致内存完整性关闭了&#xff0c;想要开启就需要删除不兼容的驱动程序&#xff0c;关于这个问题&#xff0c;我就来分享查找和删除的方法&#xff0c;希望能够帮助到更多的用户。 当您考虑…

SpringBoot整合EasyExcel实现Excel表格的导出功能

更多SpringBoot轮子导航 SpringBoot项目实现日志打印SQL明细(包括SQL语句和参数)几种方式 SpringBoot中几种好用的代码生成器(基于Mybatis-plus生成entity、mapper、xml等) SpringBoot整合Groovy脚本&#xff0c;实现动态编程 SpringBoot整合ip2region实现使用ip监控用户访问城…

测试必要会的接口测试,不一样的接口测试学完就能涨薪3k。

【文章末尾给大家留下了大量的福利】 requests是基于urllib的HTTP库&#xff0c;可以帮助我们发送各式各样的请求&#xff0c;携带各式各样的参数。 pip install requests 请求 包括&#xff1a; 如何发送不同类型的请求 get post delete put 。。。。 在请求中&#…

第十九节 HTTP 协议

什么是HTTP 协议? 日常我们使用网络用得最多的无疑是在Web 浏览器&#xff08;下文统一使用浏览器&#xff09;上查找资料、看视频、看书、看新闻等等&#xff0c;而在浏览器中只需要输入一些搜索就可以得到想要的信息&#xff0c;这归根于搜索引擎的好处&#xff0c;但是实际…

102.【Redis】

Resies集群 前言(一)、Nosql概述1、为什么要用NoSQL &#xff1f;2、什么是Nosql3、Nosql特点4、Nosql的四大分类5、阿里巴巴数据结构演进 (二)、Redis入门1.概述2.Redis能干什么?3、Redis的特点4、window安装Redis5、Linux安装Redis6、redis-benchmark性能测试7、Redis基础知…

菌子导航系统(持续开发中)

文章目录 菌子导航前言项目架构spring-cloud 和 spring-boot 版本选择使用到的组件&#xff08;依赖&#xff09;架构分层 项目基本功能1 使用Nacos做配置中心2 logback日志3 mybatis-plus操作数据库4 Caffeine 缓存整合5 LocalDateTime 序列化&反序列化6 参数校验快速失败…

狂神Javaweb完整版基础入门(IDEA版)值得学习的JavaWeb教程

Java web Java web 1、基本概念 web开发&#xff1a; web&#xff0c;网页的意思&#xff0c;www.baidu.com静态web html&#xff0c;css提供给所有人看的数据始终不会发生变化&#xff01; 动态web 淘宝&#xff0c;几乎是所有的网站提供给所有的人看的数据始终会变化&…

阿里腾讯“双向奔赴”新进展:互联互通再提速

《中智观察》第1636篇推送 作者&#xff1a;雨涵 编辑&#xff1a;小瑞瑞 头图来源&#xff1a;摄图网 “冬天来了&#xff0c;春天还会远吗”&#xff1f;当推倒了“篱笆墙”&#xff0c;大厂互联互通的“脚步”就在持续向前迈进。 近日&#xff0c;有消息称淘宝开始内测使用微…

【转载】JAVA知识点集锦(中)

这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答&#xff1a;Servlet与CGI的区别在于Servlet处于服务器进程中&#xff0c;它通过多线程方式运行其service()方法&#xff0c;一个实例可以服务于多个请求&#xff0c;并且其实例一般不会销…

B站---【狂神说Java】JavaWeb入门到实战---笔记

该笔记大部分搬运B站遇见狂神说的javaWeb&#xff0c;顺便把图文合并记录&#xff0c;便于回顾 视频地址&#xff1a;https://www.bilibili.com/video/BV12J411M7Sj 记得三连 文章目录 1、基本概念1.1、前言1.2、web应用程序web应用程序&#xff1a;1.3、静态web1.4、 动态web …

关于NoSQL与SQL的区别

转载自&#xff1a;http://blog.csdn.net/xlgen157387/article/details/47908797 云计算背后的秘密&#xff1a;NoSQL诞生的原因和优缺点 我本来一直觉得NoSQL其实很容易理解的&#xff0c;我本身也已经对NoSQL有了非常深入的研究&#xff0c;但是在最近准备YunTable的Chart的时…

Java面试题全集(中)

这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答&#xff1a;Servlet与CGI的区别在于Servlet处于服务器进程中&#xff0c;它通过多线程方式运行其service()方法&#xff0c;一个实例可以服务于多个请求&#xff0c;并且其实例一般不会销…

Node.js(一)——(Node.js安装及使用,通过Node.js搭建服务器,模块化及自定义模块,npm/yarn/nvm,内置模块fs的使用,buffer及stream,新闻列表案例)

目录 1.Node.js介绍 2.安装Node.js 3.使用Node.js实现第一个服务器 3.1初步感受Node.js 3.2Google Chrome 默认非安全端口列表&#xff0c;尽量避免以下端口。 3.3nodemon自动监控服务端更改 4.模块化——Node.js使用commonjs规范 4.1创建自定义模块&#xff08;引入文…

限期解除!要跟乱七八糟的口令说拜拜了

大家好&#xff0c;欢迎来到编程教室~我是Crossin。 这两天有个事关很多人的新闻&#xff1a; 转自 澎湃新闻 https://m.thepaper.cn/baijiahao_14480198 为什么说事关很多人&#xff1f;因为以下这两个场景&#xff0c;想必大家都遇到过&#xff1a; 出现这种情况&#xff0c;…

数据分析与爬虫实战视频——学习笔记(一)(python基础、urllib、超时设置、自动模拟HTTP请求、异常处理、浏览器伪装、代理服务器、新闻爬虫、淘宝登陆和图片爬取)

未经允许&#xff0c;请勿转载。 连载未完成状态 网址&#xff1a; 【数据挖掘】2019年最新python3 数据分析与爬虫实战_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili https://www.bilibili.com/video/av22571713/?p1 目标&#xff1a; 网络爬虫工程师 数据分析&#xff08;数据挖…

从零开始使用深度学习训练一个新闻分类器(干货)

https://mp.weixin.qq.com/s/qR-d9Zay-7NJZgmYYlwn0A?utm_sourcetuicool&utm_mediumreferral 我们在浏览新闻的时候&#xff0c;通常会看到新闻网站对每个新闻都进行了分类&#xff1a; 新闻分类的应用相当广泛。对于网站来说&#xff0c;可以根据你看得较多的新闻类别给你…

跑实验_word2vector词向量实现_基于搜狗新闻预料+维基百科

这篇博客只是记录一下如何解决 跑别人的代码没通的过程。 文章目录 1 运行代码0设备环境1.获取语料库2.语料库预处理3.训练4.开动&#xff01;使用词向量近义词获取某个词语的词向量计算句子相似度词向量加减运算选出集合中不同类的词语 2总结一下经验3补充 1 运行代码 最经在…

web编程项目--新闻网站搭建

文章目录 一、新闻爬取1.爬虫原理2.分析网站链接格式和网页信息格式cheerio爬取新浪新闻爬取人民网新闻央视新闻爬取网易新闻 3.数据库设计4.爬虫具体代码实现5.存储结果展示 二、 网站搭建1.用express构建网站访问mysql2.显示查询结果后端实现前端实现 3.对查询结果进行分页4.…