【发布时间】:2019-04-11 21:09:47
【问题描述】:
我需要在 react native Modal 中显示类似标签的行为
我首先创建了一个状态变量 selectedSub,它使用值 'from'
进行初始化现在我的模态有 2 个 TouchableHighlight 如下
_availabiltyModal() {
return (
<TouchableHighlight
onPress={() => { this.setState({ selectedSub: 'from' }) }}
activeOpacity={0.9}
style={[styles.tab, this.state.selectedSub == 'from' && styles.active]}>
<RkText rkType="header" style={this.state.selectedSub == 'from' && styles.activeText}>From</RkText>
</TouchableHighlight>
<TouchableHighlight
onPress={() => { this.setState({ selectedSub: 'to' }) }}
activeOpacity={0.9}
style={[styles.tab, this.state.selectedSub == 'to' && styles.active]}>
<RkText rkType="header" style={this.state.selectedSub == 'to' && styles.activeText}>To</RkText>
</TouchableHighlight>
{this._renderPicker()}
)}
这两个负责根据需要更改状态参数selectedSub。
基于此状态参数,我有条件地显示我制作和导入的另一个组件,如下所示
_renderPicker() {
if (this.state.selectedSub == 'from') {
return <TimePicker screenProps={{ time: this.state.selectedAvailabilty.from }} />
} else {
return <TimePicker screenProps={{ time: this.state.selectedAvailabilty.to }} />
}
}
我已经在TouchableHighlight下面的Modal中调用了这个函数
现在根据 RN 文档,当使用 this.setState() 方法更新状态变量时,组件应该重新渲染。其他一切工作正常(TouchableHighlight 样式发生变化),状态更新也在控制台中反映出来。但是_renderPicker 函数不会返回更改后的视图,并且总是停留在前面所指出的初始化父级时设置的视图上。
有人可以帮我指出我可能忽略的问题吗?另外在旁注中,所有这些调用实际上都是直接在主 render() 方法之外进行的。这可能是一个问题
--更新------ 这是完整的参考
render() {
return({this._availabiltyModal()}
<View style={appStyles.tagsWrapper}>
{this.state.week.map((day, i) => {
return (
<TouchableHighlight
key={i}
activeOpacity={0.9}
style={[appStyle.mr10, appStyle.mb10]}
onPress={() => {
this.setModalVisible(true, day);
}}>
<Text style={appStyle.tag}>{day}</Text>
</TouchableHighlight>
)
})}
</View>
)
}
【问题讨论】:
-
我认为问题出在模态上。正如刚才观察到的,如果我隐藏模式然后再次显示它,我的 _renderPicker() 方法能够显示更新的组件视图。这是否意味着模态不会在状态更改时重新渲染
-
实际上,如果状态是更新,则依赖于它的函数永远不会被召回。作为您的情况,您有一个返回视图的函数。渲染函数中的每一件事都应该重新渲染为模态
-
有道理!但问题是,即使我将 _renderPicker() 内容放在作为主渲染功能的一部分的模态中,视图也不会根据需要重新渲染,直到模态关闭并再次打开。
-
我认为这与从 react-native 实现 Modal 组件有关。
标签: javascript reactjs react-native