antd table input 失焦的问题

<a name="UYeEu"></a>

背景

隔壁 zym 同事遇到了一个问题,在编辑表格时,每输入一个字符后都会失去焦点,需要重新点击聚焦后才能继续输入,如图:<br />47d1b5ab-38d7-4996-9168-d910423d096e.gif<br /><br /> <a name="xKS8Z"></a>

原因

归根结底,是关于 key 的问题。<br />原先的代码中,components 在 render 中,然而在每次 setState 后都会触发 render,因此相当于每次 components 都是一个新变量、新组件。

1import "./styles.css"; 2import React from "react"; 3import { Table, Input } from "antd"; 4import "antd/dist/antd.css"; 5 6export default class App extends React.Component { 7 state = { 8 tableInput: "", 9 dataSource: [ 10 { 11 name: "blueju", 12 password: "blueju", 13 type: 1 14 } 15 ] 16 }; 17 18 handleInputChange = (e, text, index) => { 19 const dataSource = JSON.parse(JSON.stringify(this.state.dataSource)); 20 dataSource[index].name = e.target.value; 21 this.setState({ 22 dataSource 23 }); 24 }; 25 26 render() { 27 const components = { 28 table(props) { 29 return <table>{props.children}</table>; 30 } 31 }; 32 return ( 33 <div className="App"> 34 <h1>Hello CodeSandbox</h1> 35 <h2>Start editing to see some magic happen!</h2> 36 <Table dataSource={this.state.dataSource} components={components}> 37 <Table.Column 38 dataIndex="name" 39 title="name" 40 render={(text, record, index) => { 41 if (record.type === 1) { 42 return ( 43 <Input 44 // key={index} 45 value={this.state.tableInput} 46 onChange={(e) => { 47 // this.handleInputChange(e, text, index); 48 this.setState({ 49 tableInput: e.target.value 50 }); 51 }} 52 /> 53 ); 54 } 55 if (record.type === 2) { 56 return text; 57 } 58 }} 59 /> 60 </Table> 61 <Input.TextArea 62 value={JSON.stringify(this.state.dataSource, null, 2)} 63 autoSize 64 /> 65 </div> 66 ); 67 } 68}

修改后:

将 components 提到组件外,当然如果不需要被其他组件共享,你也可以提到组件内部。

1import "./styles.css"; 2import React from "react"; 3import { Table, Input } from "antd"; 4import "antd/dist/antd.css"; 5 6const components = { 7 table(props) { 8 return <table>{props.children}</table>; 9 } 10}; 11 12export default class App extends React.Component { 13 state = { 14 tableInput: "", 15 dataSource: [ 16 { 17 name: "blueju", 18 password: "blueju", 19 type: 1 20 } 21 ] 22 }; 23 24 handleInputChange = (e, text, index) => { 25 const dataSource = JSON.parse(JSON.stringify(this.state.dataSource)); 26 dataSource[index].name = e.target.value; 27 this.setState({ 28 dataSource 29 }); 30 }; 31 32 render() { 33 return ( 34 <div className="App"> 35 <h1>Hello CodeSandbox</h1> 36 <h2>Start editing to see some magic happen!</h2> 37 <Table dataSource={this.state.dataSource} components={components}> 38 <Table.Column 39 dataIndex="name" 40 title="name" 41 render={(text, record, index) => { 42 if (record.type === 1) { 43 return ( 44 <Input 45 // key={index} 46 value={this.state.tableInput} 47 onChange={(e) => { 48 // this.handleInputChange(e, text, index); 49 this.setState({ 50 tableInput: e.target.value 51 }); 52 }} 53 /> 54 ); 55 } 56 if (record.type === 2) { 57 return text; 58 } 59 }} 60 /> 61 </Table> 62 <Input.TextArea 63 value={JSON.stringify(this.state.dataSource, null, 2)} 64 autoSize 65 /> 66 </div> 67 ); 68 } 69} 70

修改后效果图:<br />7d1793ef-5f1a-497f-9617-a0ed580f58b2.gif<br />

<a name="QkEUe"></a>

Github

https://github.com/blueju/BlogCodeSandBox/tree/master/input-onblur-in-antd-table

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )