仅在特定屏幕上在子组件中呈现按钮
Render button in child component only on certain screen
我在 2 个不同的屏幕上使用平面列表。
在 EventListScreen
上:
这是主屏幕,应该显示所有事件。
在第二页 UserProfile.js
此页面应仅显示该用户事件。
在两个平面列表中,我使用存储在单独 class 中的纯组件到平面列表所在的位置,即
我的问题是,只有当用户在
UserProfileScreen.js
我查了很多例子,但找不到任何说明如何做的例子
像我一样使用子纯组件。
任何帮助将不胜感激!谢谢
EventListScreen.js
<FlatList
data={this.state.events}
// Get the item data by referencing as a new function to it
renderItem={({item}) =>
<Event
openEventDetail={() => this.openEventDetail(item)}
{...item}
/>}
/>
UserProfileScreen.js
<FlatList
data={this.state.events}
// Get the item data by referencing as a new function to it
renderItem={({item}) =>
<Event
openEventDetail={() => this.openEventDetail(item)}
openEditEvent={() => this.openEditEvent(item)}
{...item}
/>}
/>
Event.js
export default class Event extends Component {
render() {
return (
<Card>
<CardSection>
<Text>{this.props.eventName}</Text>
//I want this button to be displayed only if user is viewing
//from the UserProfile.js
<Button onPress={() =>this.props.openEditEvent()}>
{this.props.displayButton}
</Button>
</CardSection>
<TouchableOpacity
onPress={() => this.props.openEventDetail()}
>
}
如果我正确理解你的问题,解决这个问题的一个选项是传递一个布尔值 "showable prop" 以仅在需要时显示编辑按钮:
EventListScreen.js(保持不变,这里我们不显示编辑按钮)
<FlatList
data={this.state.events}
// Get the item data by referencing as a new function to it
renderItem={({item}) =>
<Event
openEventDetail={() => this.openEventDetail(item)}
{...item}
/>}
/>
UserProfileScreen.js(我们将 shouldShowEditButton 属性添加到事件中以显示按钮)
<FlatList
data={this.state.events}
// Get the item data by referencing as a new function to it
renderItem={({item}) =>
<Event
openEventDetail={() => this.openEventDetail(item)}
openEditEvent={() => this.openEditEvent(item)}
shouldShowEditButton
{...item}
/>}
/>
Event.js(我们添加了一些propTypes和defaultProps来处理新的prop,如果不指定它不会显示编辑按钮)
export default class Event extends Component {
render() {
return (
<Card>
<CardSection>
<Text>{this.props.eventName}</Text>
//I want this button to be displayed only if user is viewing
//from the UserProfile.js
{this.props.shouldShowEditButton && <Button onPress={() =>this.props.openEditEvent()}>
{this.props.displayButton}
</Button>}
</CardSection>
<TouchableOpacity
onPress={() => this.props.openEventDetail()}
>
...
...
);
...
}
}
// We add some default propTypes and definitions
Event.propTypes = {
shouldShowEditButton: PropTypes.bool
};
Event.defaultProps = {
shouldShowEditButton: false
};
通过这种方式,您只显示定义了属性 shouldShowEditButton
的组件的编辑按钮,并且由于其默认值定义为 false
,因此未定义的组件让 属性 的行为方式与之前相同。
您不需要额外的属性。
我们可以假设 "Edit" 按钮在定义 openEditEvent
属性时应该可用。
event
中的条件(使用 bool 转换,未定义为 false):
<CardSection>
<Text>{this.props.eventName}</Text>
{!!this.props.openEditEvent &&
<Button onPress={() =>this.props.openEditEvent()}>
{this.props.displayButton}
</Button>
}
</CardSection>
使用 propTypes 将 openEditEvent
prop 定义为函数,可选(非必需)。
我在 2 个不同的屏幕上使用平面列表。
在 EventListScreen
上:
这是主屏幕,应该显示所有事件。
在第二页 UserProfile.js
此页面应仅显示该用户事件。
在两个平面列表中,我使用存储在单独 class 中的纯组件到平面列表所在的位置,即
我的问题是,只有当用户在
UserProfileScreen.js
我查了很多例子,但找不到任何说明如何做的例子 像我一样使用子纯组件。
任何帮助将不胜感激!谢谢
EventListScreen.js
<FlatList
data={this.state.events}
// Get the item data by referencing as a new function to it
renderItem={({item}) =>
<Event
openEventDetail={() => this.openEventDetail(item)}
{...item}
/>}
/>
UserProfileScreen.js
<FlatList
data={this.state.events}
// Get the item data by referencing as a new function to it
renderItem={({item}) =>
<Event
openEventDetail={() => this.openEventDetail(item)}
openEditEvent={() => this.openEditEvent(item)}
{...item}
/>}
/>
Event.js
export default class Event extends Component {
render() {
return (
<Card>
<CardSection>
<Text>{this.props.eventName}</Text>
//I want this button to be displayed only if user is viewing
//from the UserProfile.js
<Button onPress={() =>this.props.openEditEvent()}>
{this.props.displayButton}
</Button>
</CardSection>
<TouchableOpacity
onPress={() => this.props.openEventDetail()}
>
}
如果我正确理解你的问题,解决这个问题的一个选项是传递一个布尔值 "showable prop" 以仅在需要时显示编辑按钮:
EventListScreen.js(保持不变,这里我们不显示编辑按钮)
<FlatList
data={this.state.events}
// Get the item data by referencing as a new function to it
renderItem={({item}) =>
<Event
openEventDetail={() => this.openEventDetail(item)}
{...item}
/>}
/>
UserProfileScreen.js(我们将 shouldShowEditButton 属性添加到事件中以显示按钮)
<FlatList
data={this.state.events}
// Get the item data by referencing as a new function to it
renderItem={({item}) =>
<Event
openEventDetail={() => this.openEventDetail(item)}
openEditEvent={() => this.openEditEvent(item)}
shouldShowEditButton
{...item}
/>}
/>
Event.js(我们添加了一些propTypes和defaultProps来处理新的prop,如果不指定它不会显示编辑按钮)
export default class Event extends Component {
render() {
return (
<Card>
<CardSection>
<Text>{this.props.eventName}</Text>
//I want this button to be displayed only if user is viewing
//from the UserProfile.js
{this.props.shouldShowEditButton && <Button onPress={() =>this.props.openEditEvent()}>
{this.props.displayButton}
</Button>}
</CardSection>
<TouchableOpacity
onPress={() => this.props.openEventDetail()}
>
...
...
);
...
}
}
// We add some default propTypes and definitions
Event.propTypes = {
shouldShowEditButton: PropTypes.bool
};
Event.defaultProps = {
shouldShowEditButton: false
};
通过这种方式,您只显示定义了属性 shouldShowEditButton
的组件的编辑按钮,并且由于其默认值定义为 false
,因此未定义的组件让 属性 的行为方式与之前相同。
您不需要额外的属性。
我们可以假设 "Edit" 按钮在定义 openEditEvent
属性时应该可用。
event
中的条件(使用 bool 转换,未定义为 false):
<CardSection>
<Text>{this.props.eventName}</Text>
{!!this.props.openEditEvent &&
<Button onPress={() =>this.props.openEditEvent()}>
{this.props.displayButton}
</Button>
}
</CardSection>
使用 propTypes 将 openEditEvent
prop 定义为函数,可选(非必需)。