Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当父组件状态更改时,强制更新子组件_Javascript_Reactjs_React Redux - Fatal编程技术网

Javascript 当父组件状态更改时,强制更新子组件

Javascript 当父组件状态更改时,强制更新子组件,javascript,reactjs,react-redux,Javascript,Reactjs,React Redux,我有一个MyList组件,用于获取项目,允许筛选和排序。该组件已经在应用程序的其他部分中使用,并且运行良好。它使用渲染道具渲染项目,因此它接受函数类型的renderItem道具 现在,我正在构建一个简单的列表,允许使用前面提到的组件选择项目,并在render prop renderItem方法中检查所选状态。问题是,当我更改MySelectableList的状态时,MyList组件不会更新,因为它的props不会更改,它始终是相同的绑定函数renderProp。现在,我强制使用this.rend

我有一个MyList组件,用于获取项目,允许筛选和排序。该组件已经在应用程序的其他部分中使用,并且运行良好。它使用渲染道具渲染项目,因此它接受函数类型的renderItem道具

现在,我正在构建一个简单的列表,允许使用前面提到的组件选择项目,并在render prop renderItem方法中检查所选状态。问题是,当我更改MySelectableList的状态时,MyList组件不会更新,因为它的props不会更改,它始终是相同的绑定函数renderProp。现在,我强制使用this.renderItem=this.renderItem.bindthis呈现子对象;但我不喜欢它,我知道我可以用ref更新子组件,但我也不喜欢它

是否有更好的方法在父组件状态更改时强制子组件渲染?我做错什么了吗

MySelectableList的完整代码:

提前谢谢

编辑

MyList组件使用connect连接到redux存储。我发现connect是MyList组件缺少渲染的原因,仅使用vanilla react组件就可以正常工作

我在这个代码沙盒中重现了这个问题:

,因为您询问了如何以更友好的方式进行操作

更好的方法是:

render () {
        return (
            <div>
                <MyList {...whateeverExtraPropsyouWantToPass}>
                   <MySelectableItem
                       key={ item.uuid }
                       item={ item }
                       toggle={ this.toggle }
                       selected={ this.isSelected(item) } />
                </MyList>
            </div>
        );
那么您的MyList将如下所示:

render () {
        return (
            <div>
               ...//your other MyList code
               ...
               {this.props.children}
            </div>
        );
这看起来更可读、更易于维护和调试。但我相信这对你来说是显而易见的。因为,你问了一个反应友好的方式,这是你能做的最反应友好的方式


我不建议不必要的,显式地尝试呈现任何组件。除非这是唯一的方法,否则组件中不会出现这种情况。

实现MyList的方法没有问题。React Native FlatList具有相同的模式。但是,为什么不将项目作为属性传递给MyList,这样就可以


这样,MyList将重新呈现,因为items属性发生更改。items属性也是必需的,因为我假设在MyList组件中,您需要执行items.map函数,对吗?否则,您如何知道总共需要渲染多少项?

为什么要重新渲染?父母和孩子之间没有约束力吗?您没有将状态作为道具传递。您不能将renderItem作为道具传递,而是将其作为子项传递@nitte93user3232918。谢谢您的输入。我知道它不会重新渲染,我理解为什么这个.renderItem不会改变,我在问是否有一种更好的方法来触发渲染,或者我是否必须以某种方式改变整个设计。我无法将MySelectedItem作为子项传递,因为实际的项由子组件MyList管理。谢谢,我理解您的建议,但我的示例中的项是由MyList获取和管理的,因此我无法实例化,也无法访问父范围中的项。谢谢您的回复,不幸的是,项目是由MyList组件直接获取和管理的,我不知道父组件中的项目。
render () {
        return (
            <div>
               ...//your other MyList code
               ...
               {this.props.children}
            </div>
        );