背景

最近写了半个月的 React 前端,三年没写过 React 前端了,有些生疏了,汇总一下 基于React 前端的 antD 库编写过程中的低级问题吧。

PS 一下,半个月没有发布博客了,C站产品经理又悄默默地改了样式,博客作为已经二十几年的常用功能,动不动就改 UI ,产品经理怎么想的!

碰到的问题汇总如下:

  1. Form.Item 嵌套两个表单,第一个表单是 Switch 时,初始值 checked 不生效问题。
  2. Tree 自定义节点后面的操作通过 titleRender 添加节点的编辑/删除等按钮时,自定义事件和节点本身的选中事件冲突问题。
  3. Tree 在初始化完成后 defaultExpandAll 不生效问题。
  4. TreeSelect 组件传递的数据结构不包含默认的 label 和 value值时,需要配置字段映射。
  5. 构造函数中设置了 state 某个属性a,将该属性传递给子组件后,又在 mounted 的 setState 改属性后子组件获取到仍然是最初绑定的值问题。
  6. 子组件是用 Function 方式定义的,父组件设置 ref 对象后,通过 refs 取到为空的问题。
  7. Form 表单设置 initialValues 初始化值后,调用 resetFields 不能清空表单的问题。

Switch 初始化不生效问题

出现一个问题,一个表单嵌套的表单中,第一个表单的 Switch 选中时显示第二个表单。但是第一个表单初始化值总是不对。

<Form.Itemlabel="开关状态"name="status"rules={[{ required: true, message: '请选择!' }]}><Switch size="large" checked={this.state.checked} onChange={this.changeChecked}/>{this.state.checked ?<Form.Item name="refId" rules={[{ required: true, message: '请选择数据!' }]}><SelectshowSearchallowClearoptionFilterProp="label"placeholder="请选择"options={this.state.options}/></Form.Item>: null}

在第一个 Switch 的 Form.Item 上设置 valuePropName="checked" initialValue={true} 也无效,折中办法是在 Switch 上设置 checked 属性跟页面某状态绑定,绕过表单。

Tree defaultExpandAll 不生效问题

根据官方说法:在异步加载数据时为何不生效?default 前缀属性只有在初始化时生效,因而异步加载数据时 defaultExpandAll 已经执行完成。

你可以通过受控 expandedKeys 或者在数据加载完成后渲染 Tree 来实现全部展开。

解决办法,设置一个异步加载树数据的标识 isInit,完成后再显示树组件:

{this.state.isInit ?<TreedefaultExpandAll={true}onSelect={this.handleClickTree}treeData={this.state.treeData}titleRender={nodeData => this.titleRender(nodeData)}/>: null
}

Tree 自定义 titleRender 操作事件和点击事件冲突问题

上面的代码中自定义了节点渲染函数,额外添加了节点后的几个操作,如查看/编辑/删除等。但是发现按钮操作时,节点自身的 onSelect 事件也被触发了。

解决办法,渲染事件触发时调用 e.stopPropagation() 阻止事件冒泡。

<Menu onClick={(e) => this.handleBatchClick(e, node)}><Menu.Item key="view" >查看</Menu.Item><Menu.Item key="edit" >编辑</Menu.Item><Popconfirm title={<p style={{lineHeight: '25px'}}>确定删除吗?</p>}onConfirm={(e) => this.delete(e,[node.key])}onCancel={(e) => { e.stopPropagation(); }}}okText="删除"okType="danger" ><Menu.Item key="delete">删除</Menu.Item></Popconfirm>       
</Menu>

TreeSelect 组件字段映射配置

Tree 组件的数据的格式「元素结构 {title: "xx", key: "xx", children:[], isLeaf: false} 的数组」和 TreeSelect 的默认数据格式「元素结构是 {label:'', value:'' } 的集合」,两者不一致的,如果两者共用相同的 URL请求,对 TreeSelect 来说存在获取不到选中值的问题。

解决办法,对 TreeSelect 设置 fieldNames 属性完成 label 和 value 的映射。

<TreeSelect treeDefaultExpandAll placeholder={'请选择 '}treeData={this.state.treeData}fieldNames={{label:'title',value:'key'}}/>

setState 修改属性后,子组件 prop 属性通知问题

setState 是异步函数,而子组件渲染时引用的应该是初始化设置的值,如果异步函数中修改了该属性,子组件以及完成渲染了,它获取到的 props 中该属性的值就是最初的值,不能感知到最新的值。

