如何将道具传递给 ListHeaderComponent?
How do I pass props to ListHeaderComponent?
所以我从我的第一个组件导航到 FooItems 页面,并将道具传递给导航。
showFooItemsPage = () => {
this.props.navigation.navigate('FooItemsComponent', {
fooItems: this.props.fooItems});
};
在我的 FooItemsComponents 上,我有一个带有 renderItems 函数的 Flatlist,它正在运行。但是,我想更改 Flatlist 项目列表,然后我想在 Flatlist 组件的 header 中单击 Save。
我现在遇到的主要问题是将道具发送到我的 Flatlist 的 Header 组件。道具是未定义的,我不知道如何从我的 FooItemsComponent 发送道具或当我在页面之间导航时?
这是我的 FooItemsComponent 的一些片段:
class Header extends Component {
constructor(props) {
super(props);
}
async componentDidMount() {
//call some reducer action
}
save = items => {
this.props.saveItems(items);
this.props.navigation.navigate("previousComponent");
}
render() {
const {navigation, loading } = this.props;
return (
<View>
<View style={styles.header}>
<TouchableOpacity onPress={this.save}>
<Text style={styles.saveText}>Save</Text>
</TouchableOpacity>
</View>
<View
style={{
borderTopWidth: 1,
borderTopColor: Colors.grey,
height: 1,
}}>
</View>
</View>
);
}
}
export class FooItemsComponent extends Component {
constructor(props) {
super(props);
}
async componentDidMount() {
//some reducer action
}
renderItem = item => {
if (item.load) {
return <ActivityIndicator color={Colors.activityColor} size="small" />;
} else {
return (
<View>
<FooItems
{...item}
navigation={this.props.navigation}
showParticularItems={true}
/>
</View>
); }
};
render() {
const { fooItems, navigation, loading, props} = this.props;
if (!fooItems) fooItems = [];
return (
<View style={styles.container}>
<FlatList
keyExtractor={(item, index) => `key-${index}`}
data={fooItems}
renderItem={item => this.renderItem(fooItems.item)}
ItemSeparatorComponent={Separator}
ListHeaderComponent={Header}
ListFooterComponent={loading ? LoadingFooter : Separator}
/>
</View>
);
}
}
使用箭头函数并包装 Header:
<FlatList
keyExtractor={(item, index) => `key-${index}`}
data={fooItems}
renderItem={item => this.renderItem(fooItems.item)}
ItemSeparatorComponent={Separator}
ListHeaderComponent={<Header yourProps={'blabla title'}/>}
ListFooterComponent={loading ? LoadingFooter : Separator}
/>
并在 Header
组件中使用 this.props.yourProps
永远不要使用箭头函数来渲染作为 props 传递的组件,React 不会有对该函数的稳定引用,因此不会知道头部组件应该是渲染之间的同一组件。它可能会导致错误并会损害性能。请参阅 以获取它可能导致的错误示例。虽然,伊丹非常接近找到正确的解决方案。相反,这样做:
<FlatList
keyExtractor={(item, index) => `key-${index}`}
data={fooItems}
renderItem={item => this.renderItem(fooItems.item)}
ItemSeparatorComponent={Separator}
ListHeaderComponent={<Header yourProps={'blabla title'}/> }
ListFooterComponent={loading ? LoadingFooter : Separator}
/>
所以我从我的第一个组件导航到 FooItems 页面,并将道具传递给导航。
showFooItemsPage = () => {
this.props.navigation.navigate('FooItemsComponent', {
fooItems: this.props.fooItems});
};
在我的 FooItemsComponents 上,我有一个带有 renderItems 函数的 Flatlist,它正在运行。但是,我想更改 Flatlist 项目列表,然后我想在 Flatlist 组件的 header 中单击 Save。
我现在遇到的主要问题是将道具发送到我的 Flatlist 的 Header 组件。道具是未定义的,我不知道如何从我的 FooItemsComponent 发送道具或当我在页面之间导航时?
这是我的 FooItemsComponent 的一些片段:
class Header extends Component {
constructor(props) {
super(props);
}
async componentDidMount() {
//call some reducer action
}
save = items => {
this.props.saveItems(items);
this.props.navigation.navigate("previousComponent");
}
render() {
const {navigation, loading } = this.props;
return (
<View>
<View style={styles.header}>
<TouchableOpacity onPress={this.save}>
<Text style={styles.saveText}>Save</Text>
</TouchableOpacity>
</View>
<View
style={{
borderTopWidth: 1,
borderTopColor: Colors.grey,
height: 1,
}}>
</View>
</View>
);
}
}
export class FooItemsComponent extends Component {
constructor(props) {
super(props);
}
async componentDidMount() {
//some reducer action
}
renderItem = item => {
if (item.load) {
return <ActivityIndicator color={Colors.activityColor} size="small" />;
} else {
return (
<View>
<FooItems
{...item}
navigation={this.props.navigation}
showParticularItems={true}
/>
</View>
); }
};
render() {
const { fooItems, navigation, loading, props} = this.props;
if (!fooItems) fooItems = [];
return (
<View style={styles.container}>
<FlatList
keyExtractor={(item, index) => `key-${index}`}
data={fooItems}
renderItem={item => this.renderItem(fooItems.item)}
ItemSeparatorComponent={Separator}
ListHeaderComponent={Header}
ListFooterComponent={loading ? LoadingFooter : Separator}
/>
</View>
);
}
}
使用箭头函数并包装 Header:
<FlatList
keyExtractor={(item, index) => `key-${index}`}
data={fooItems}
renderItem={item => this.renderItem(fooItems.item)}
ItemSeparatorComponent={Separator}
ListHeaderComponent={<Header yourProps={'blabla title'}/>}
ListFooterComponent={loading ? LoadingFooter : Separator}
/>
并在 Header
组件中使用 this.props.yourProps
永远不要使用箭头函数来渲染作为 props 传递的组件,React 不会有对该函数的稳定引用,因此不会知道头部组件应该是渲染之间的同一组件。它可能会导致错误并会损害性能。请参阅
<FlatList
keyExtractor={(item, index) => `key-${index}`}
data={fooItems}
renderItem={item => this.renderItem(fooItems.item)}
ItemSeparatorComponent={Separator}
ListHeaderComponent={<Header yourProps={'blabla title'}/> }
ListFooterComponent={loading ? LoadingFooter : Separator}
/>