У меня есть среагировать родной компонент -реагировать - ребенок не обновляется, когда реквизит обновляется через родительское состояние
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 будет вызван снова, и мое представление списка обновится при обновлении родительского состояния. Это не. Любая идея, что я делаю неправильно?
Попробуйте изменить 'renderRow = {this._renderRow.bind (this)}' to' renderRow = {this._renderRow()} ' – MiGu3X
@ MiGu3X - это то, что я изначально думал тоже, но компонент ListView ожидает здесь функцию : https://facebook.github.io/react-native/docs/listview.html#renderrow –
Не могли бы вы попробовать хотя бы или это просто не сработало ?, возможно, вы можете просто поместить renderRow = {() = > {this._renderRow()}} – MiGu3X