Javascript 我应该如何在这里使用shouldComponentUpdate来更新React.js中的父状态?

Javascript 我应该如何在这里使用shouldComponentUpdate来更新React.js中的父状态?,javascript,reactjs,Javascript,Reactjs,我是React.js的新手,在更新父组件状态时遇到问题。我附上了完整的代码,这样就不会错过一些重要的东西 我需要我的“重置”按钮来重置父组件的状态 您可以看到问题所在 您应该在导航器菜单中打开“事件”,尝试选择类别,然后重置它们 父组件:components/events/filter bar.js chils component:components/shared/dropdown/category.js因此,您在FilterBar和category组件状态中有类别-它们不同步。由于Filte

我是React.js的新手,在更新父组件状态时遇到问题。我附上了完整的代码,这样就不会错过一些重要的东西

我需要我的“重置”按钮来重置父组件的状态

您可以看到问题所在

您应该在导航器菜单中打开“事件”,尝试选择类别,然后重置它们

父组件:components/events/filter bar.js


chils component:components/shared/dropdown/category.js

因此,您在
FilterBar
category
组件状态中有类别-它们不同步。由于
FilterBar
也将
类别
作为
道具
接收,这表明
类别
没有单一的真相来源。至少有三个地方可以将类别保存在不同的组件状态中。这是一件非常糟糕的事情,会导致错误和难以维护的状态。解决方案是只在一个地方设置类别状态,然后将其传递给需要它们的组件(以及更新类别的方法)

无论如何,如果只重置下拉类别是您想要的,那么您可以这样做:

  • FilterBar
    中创建一个新方法,根据需要命名它,并将其作为道具传递给
    Categories
    组件。此方法只接受一个参数-类别数组。此方法将更新
    FilterBar
    state.categories

  • Categories
    组件中,删除
    state.selected
    saveSelected
    方法。在使用
    saveSelected
    的地方,将其替换为从
    FilterBar
    传递的prop(函数/方法)

  • 更新 这个问题实际上与组件生命周期或更新父状态无关

    这里有一件事:你不能控制你不拥有的状态(第三方组件就是这样)。一些库作者提供了设置初始状态或重置的方法,但您正在使用的组件库并非如此

    在您的情况下,最好的方法是
    卸载下拉列表,然后
    再次装载它们。这就像刷新页面的一部分

    这样做:

  • visible:true
    添加到
    FilterBar
    状态
  • onReset
    方法添加到同一组件:
  • 更新重置按钮:
    onClick={this.onReset}
  • 有条件地呈现按钮工具栏
  • 返回this.state.visible?:null//仅出于演示目的缩短了代码
    
    如果家长需要访问孩子的状态,那么该状态很可能属于家长,并作为道具传递给孩子。尝试将状态移动到
    下拉列表组
    ,并将其作为道具传递到
    类别下拉列表
    。非常感谢您的回答。首先,我们只是以Java开发人员的身份编写这个项目,所以我们只需要工作前端。我同意也需要理解。由于任务的关系,首先我按照你说的做了,但这不起作用。然后我用shouldComponentUpdate尝试了一些东西,它似乎在某个时候起了作用。现在我做了些改变,你能看到我是否正确理解你吗?你们可以看到在右边注释的新行和自己注释的旧行。仍在试图理解你们想要包含什么。重置下拉列表(类别,按挂载日期和日期)就是你要做的吗?是的,但首先我想检查这是否适用于类别。然后我也会用rest组件(我的意思是作为道具传递方法)来实现这一点,虽然你们很接近,但你们并没有正确地实现第四步。另外,
    shouldComponentUpdate
    不返回布尔值-这是错误的。使用正确的签名将其更改为
    componentdiddupdate
    <代码>按钮
    导入也不正确。这是一个错误。是的,这是你应用程序中的另一个错误。如果我帮你修好的话,就会出现另一个。我们需要结束这一切。依我看,你的问题已经解决了。
    onReset = () => {
        this.setState(
          state => ({ visible: false }),
          () => {
            this.setState({ visible: true });
          }
        );
      };
    
    return this.state.visible ? <ButtonToolbar /> : null // have shortened code just for demonstration purpose