React - Input框绑定动态State和监听onChange事件,输入时失去焦点

React - Input框绑定动态State和监听onChange事件,输入时失去焦点

  • 一. 案例复现
  • 二. 解决方案

一. 案例复现

案例代码如下:

import React, { useState } from 'react';
import { Table, Input } from 'antd';
const Column = Table.Column;
const mockData = [{id: 1,name: 'test1',address: 'address1',
}, {id: 2,name: 'test1',address: 'address2',
}];
const index = () => {const [ data, setData ] = useState(mockData);const handleChange = (event: any, record: any, name: string) => {const currentVal = event.target.value;const { id } = record;const newData = data.map((item: any) => {return {...item,[name]: item.id === id ? currentVal : item[name],};});setData(newData);};const AddressColumn = (props: any) => {const { record } = props;return <Input value={record.address} onChange={event => handleChange(event, record, 'address')} />;};return (<><TablerowKey='id'style={{ width: '100%' }}dataSource={data}><Column title='ID' key='id' dataIndex='id' /><Column title={'name'} key='name' dataIndex='name' render={(val: string, record: any) => {return <Input value={val} onChange={event => handleChange(event, record, 'name')} />;}} /><Column title={'address'} key='address' dataIndex='address' render={(val: string, record: any) => <AddressColumn record={record} />} /></Table></>);
};export default index;

页面如下
在这里插入图片描述
简单画了一个表格:

  1. name列可以修改,并且会动态修改对应的state
  2. address列同理,只不过用的是子组件AddressColumn渲染。

分别尝试在name列以及address列中更改Input框的内容,效果如下:
在这里插入图片描述

仔细观察可以发现:

  1. name列中的文本,可以随意输入,没有任何的限制。
  2. address列中的Input框内容一旦更改,就会失去焦点。

原因如下:

  1. 每次修改address列中的属性,动态修改了state的值。
  2. 组件重新渲染,导致AddressColumn组件也重新渲染。因此会生成一个新的Input框,导致失焦。

二. 解决方案

方式一:就如上述案例一样,采用name列式的写法,即将子组件的内容,提升到父组件中

<Column title={'address'} key='address' dataIndex='address' render={(val: string, record: any) => <AddressColumn record={record} />} />改为
<Column title={'address'} key='address' dataIndex='address' render={(val: string, record: any) => {return <Input value={val} onChange={event => handleChange(event, record, 'address')} />;
}} />

方式二:使用useMemo钩子,封装一下子组件AddressColumn 避免重复渲染。

const AddressColumn = (props: any) => {const { record } = props;return <Input value={record.address} onChange={event => handleChange(event, record, 'address')} />;
};改为
const AddressColumn = useMemo(() => (props: any) => {const { record } = props;return <Input value={record.address} onChange={event => handleChange(event, record, 'address')} />;
}, []);

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

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

相关文章

Ubuntu24.04安装中文输入法

Ubuntu24.04安装中文输入法 为了更好的体验&#xff0c;请访问个人博客 www.huerpu.cc:7000 一、添加中文语言支持 在安装中文输入法之前&#xff0c;首选要添加中文语言支持。选择System&#xff0c;点击Region & Language。 点击Manage Install Languages。 点击Insta…

LLM记录:五一 Llama 3 超级课堂

LLM记录&#xff1a;五一 Llama 3 超级课堂 想玩大模型&#xff0c;自己又没那个环境&#xff0c;参加五一 Llama 3 超级课堂&#xff0c;简单记录一下llama3-8b的相关体验&#xff0c;实在是邀请不到人&#xff0c;还好后面开放了24G显存&#xff0c;好歹模型能跑起来了&…

【C++ 内存管理】深拷贝和浅拷贝你了解吗?

文章目录 1.深拷贝2.浅拷贝3.深拷贝和浅拷贝 1.深拷贝 &#x1f34e; 深拷⻉: 是对对象的完全独⽴复制&#xff0c;包括对象内部动态分配的资源。在深拷⻉中&#xff0c;不仅复制对象的值&#xff0c;还会复制对象所指向的堆上的数据。 特点&#xff1a; &#x1f427;① 复制对…

Wallace树乘法器及Verilog实现

一、Wallace树乘法器 Wallace树乘法器就是将多个部分积进行分组&#xff0c;每三个一组&#xff0c;最后如果剩下的部分积个数不够三个的不做处理&#xff0c;然后将各组的部分积进行相加得到和以及进位信息&#xff0c;直到最终只剩下两行部分积&#xff0c;相加后得到最终结…

CATO原理中的数学与魔术(八)——Royal Hummer及进阶一

在前面3篇文章中&#xff0c;我们重点介绍了Baby Hummer及其拓展&#xff0c;拓展主要从4张的plot和单元素集着两个性质出发&#xff0c;相关内容请戳&#xff1a; CATO原理中的数学与魔术&#xff08;七&#xff09;——Baby Hummer的拓展二 CATO原理中的数学与魔术&#xff0…

【全部更新】2024数维杯A题完整成品代码文章思路结果分享

A题 多源机会信号建模与导航分析 摘要 全球卫星定位系统&#xff08;GPS&#xff09;虽广泛应用于全球定位与导航&#xff0c;但其在室内、隧道以及建筑密集区等复杂环境中的有效性受限。为解决这一局限性&#xff0c;本研究探讨了一种基于机会信号的自主定位导航方法。 机会信…

闭散列哈希表

一、什么是 哈希 &#xff1f; 1.1 哈希概念 与 哈希冲突 在正式介绍闭散列哈希之前&#xff0c;我们需要明确 哈希 的概念。 哈希 &#xff1a;构造一种数据存储结构&#xff0c;通过函数 HashFunc() &#xff0c;使 元素的存储位置 与 其对应的键值 建立一一映射关系&…

GA-CNN-LSTM多输入分类|遗传算法-卷积-长短期神经网络|Matlab

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&am…

el-checkbox选中后的值为id,组件显示为label中文

直接上代码 方法一 <el-checkbox v-for"item in list" :key"item.id" :label"item.id">{{中文}} </el-checkbox> 方法二 <el-checkbox-group class"flex_check" v-model"rkStatusList" v-for"item…

css 案例 横向滚动渐变

效果 完整代码&#xff1a; <template><view class"content"><view class"tab"><view class"tab-item" v-for"(item,index) in tab" :key"index" click"handlerTab(index)":class"ind…

简单的神经网络

一、softmax的基本概念 我们之前学过sigmoid、relu、tanh等等激活函数&#xff0c;今天我们来看一下softmax。 先简单回顾一些其他激活函数&#xff1a; Sigmoid激活函数&#xff1a;Sigmoid函数&#xff08;也称为Logistic函数&#xff09;是一种常见的激活函数&#xff0c…

Ubuntu20.04 设置路由器

1. 网络拓扑图 2. 查看网卡信息 ip a得出如下网卡信息&#xff0c;enp1s0和enp2s0为两个网卡名称&#xff0c;以及相关两个网卡的详细信息&#xff0c;不同设备的网卡名称可能不一样 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group defaul…