我没有在子组件中获得反应道具的预期价值

I don't get the expected value of a react props in child component

我正在尝试在 React js 应用程序(我正在维护)中管理一些客户端,它最初是用 类 组件编写的,但我现在正在添加一个功能性子组件,但我没有确定这是否是问题的根源(react-table 示例仅使用功能组件)

我有一个主要组件,它将从 rest API 获取数据并将其保存在状态“entries”,然后我将其传递给子组件作为在 react-table 中呈现数据的道具,问题出在本节中,因为我有一些按钮可以在 react-modal 中编辑和删除数据,当我尝试访问 props.entries 之后按钮点击 我有一个空数组 props.entries.

这是问题的沙箱:https://codesandbox.io/s/stale-prop-one-forked-r6cevx?file=/src/App.js

我在点击删除按钮时做了一个console.log,你可以看到en entries数组是空的。

您需要在 useMemo 依赖数组中传递 showEditModal & showEditModal。因为你的依赖数组是空的,当你点击编辑或删除时,它只是指向旧的函数引用并且它有旧的条目值。

您可以通过console.log检查条目值。

希望这能解决您的问题

    const showEditModal = useCallback(
        (client_id) => {
            const tmpClient = props.entries.filter(function (el) {
                return el._id === client_id;
            })[0];
            setClient(tmpClient);
            setEditModal(true);

            console.log('aaa', props);

            console.log(client_id);
            console.log(props.entries);
            console.log(tmpClient);
        },
        [props.entries]
    );

    const showDeleteModal = useCallback(
        (client_id) => {
            console.log('showDeleteModal entries : ', entries);
            const tmpClient = entries.filter(function (el) {
                return el._id === client_id;
            })[0];
            setClient(tmpClient);
            setDeleteModal(true);

            console.log('Delete', entries);
            console.log(client_id);
            console.log(tmpClient);
        },
        [props.entries]
    );

    const columns = React.useMemo(
        () => [
            {
                Header: 'fact',
                accessor: 'fact'
            },
            {
                Header: 'Actions',
                accessor: 'length',
                Cell: ({ cell }) => (
                    <>
                        {cell.row.values.length}
                        <Tooltip title='Supprimer' placement='top'>
                            <IconButton
                                variant='outlined'
                                id={cell.row.values._id}
                                onClick={() => showDeleteModal(cell.row.values.length)}
                            >
                                <DeleteIcon />
                            </IconButton>
                        </Tooltip>
                        <Tooltip title='Modifier' placement='top'>
                            <IconButton
                                variant='outlined'
                                id={cell.row.values.length}
                                onClick={() => showEditModal(cell.row.values.length)}
                            >
                                <EditIcon />
                            </IconButton>
                        </Tooltip>
                    </>
                )
            }
        ],
        [showEditModal, showDeleteModal]
    );