React-Table 在选择时重新渲染整个表

IT技术 javascript reactjs react-table
2021-05-19 04:52:27

我有一个相对标准的react表,其中的行可以选择 - 使用 HOC SelectTable 实现,很像react表提供的示例:

https://github.com/tannerlinsley/react-table/blob/v6/docs/src/examples/selecttable/index.js

主要区别是我的一列是自定义组件:

 const columns = [
      {
      ...other columns...
      {
        Header: "Sound file",
        accessor: "sound_file",
        Cell: props => {
          return <SoundFilePlayer url={props.row.sound_file_url} />;
        },

        minWidth: 80
      }
    ];

SoundFilePlayer组件是一个react-player组件,它播放作为props传递到组件中的声音文件。本质上它加载传入的 URL 并呈现一个声音播放器:

加载 url 之前(持续时间默认为 0:00)

在此处输入图片说明

然后在加载后以正确的持续时间渲染:

在此处输入图片说明

我面临的问题是,每当在我的表格中选择一行时,整个表格都会重新呈现(如果没有声音播放器,那就没问题了)——这意味着声音文件播放器会重置回 0:00 持续时间然后以正确的持续时间再次重新加载。这发生在每一行。

我的猜测是检查所有行的键以查看它们当前是否被选中,从而导致重新呈现整个表。

无论如何我只重新渲染选定的行 - 而不是整个表?我查看了https://reactjs.org/docs/state-and-lifecycle.html 以及其他一些 SO 帖子,但似乎不能只重新渲染受影响的行。或者甚至只是重新渲染带有复选框的列?

2个回答

所以我最终找到了一个解决方案 - 只需将我的 react-table 版本降级,特别是 6.8.6 就解决了这个问题。

似乎在以后的版本中引入了一个错误(我怀疑是否会修复,因为现在关注的是版本 7)。

您可以尝试使用像这样的 useMemo 钩子来记住组件

const file = React.useMemo(() => <SoundFilePlayer url={props.row.sound_file_url} />, [props.row.sound_file_url]);

除非文件 url 更改,否则它不会重新创建组件函数并将其从内存中取出。