【发布时间】:2019-12-10 06:24:10
【问题描述】:
我正在尝试创建一个 8 列表,每列包含 <input /> 元素。出于某种原因,我在文本输入的 on change 事件中遇到了延迟。将列数减少到 4 以下会使体验更好。这可能有点道理,但我也尝试增加列的数量,我发现对于 10 列或更多列,体验再次很棒。您可以查看我的超级简单的 React 应用程序,您可以在其中动态更改列数 - http://com.react.table-with-inputs.s3-website.eu-central-1.amazonaws.com/。
这是我的代码:
import React from 'react';
import { AutoSizer, Table, Column } from 'react-virtualized';
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
numOfCols: '8',
};
}
rowGetter = ({ index }) => {
return { index };
};
renderHeaderCell = ({ label }) => {
return (
<span>{label}</span>
);
};
renderCell = ({ rowIndex, columnIndex }) => {
return (
<input key={`input-${rowIndex}-${columnIndex}`} />
);
};
render() {
return (
<div style={{ display: 'flex', flex: 1, flexDirection: 'column', padding: '10px' }}>
<span>NUMBER OF COLUMNS</span>
<input
value={this.state.numOfCols}
onChange={e => this.setState({ numOfCols: e.target.value })}
/>
<br />
<br />
<AutoSizer style={{ flex: 1 }}>
{({ height, width }) => (
<Table
width={width}
height={height}
estimatedRowSize={36}
overscanRowCount={10}
headerHeight={30}
rowHeight={36}
rowCount={20}
rowGetter={this.rowGetter}
>
{
(() => {
const cols = [];
for (let i = 0; i < parseInt(this.state.numOfCols); i += 1) {
cols.push(
<Column
label={`Title${i + 1}`}
dataKey={`title${i + 1}`}
width={120}
cellRenderer={this.renderCell}
headerRenderer={this.renderHeaderCell}
/>
)
}
return cols;
})()
}
</Table>
)}
</AutoSizer>
</div>
);
}
}
export default App;
编辑 1: 这仅在 Chrome(Mac 和 Windows、桌面和移动设备)上发生。它不会在 Safari 或 Firefox 上重现(不是桌面版,也不是移动版)。
编辑 2:
我试图删除AutoSizer,但没有任何改变。上传了一个更新版本,该版本能够渲染或不渲染 Table 和 AutoSizer 容器 (http://com.react.table-with-inputs.s3-website.eu-central-1.amazonaws.com/)。
【问题讨论】:
-
对我来说,即使 20 列也可以正常工作?
-
我刚刚尝试了您的链接,并快速输入了从 1 到 25 的所有数字。我没有遇到任何渲染延迟。造成问题的环境肯定有其他原因。
-
@TarunLalwani 20 cols 对我来说也很好用,但是在 5 到 9 cols 的情况下,我会延迟输入元素的更改。
-
@MichaelCheng 我在多个操作系统、浏览器等上进行了尝试。您是否将输入一个输入(当您有 8 个列时)与不同网站上的“常规”输入(例如 SO 中的评论框 :) 进行比较?
-
对我来说适用于任意数量的列。您可以运行开发构建并查看所有事件发生的情况吗?