React native:基于Modal中状态值的变化呈现条件组件

时间:2018-11-08 11:01:13

标签: javascript reactjs react-native

我需要在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的下方的模态中调用了此函数

现在按照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>
    )
}

1 个答案:

答案 0 :(得分:0)

将_renderPicker方法移动到render()方法中,就像...

render() {
...
{this._renderPicker()}
...
} 

从react-native看MODAL组件的代码

render(): React.Node {
    ....
    const innerChildren = __DEV__ ? (
      <AppContainer rootTag={this.context.rootTag}>
        {this.props.children}
      </AppContainer>
    ) : (
      this.props.children
    );

    return (
      <RCTModalHostView
        ....>
        <View style={[styles.container, containerStyles]}>
           {innerChildren} 
        </View>
      </RCTModalHostView>
    );
  }

您要更改的状态属于使用模态组件的组件,该组件通过上层函数呈现其子项。状态更新时,它仅重新呈现其状态已更新的组件。在应用强制重新渲染之前,不会重新渲染。

这里有一篇很有帮助的文章,进一步说明了forcefully re-rendering the child component

的确切功能