procomponents组件库采坑日记

news2024/12/23 17:49:14

ModalForm组件:

const formRef = useRef<any>();

<ModalForm
        key={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>
          <ProFormSelect
            key={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>
          <ProFormSelect
            key={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.tsx

const 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://www.coloradmin.cn/o/611772.html

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

相关文章

电动力学专题:电磁场规范不变性与规范自由度

对称性&#xff0c;不变性&#xff0c;相对性&#xff0c;协变形 在现代物理学中常常被认为具有相同的含义&#xff08;好拗口&#xff09; 规范与规范的自由度 保证电磁场物理量不改变的情况下&#xff0c;有多组势可供选择&#xff0c;而每组势可以称为一个规范 规范不变性…

linux-动态库制作与使用

​​​​​​(6条消息) linux-静态库制作与使用_云的小站的博客-CSDN博客 目录 创建动态库 使用动态库 根据静态库创建时写的两个源文件&#xff0c;我们来制作动态库 创建动态库 根据这2个源文件和2个头文件我们来学习制作动态库。 我们先让编译两个源文件成.o文件,注意要…

vite技术揭秘--环境变量

目录 环境变量 生产环境替换 自定义环境变量 .env 文件 环境加载优先级 自定义环境变量 模式 TypeScript 的智能提示 在node环境里使用环境变量 前言 我们开发中不可避免的要根据环境变量来做一些逻辑分支&#xff0c;在vite中有两种实现方式&#xff0c;即define和.env…

MIT6.824 lab 1 小白实现过程

1.总体思路 构建一个简单的MapReduce系统&#xff0c;Coordinator线程用于分配任务&#xff08;包括Map任务和Reduce任务&#xff09;&#xff0c;Worker线程向Coordinator线程请求任务&#xff0c;要求所有map任务完成后才可以请求到reduce任务&#xff0c;否则的话这个worker…

Springboot +spring security,基于默认数据库模型实现授权

一.简介 上一篇文章中讲解了如何基于内存模型来实现授权&#xff0c;在这种模型里&#xff0c;用户的信息是保存在内存中的。但是&#xff0c;保存在内存中的信息&#xff0c;是无法持久化的&#xff0c;也就是程序一旦关闭&#xff0c;或者断电等情况发生&#xff0c;内存中的…

0基础学习VR全景平台篇第36篇:场景功能-导览

大家好&#xff0c;欢迎观看蛙色VR官方系列——后台使用课程&#xff01; 本期为大家带来蛙色VR平台&#xff0c;场景管理—导览功能操作。 功能位置示意 一、本功能将用在哪里&#xff1f; 导览&#xff0c;指给VR漫游作品预先设置好路线&#xff0c;并且可以自定义路线的旋…

DMBOK知识梳理for CDGA/CDGP——第三章数据治理

关 注gzh“大数据食铁兽” 回复“知识点”获取《DMBOK知识梳理for CDGA/CDGP》常考知识点&#xff08;第三章数据治理&#xff09; 第三章 数据治理 第三章在是CDGA|CDGP考试的重点考核章节之一&#xff0c;知识点比较密集&#xff0c;本章重点为语境关系图及数据治理概念…

初心不改凌云志 热血浇灌信仰花 《凭栏一片风云起》湖北卫视热力开播

浮光灼夏 御风而行&#xff0c; 由著名导演金琛执导&#xff0c; 胡一天、章若楠、王劲松 张晞临、张赫、林子璐领衔主演&#xff0c; 高伟光特邀出演的 年代战争剧《凭栏一片风云起》&#xff0c; 将于今晚19:30起&#xff0c; 登陆【湖北卫视】长江剧场。 电视剧《凭栏…

音乐人解密:究竟是如何一步一步成为音乐人的?

音乐人解密&#xff1a;究竟是如何一步一步成为音乐人的&#xff1f; 音乐是人类伟大的产物&#xff0c;近些年来越来越多的人都开始尝试学习音乐&#xff0c;成为一名音乐人。而艺术高考等途径也为许多想要学习音乐、成为职业歌手或者编曲师的人群提供了途径。然而想要成为一名…

初识EasyUI

2.1何为EasyUI. EasyUI的全称是“JQuery EasyUI”&#xff0c;是一种基于jQuery、Angular、Vue和React的用户界面的插件的集合&#xff0c;EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面。开发者不需要编写复杂的javascript&#xff0c;也不需要对css样…

【Protobuf速成指南】Win/Centos7下Protobuf安装教程

文章目录 安装教程一、Windows1.1 下载编译器1.2 配置PATH1.3 其他依赖项 二、Centos72.1 安装必要的工具2.2 下载安装包2.3 安装 安装教程 以版本为V21.11为例说明 一、Windows 1.1 下载编译器 下载地址&#xff1a;链接&#xff0c;一直往下翻找到 V21.11版本 win用户根据…

火爆全网,最全性能测试从0到1进阶总结,高阶内卷学习路线...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 例如&#xff1a;…

ArduPilot飞控开源代码之滤波设置

ArduPilot飞控开源代码之滤波设置 1. 源由2. 原理3. 调优3.1 ACC低通滤波 INS_ACCEL_FILTER3.2 GRYO低通滤波 INS_GYRO_FILTER3.3 陷波滤波 INS_HNTCH_ENABLE & INS_HNTC2_ENABLE 4. 总结5. 参考资料 1. 源由 对于飞控传感器来来说&#xff0c;振动噪声也是数据。 单纯从数…

yolov3

文章目录 前言一、主干网络darknet53二、从特征获取预测结果 前言 本文主要讲解yolov3的基本知识&#xff0c;如有错误请指出。 本文主要来自 博客1 博客2 一、主干网络darknet53 53是因为有53层。 1、darknet53没有使用pooling 来进行下采样&#xff0c;而是用一个33&…

电脑数据隐藏原因有哪些?电脑里隐藏的数据怎么恢复

电脑里隐藏的数据怎么恢复&#xff1f;电脑中的数据很容易被隐藏&#xff0c;这时候很多人可能会感到焦急和无助。不过不用担心&#xff0c;本文将为大家介绍三种方法&#xff0c;让你轻松找回被隐藏的数据&#xff01; ※电脑数据隐藏原因有哪些 电脑数据可能会隐藏&#xf…

100天精通Golang:全面掌握Go语言的旅程

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

QLoRA:量化 LLM 的高效微调

此 repo 支持论文“QLoRA&#xff1a;量化 LLM 的高效微调”&#xff0c;旨在使对 LLM 研究的访问民主化。 QLoRA 使用bitsandbytes进行量化&#xff0c;并与 Hugging Face 的PEFT和transformers库集成。QLoRA 由华盛顿大学 UW NLP 小组的成员开发。 概述 我们介绍了 QLoRA&…

volatile - (C语言)

volatile关键字和const一样都是一种类型修饰符&#xff0c;用它修饰过的变量表示可以被某些编译器未知的因素更改&#xff0c;比如操作系统、硬件或者是其它线程等。 该关键字是不希望被编译器优化&#xff0c;从而达到稳定访问内存的目的。 示例代码&#xff1a; #include&…

FlinkUI和Flink常见问题解决

Flink 系统架构/Flink 作业提交运行的原理 我们编写的代码,对应着在Flink集群上执行的一个作业;所以我们在本地执行代码, 其实是idea开发环境中根据引入的依赖,先模拟启动一个Flink集群,然后把我们代码中定义好的操作,作为"作业",(job要打包好)然后将作业提…

双出口网络链路和设备双冗余案例

1、AR3模拟联通和电信运营商 2、2台防火墙vrrphrp双冗余&#xff0c;下联局域网vrrp 10.3.0.3地址&#xff0c;上联两条外线每条外线都分别vrrp虚拟一个地址1.1.1.1.和2.2.2.2.1。 3、防火墙外线地址和运营商给的外线地址不在同一个网段&#xff0c;每条都用vrrp冗余链路&#…