解决办法,各自组件中在 state中维护自身的属性,然后通过父子组件通信完成属性的更新。

  1. 子组件定义时引用的 props 尽量是已经确定的数据,比如在父类构造函数中定义属性时能直接确定的值,就不要再 componentDidMount 中再通过 setState 设置一次了;否则当状态变更时考虑通知子组件。
  2. 父组件通过 ref 调用子组件的方法。
  3. 子组件通过 props 传递的回调函数调用父组件的方法。

基于函数定义的子组件无法通过 Ref对象引用问题

在 React 中,函数组件不能直接接收 ref,因为它们没有实例对象。因此,父组件无法直接通过 ref 获取函数组件的引用。但可以通过以下方式实现类似功能:

✅ 方法一:使用 React.forwardRef 和 useImperativeHandle
这是最推荐的方式,可以确保父组件能够访问子组件的 DOM 元素或方法。
✅ 方法二:使用 ref 回调函数
如果不需要暴露子组件的方法,也可以通过 ref 回调函数间接获取子组件的引用。
✅ 方法三:统一定义为基于Component的组件。

Form 表单初始化和重置问题

Form 表单可以通过 initialValues 初始值,同时表单的 resetFields 是重置为这个初始值的,所以它不能清空表单。

对于返回操作带来的搜索条件,先通过该属性设置初始化值,然后在重置按钮中需要逐个对搜索表单设置为空

