gpt4 book ai didi

javascript - React - 当 Prop 通过父状态更新时,子组件不会更新

转载 作者:行者123 更新时间:2023-11-27 22:36:54 25 4
gpt4 key购买 nike

我有一个 react native 组件 -

export default class Chat extends Component {
constructor(props) {
super(props);

this.state = {
behavior: 'padding',
text: '',
messages: this.props.chat.messages
};
}

updateText() {
this.setState({
messages: this.state.messages.concat( { message: this.state.text } )
})
}

render() {
return (

<KeyboardAvoidingView behavior={this.state.behavior} style={styles.container}>
<View style={styles.chatContainer}>
<MessageList messages={this.state.messages} />
</View>
<View style={styles.textContainer}>
<BorderedTextInput
placeholder="Type something..."
onSubmitEditing={ this.updateText.bind(this) }
onChangeText={(text) => this.setState({text})}
value={this.state.text}
style={styles.textInput} />
<IconBar />
</View>
</KeyboardAvoidingView>

);
}
}

它的状态有消息数组,当使用文本输入时该数组会更新。这被传递到 MessageList 组件。

export default class MessageList extends Component {
constructor(props) {
super(props);
const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
this.state = {
dataSource: ds.cloneWithRows(this.props.messages),
};
}

_renderRow(chat){
return (
<FadeInListRow>
<View style={this._bubbleContainerStyle(chat)}>
<Text style={this._bubbleStyles(chat)}>{chat.message}</Text>
</View>
</FadeInListRow>
)
}

render() {
return (
<View style={styles.container}>
<View style={styles.timeContainer}>
<Text style={styles.timeText}>
Mon, Jun 2, 22:09
</Text>
</View>

<ListView
dataSource={this.state.dataSource}
renderRow={this._renderRow.bind(this)}
contentContainerStyle={styles.listView}
style={{flex: 1, paddingTop: 50}}
/>
</View>
)
}
}

我预计 _renderRow 会再次被调用,并且我的 ListView 会在父状态更新时更新。它不是。知道我做错了什么吗?

最佳答案

当前代码看起来不错。我建议两件事:

  1. 确认state中的message属性确实已更新onSubmit()。您可以在 chat 类的 return 命令之前记录它。

  2. 确认 MessageList 组件上 props 中的 message 属性与父级更新的周期相同。

我这么说有一个前提:状态更新的大多数问题通常是由于数据更新不一致造成的。如果数据没有改变,组件就不会被重新渲染。

关于javascript - React - 当 Prop 通过父状态更新时,子组件不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39029102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com