0

在我的反应表中选择一行时出现错误。这个问题(可能)是由无限的重新渲染循环引起的。过程如下:

  1. 我想选择一行。
  2. react-table 使用 useMountedLayoutEffect() 方法来通知 const selectedFlatRows(所有选定行的列表)是否已更改。
  3. 然后 useMountedLayoutEffect() 调用一个应该导出所有选定行的方法。被调用的 Method 由其父级使用 props 提供给 table 组件。函数很简单,如下:
        useMountedLayoutEffect(() => {
            exportSelectedRows(selectedFlatRows)
        }, [selectedFlatRows]);

4、react-table的父组件是一个material UI Dialog。对话框基本上只是表格组件。对话框代码看起来像这样;


    function AddCodesToCaseDialog(props) {
        const [selectedCodes, setSelectedCodes] = React.useState("test");


        const columns = React.useMemo(
            () => [

                {
                    Header: 'Code',
                    accessor: 'code',
                },
                {
                    Header: 'Beschreibung',
                    accessor: 'description',
                },

            ],
            []
        )
        const data = [
            {
                code: "R111",
                description: "asdasasgsgeqea"
            },
            {
                code: "R12131",
                description: "YYYYYYYYYYa"
            }, {
                code: "as111",
                description: "XXXXXXXXXXXXXXa"
            }, {
                code: "CC111",
                description: "BBBBBBfa"
            },
            {
                code: "R1sss2131",
                description: "YYYYYYyycYYYYa"
            }, {
                code: "asddd111",
                description: "XXXXXyyyXXXXXXXXXa"
            }, {
                code: "CCggg111",
                description: "BBBgggBBBfa"
            },
        ]



        const handleCloseModal = () => {
            props.setOpen(false);
        };


        const dialogContent = (
            <Container>
                <div style={{
                    maxWidth: "100%",
                    width: "1000px",
                    minHeight: "500px",
                    flexGrow: 1,
                    position: "relative",
                }}>
                    <MMTable columns={columns} data={data} tableName={"Verfügbare Codes:"}
                             modalView={true}
                             withBorder={false}
                             exportSelectedRows={(selectedRows) => {
                                 setSelectedCodes(selectedRows.map((entry, index) => entry.values))
                             }}/>

                </div>

                <pre>{JSON.stringify(selectedCodes, null, 2)}</pre>

            </Container>
        )


        const dialogActions = [
            <StyledButton onClick={(event) => {
            }}>Abbrechen</StyledButton>,
            <StyledButton onClick={(event) => {
            }}>Auswahl hinzufügen</StyledButton>
        ]

        return (
            <ResponsiveDialogSkeleton openModal={props.open}
                                      handleCloseModal={handleCloseModal}
                                      dialogTitle={"Codes hinzufügen"}
                                      dialogContent={dialogContent}
                                      dialogActions={dialogActions}

            />
        );
    }

    export default AddCodesToCaseDialog;

  1. 使用这样的按钮调用包含表格的对话框。
    const [openAddCodesToCaseDialog, setOpenAddCodesToCaseDialog] = React.useState(false);


    return (<div>
      <StyledButton onClick={() => {
                              debugger
                              setOpenAddCodesToCaseDialog(true)
      }}>Code hinzufügen</StyledButton>

      <AddCodesToCaseDialog open={openAddCodesToCaseDialog} setOpen={setOpenAddCodesToCaseDialog}/>

    </div>)

  1. 一旦我在表格中选择一行,我的屏幕就会冻结,一段时间后会出现此错误:

错误:超过最大更新深度。当组件在 componentWillUpdate 或 componentDidUpdate 中重复调用 setState 时,可能会发生这种情况。React 限制了嵌套更新的数量以防止无限循环。

在此处输入图像描述

好像我遇到了无限的重新渲染循环,但我找不到问题。有没有人对我可以尝试解决这个问题有什么建议?

4

1 回答 1

0

我确实解决了这个问题。只是在创建表的数据数组时忘记使用 React.useMemo 了。

于 2021-05-19T15:27:06.443 回答