2 回答
TA贡献1848条经验 获得超10个赞
如果你想用渲染更新你的 UI,你必须更新你的状态。在您的 FlatList 组件中,您不会更新状态。所以它永远不会再次渲染。您必须在 FlatList 中使用状态。
render() {
return (
<SafeAreaView style={styles.container}>
<Header text={"Search"} />
<FlatList
ListHeaderComponent={this.renderHeader}
AnyProp={this.state.anyState}
/>
</SafeAreaView>
);
}
TA贡献1836条经验 获得超3个赞
问题出在ListHeaderComponent.
我做了一个演示项目来看看发生了什么:
import React, { Component } from 'react'
import { SafeAreaView, FlatList, TextInput } from 'react-native'
export default class Test extends Component {
constructor(props){
super(props)
this.state={value:""}
}
renderHeader = () =>{
console.log("rendering")
return (<TextInput style={{backgroundColor:"green"}}value={this.state.value} placeholder={"Placeholder"}onChangeText={(text)=> this.setState({value : text})}></TextInput>)
}
render() {
console.log(this.state.value) //Logs the value
return (
<SafeAreaView style={{flex:1}}>
<FlatList
ListHeaderComponent={this.renderHeader}
/>
</SafeAreaView>
)
}
}
看起来一旦组件渲染完毕,它就不再更新了。渲染中的日志确实会更新,但组件不会重新渲染自己(可能导致第一次渲染完成后FlatList不更新)ListHeaderComponent
我建议将 SearchBar 移到 FlatList 上方,并将所有内容包含在ScrollView.
编辑,
为了确认它实际上正在更新,我创建了另一个TextInput并将它放在 FlatList 之外,它工作正常:
import React, { Component } from 'react'
import { SafeAreaView, FlatList, TextInput } from 'react-native'
export default class Test extends Component {
constructor(props){
super(props)
this.state={value:""}
}
renderHeader = () =>{
console.log("rendering")
return (<TextInput style={{backgroundColor:"green"}}value={this.state.value} placeholder={"Placeholder"}onChangeText={(text)=> this.setState({value : text})}></TextInput>)
}
render() {
console.log(this.state.value) //Logs the value
return (
<SafeAreaView style={{flex:1}}>
<TextInput style={{backgroundColor:"red"}}value={this.state.value} placeholder={"Placeholder"}onChangeText={(text)=> this.setState({value : text})}></TextInput>
<FlatList
ListHeaderComponent={this.renderHeader}
/>
</SafeAreaView>
)
}
}
添加回答
举报