【发布时间】:2019-02-22 07:12:52
【问题描述】:
简而言之:-
我想先更新子状态,然后更新父状态,但反应批次 setSate 并首先调用父 setState,然后再调用子状态。要获得更多理解,请阅读下面的说明。
基本上我有一个父组件有两个孩子。
- 排序组件:- 该组件打开一个下拉列表供选择排序选项。点击它应该更新本地状态,然后调用从父级作为道具传递的函数。
- 产品集合:-此组件根据所选排序显示产品。
我正在将一个函数 (handleClick) 从父组件传递给排序,以将所选排序的值传递给父组件,然后将其传递给产品集合。
由于排序是一个下拉列表,我想在用户选择一个选项后立即关闭它,然后我想更新父项。
现在我正在以这种方式使用它,首先更新本地状态并在回调中调用从父级传递的函数。
handleClick(param) {
this.setState({ selectedType: param.slug }, () =>
this.props.onHandleSort(param.slug)
)
}
但正如React docs 中所写,它对进程进行批处理并首先调用父 setState,然后再调用子。
例如,如果 Parent 和 Child 都调用 setState 在点击事件期间,Child 不会重新渲染两次。相反,反应 在浏览器事件结束时“刷新”状态更新。这个 显着提升大型应用的性能。
我需要它以这种方式发生,只是因为我需要先关闭我的下拉菜单,然后父级应该更新。
我尝试了以下方法,但似乎没有任何效果。
- 使排序组件无状态并依赖于父级的道具,但这需要时间来关闭下拉列表。
- 使用了 setState 的回调,但由于在文档中写入,它首先批处理和调用父 setState,然后再调用子。
【问题讨论】:
-
设置
selectedType是否会导致下拉菜单关闭 -
@ShubhamKhatri 是的,它关闭了下拉菜单。
-
你能显示那部分代码吗
-
@ShubhamKhatri 我正在使用 reakit 作为下拉菜单,您可以在此处查看排序组件的代码codepen.io/anon/pen/zeRqyz?editors=0010
-
我认为您应该将
selectedType保留在父级中。 React 强调自上而下的数据流模型,而您遇到的问题是由于试图违背它。
标签: javascript reactjs setstate