【发布时间】:2020-02-28 22:39:59
【问题描述】:
我已经使用 Context API 概念成功地创建了一个 React 应用程序来管理全局状态,但是现在我遇到了一个问题,涉及在从子组件在 Context 组件中调用 setState 之后执行操作。
我有一个基于 ListView 类的组件,其中包含一个 ReactBootstrap NavDropdown 组件。下拉组件有两个列表项:日期和 study_name(我使用它来按日期或 study_name 对列表进行排序):
<NavDropdown title="Order By" id="order-nav-dropdown" style={navElementStyle} onSelect={this.onSelect}>
在同一个ListView组件中,我有如下函数来捕捉NavDropdown的onSelect事件:
onSelect = (e, obj) => {
var match = obj.target.href.match(/#(.+)$/);
if(this.context.state[match[1]] !== e){
this.context.updateState(match[1], e);
}
}
为了管理上下文,我有一个单独的基于类的组件,称为 SearchContext,它有一个状态:
state = {
order_by: "study_id", //default value study_id
sort_by: "desc" //default value of desc
}
在那个上下文组件中,我有一个名为 updateState 的方法:
updateState(key, value){
this.setState({[key]: value});
}
我没有把组件的所有代码都放在这里,因为代码很多,但一切都很完美。当我更改组件中的下拉列表时,SearchContext 中的状态会更新,然后可用,例如,当我从该组件路由到另一个组件,然后再返回时。这就是我这样做的原因。我正在使用路由器单击列表元素之一以查看该元素,但是当我返回 ListView 组件时,我猜本地状态总是会丢失,因为我完全重新加载了?
无论如何,经过大量研究,Context API 是我找到的方法,就像我说的......它有效。当我路由回 ListView 时,下拉列表保留了它们的列表项值。
现在的问题是这样的:
在开始使用 ContextAPI 之前,我使用 ListView 组件的本地状态直接调用 setState,因此我可以传递一个回调,然后使用 Axios 从数据库中获取结果(this.updateList 是回调的名称,这里没有显示回调)。它是这样工作的:
onSelect = (e, obj) => {
var match = obj.target.href.match(/#(.+)$/);
if(this.state[match[1]] !== e){
this.setState({[match[1]] : e}, this.updateList);
}
}
这允许我在本地状态更新后调用 this.updateList。那工作得很好......但是现在我已经将状态移动到 Context 组件中,我不能使用这个方法,因为“this”是相对于孩子的......而不是上下文组件。所以我得到一个未定义的方法回调。
我已经进行了很多谷歌搜索,我正在缩小范围,这是一个只能通过钩子解决的问题,但我不想走这条路,因为必须有更简单的方法来获得这与我正在使用的基于类的方法一起使用。除非我的方法完全错误并且我没有以“React”方式这样做,否则我觉得应该有一种方法让我获得与 setState 相同的功能并将回调从孩子传递给父母......
如果有人有任何建议,我将不胜感激。我确信我最终将不得不学习钩子,但是 React 在钩子之前就存在的事实让我认为应该有一个基于类的方法来解决这个问题。
【问题讨论】:
标签: reactjs react-context