reactjs - React - 从子级到父级的数据 - 设置状态的问题
问题描述
我不确定我是否正确地将数据从子组件发送到父组件。我能够将数据导入父级,但是每当我在父级中设置状态时,都会出现Maximum update depth exceeded.
错误。
我出错的任何想法(React 新手):
子组件
所以在我的子组件道具中 - 我添加了回调函数:
selectedRowsDataCallback?: (selectedRows: string[]) => void;
然后稍后在那个子组件中 - 在它的渲染中,我为它设置了一些值selectedRowsDataCallback(someOfMyData);
父组件
在父组件中 - 我有:
const [selectedRows, setSelectedRows] = React.useState([]);
子组件大致如下所示:
<ChildComponent
selectedRowsDataCallback={SelectedRowsCallback}
/>
还有那个回调:
function SelectedRowsCallback(childData: string[]) {
React.useEffect(() => {
setSelectedRows(childData);
}, [])
}
它在这一点上得到Maximum update depth exceeded.
(当然做了一个console.log,我看到了数据)。
所以我添加了useEffect,带有[]
deps,但当然它只被调用一次。每次孩子更新时如何调用它?
无论如何,我在父级上也有一个按钮,单击该按钮我想获取那些 selectedRows 因此我使用状态来保存它。
function someButtonAction() {
// Get from props and do something
console.log(selectedRows);
}
任何想法/帮助表示赞赏。
谢谢。
解决方案
不要调用在渲染中设置状态的方法。如果我理解正确,您正在做的是:
- 你渲染你的 Parent ,它的状态是 selectedRows
- 您将该状态的设置器传递给孩子
- 孩子在其渲染中调用该设置器
- 这会导致父级重新渲染,因为状态发生了变化
- 父重新渲染触发子重新渲染
- 第 3 部分重复
- 第 4 部分重复
- 第 5 部分重复
- 第 3 部分重复
- ...
在内部SelectedRowsCallback
,您应该在调用之前检查它的值selectedRows
是否已更改setSelectedRows
。那应该可以解决这个问题。
但是,请注意,整个函数有点不必要,因为您每次都在创建一个新效果,setSelectedRows
而这已经是您所需要的(+ 您应该将所有外部变量传递给 的第二个参数useEffect
)
此外,调用任何可能触发渲染内部状态变化的东西,将其移动到selectedRowsDataCallback
其他地方是一种非常糟糕的做法 - 例如componentDidUpdate
.
推荐阅读
- python - 合并两个numpy数组,一个作为键,另一个作为值
- linux - 在 Docker 容器中添加交互式用户输入,例如 `read`
- r - R - 按组查找共同元素
- arrays - C如何将结构分组到一个数组中
- javascript - 评论对象未在反应中呈现 || TypeError:无法读取未定义的属性“地图”
- excel - 当范围和值都是相同类型时,MATCH 函数将不适用于单元格引用值
- winapi - 使用 win32gui.GetClassName 时找不到确切位置
- swift - 如何刷新弹出窗口
- spring - @OneToMany 其中 mappedBy 是 @Any
- firebase - 无法实例化应用程序并且找不到类