handleReset = () => {// 重置操作,是清空整个搜索表单,而 resetFields 是重置为 initialValues 所以需要用 setFieldsValue 逐个重置this.searchFromRef.current.setFieldsValue({c1: '',c2: '',c3: ''});const formData = this.searchFromRef.current.getFieldsValue();this.onFinish(formData);}

启示录

前端编写正反馈还是挺快的,一个增删改查功能的页面能写一周,各种搜索,时间过得也挺快的。除了组件问题外,函数事件,组件定义写写就熟悉了。

有一个感觉就是,mounted 事件动不动就触发了,render 函数不停地被调用。难道一个属性变化,都会触发一次组件重新挂载吗?感觉跟 vue 的不一样呢。

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

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

相关文章

Spring @Scheduled vs XXL-JOB vs DolphinScheduler vs Airflow:任务调度框架全景对比

引言 从单机定时任务到分布式工作流调度&#xff0c;不同场景需要选择匹配的调度框架。 本文对比 Spring Scheduled、XXL-JOB、DolphinScheduler &#xff08;海豚调度器&#xff09;和 Apache Airflow 的核心差异&#xff0c;助你避免过度设计或功能不足。 一、核心定位与适用…

springMVC-10验证及国际化

验证 概述 ● 概述 1. 对输入的数据(比如表单数据)&#xff0c;进行必要的验证&#xff0c;并给出相应的提示信息。 2. 对于验证表单数据&#xff0c;springMVC提供了很多实用的注解, 这些注解由JSR303 验证框架提供. ●JSR 303 验证框架 1. JSR 303 的含义 JSR&#xff0…

OpenCV 滑动条调整图像对比度和亮度

一、知识点 1、int createTrackbar(const String & trackbarname, const String & winname, int * value, int count, TrackbarCallback onChange 0, void * userdata 0); (1)、创建一个滑动条并将其附在指定窗口上。 (2)、参数说明: trackbarname: 创建的…

ReadWriteLock(读写锁)和 StampedLock

1. ReadWriteLock&#xff08;读写锁&#xff09;&#xff1a;实现高性能缓存 总结&#xff1a; 要点 内容 适用场景 读多写少、高并发读取场景&#xff08;如缓存&#xff09; 锁类型 ReadWriteLock接口&#xff0c;ReentrantReadWriteLock实现 读锁 vs 写锁 多线程可…

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…

vue3 el-button 自定义本地图标

设置不生效的原因可能有&#xff1a;1.style标签里没加scoped <style scoped></style>2.本地图片路径指向错误3.自定义图片长宽没设置4.deep深度选择器使用错误&#xff0c;vue3用:deep() <el-tooltip content"重新匹配" placement"top"&g…

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…

6.8 note

paxos算法_初步感知 Paxos算法保证一致性主要通过以下几个关键步骤和机制&#xff1a; 准备阶段 - 提议者向所有接受者发送准备请求&#xff0c;请求中包含一个唯一的编号。 - 接受者收到请求后&#xff0c;会检查编号&#xff0c;如果编号比它之前见过的都大&#xff0c;就会承…

c++ openssl 使用 DES(数据加密标准)进行加密和解密的基本操作

使用 DES&#xff08;数据加密标准&#xff09;进行加密和解密的基本操作&#xff0c;重点展示了 ECB 和 CBC 模式&#xff0c;并且通过篡改密文的方式来进行攻击。下面是对每个部分的详细解析。 1. 结构体 Slip struct Slip {char from[16] { 0 }; // 交易的发起者&#x…

OpenWrt:使用ALSA实现边录边播

ALSA是Linux系统中的高级音频架构&#xff08;Advanced Linux Sound Architecture&#xff09;。目前已经成为了linux的主流音频体系结构&#xff0c;想了解更多的关于ALSA的知识&#xff0c;详见&#xff1a;http://www.alsa-project.org 在内核设备驱动层&#xff0c;ALSA提供…

【.net core】天地图坐标转换为高德地图坐标(WGS84 坐标转 GCJ02 坐标)

类文件 public static class WGS84ToGCJ02Helper {// 定义一些常量private const double PI 3.14159265358979324;private const double A 6378245.0;private const double EE 0.00669342162296594323;// 判断坐标是否在中国范围内&#xff08;不在国内则不进行转换&#x…

Matlab自学笔记五十七:符号运算、可变精度运算、双精度浮点型运算,三种运算精度的概念、比较、选择和应用

1.可变精度算术的概念 默认的&#xff0c;Matlab双精度浮点数使用16位数字精度&#xff0c;而符号数学工具箱的vpa函数&#xff0c;提供了无限大的可变精度&#xff0c;它默认使用32位数字精度&#xff0c;32位指的是有效数字的位数&#xff1b; 2.具体用法 程序示例&#x…

由汇编代码确定switch语句

int switch2(int x) {int result0;switch(x){/* switch语句主体缺失 */}return result; }在编译函数时&#xff0c;GCC为程序的初始部分以及跳转表生成了如下汇编代码。 1 MOVL 8(%ebp), %eax ;x位于相对于寄存器%ebp偏移量为8的地方。 2 ADDL $2, %eax …

java 使用HanLP 入门教程

1. 安装 HanLP Maven 依赖 <dependency><groupId>com.hankcs</groupId><artifactId>hanlp</artifactId><version>portable-1.8.4</version> <!-- 最新版本请查看官网 --> </dependency>注意&#xff1a;portable 版本…

vm虚拟机添加虚拟机无反应,获取所有权

问题描述 虚拟机忘记关机&#xff0c;就把电脑关了&#xff0c;早上打开用不了了&#xff0c;重新添加&#xff0c;也没反应&#xff0c;获取所有权后就没了 问题解决 将虚拟机文件目录下的.lck文件夹&#xff0c;删除&#xff0c;或者改个名&#xff0c;我是改为了.backup方…

为何选择Spring框架学习设计模式与编码技巧?

&#x1f4cc; 结论先行 推荐项目&#xff1a;Spring Framework 推荐理由&#xff1a;设计模式覆盖全面 编码技巧教科书级实现 Java 生态基石地位 &#x1f3c6; 三维度对比分析 维度SpringMyBatisXXL-JOB设计模式⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐代码抽象⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐生态价…

MySQL 索引:聚集索引与二级索引

在数据库性能优化的征途中&#xff0c;索引无疑扮演着至关重要的角色。正确理解和使用索引&#xff0c;能够显著提升查询效率&#xff0c;为应用带来丝滑般的操作体验。今天&#xff0c;我们将深入 MySQL 的心脏&#xff0c;重点探讨 InnoDB 存储引擎中两种核心的索引类型&…

【Elasticsearch】映射:详解 _source store 字段

映射&#xff1a;详解 _source & store 字段 1._source 字段1.1 特点1.2 示例 2.store 字段2.1 特点2.2 示例 3.两者对比3.1 使用建议3.2 实际应用示例 1._source 字段 _source 是 Elasticsearch 中一个特殊的元字段&#xff0c;它存储了文档在索引时的原始 JSON 内容。 …

新建网站部署流程

1. 新建 Node 服务&#xff0c;指定端口并代理前端静态资源 操作步骤&#xff1a; 初始化 Node 项目mkdir my-website && cd my-website npm init -y npm install express创建 app.js&#xff08;示例代码&#xff09;const express require(express); const app e…

时序数据库IoTDB结合SeaTunnel实现高效数据同步

益、基本概念介绍 1.1 Apache IoTDB Apache IoTDB是一款专为工业物联网设计的时序数据库管理系统&#xff0c;集数据收集、存储、管理与分析于一体&#xff0c;满足海量数据存储、高速读取及复杂数据分析需求。其架构包括时序文件&#xff08;TsFile&#xff09;、数据库引擎…