React Native 子组件更新

Posted

技术标签:

【中文标题】React Native 子组件更新【英文标题】:React Native Child Component update 【发布时间】:2019-04-29 06:02:08 【问题描述】:

当用户单击 Swipable 按钮时,我正在尝试更新子组件(表示 listItem),以便将其设置为“读取”。在我的父组件“NotificationList.js”中,数据已成功更新,当我“console.log()”时,数据已更新。但是,尽管处于这种状态(已读/未读),我仍想更改 ListItem 背景颜色。在子组件内部,更新工作正常,但是当我尝试根据父组件更新它时,数据更改不会在子组件上重新呈现。

我已经尝试过使用“setState”、“componentDidMount”和“componentWillReceiveProps”。可能其中之一应该可以解决我的问题,但我可能没有正确应用它们。

总而言之,我的问题与我在父端更新我的数据对象时如何更新子组件listItem有关?

有人可以给我一些关于如何解决这种情况的提示吗?

我发送一些我的代码如下。如果您可能需要有关当前问题的信息,请告诉我。

对此的任何帮助将不胜感激!

NotificationsList.js

export default class NotificationsList extends Component 
    constructor(props) 
        super(props);
        this.state = 
                listViewData: this.props.datainfo,
        ;
    

   [.....]

render() 
    return (
    <View style=styles.container>
                <SwipeListView
                    useFlatList
                    data=this.state.listViewData
                    renderItem= (data, rowMap) => (
                        <SwipeRow>
                            <View style=styles.rowBack>
                            <TouchableOpacity onPress= _ => 
                                this.updateReadState(data.item.key, rowMap);
                                >
                                <Text style=styles.backTextBlack>data.item.read == true ? "Unread" : "Read"</Text>
                            </TouchableOpacity>
                        </View>

                            <NotificationsRow 
                                data=data.item
                            />
                        </SwipeRow>
                    )
                />
            </View>
        );
    

NotificationsRow.js

export default class NotificationsRow extends Component 
    constructor(props) 
        super(props);
        this.state = 
            datarow: this.props.data,
        ;
    

render() 
    return (
        <View style=styles.container>             
                    <View style= backgroundColor: this.state.datarow.read == true ? '#FFFFFF' : '#dddddd', >

                        <View style= styles.listText >                            
                            <View>
                                <Text style= styles.messageText >  this.state.datarow.message  </Text>
                                <TouchableWithoutFeedback onPress= () => 
                                    this.state.rowReadState = !this.state.rowReadState;
                                >
                                    <Image source= this.state.datarow.read == true ? require('../images/readed.png') : require('../images/unread.png')  />
                                </TouchableWithoutFeedback>
                            </View>
                        </View>
                    </View>
            </View>
        );
    

【问题讨论】:

【参考方案1】:

NotificationRow 属性的背景颜色由您的内部组件状态设置。它当前由您的构造方法设置,并且仅在创建 NotificationRow 实例时设置。 ComponentDidMount 方法也是如此。它仅在组件安装时触发。

有几种方法可以更新您孩子的状态。

    不要使用 NotificationRow 内部状态 - 只需传递 backgroundColor 属性,或者像这样使用它:backgroundColor: this.props.dataRow.read ? 'red' : 'blue 如果你真的想使用内部状态,你可以使用ComponentWillUpdate(nextProps, nextState)ComponentDidUpdate(prevProps, prevState) 来比较道具是否发生了变化。避免使用 ComponentWillRecieveProps,因为它很快就会被弃用。

【讨论】:

谢谢,@Žiga-kerec,我想我明白了你告诉我的提示。我尝试实现它们,但是在添加“ComponentWillUpdate(nextProps, nextState) 或 ComponentDidUpdate(prevProps, prevState)”时,NotificationRow.js 上没有一个是正常的?当我更新 NotificationList.js 上的“读取”时,JSON 对象会正确更新,但它不会调用以前的函数,以强制更新。还有其他建议吗? @Integer 我刚刚注意到我用大写的第一个字母编写了函数。应该是componentDidMount。否则,尝试我在第一点说的,直接使用 props 而不将它们复制到子组件的内部状态。在这种情况下,您无需担心同步它们。 我想我可能会遗漏一些东西@Žiga Kerec。由于“NotifcationsRow.js”文件中的函数componentDidMountcomponentWillUpdate 仅在第一个屏幕渲染时被调用。我已经将“NoficationsRow.js”更改为使用“this.props”。有什么我可能遗漏的线索吗?

以上是关于React Native 子组件更新的主要内容,如果未能解决你的问题,请参考以下文章

React Native - 从父组件重新渲染子组件

在 React Native 中从子组件 TextInput 更新父组件状态

react-native的常用组件及api

React Native 和 Redux:为啥子组件不会在每次状态更新时重新渲染?

react-native 如何在子组件中获取父组件背景颜色

react-native:如何在反应上下文中更改子组件的参数?