javascript - react native : rendering conditional component based on state value change in Modal

标签 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 下的Modal 中调用了这个函数

现在根据 RN 文档,每当使用 this.setState() 方法更新状态变量时,组件应该重新渲染。其他一切正常(TouchableHighlight 样式发生变化)并且状态更新也反射(reflect)在控制台中。但是 _renderPicker 函数不会返回更改后的 View ,并且始终停留在父级初始化时设置的 View 上,如前所述。

有人能帮我指出我可能一直忽略的问题吗?另外请注意,所有这些调用实际上都是在主要的 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 方法移动到 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

关于javascript - react native : rendering conditional component based on state value change in Modal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53206388/

相关文章:

android - 有没有更好的方法从 React Native 打开 vcf 文件除了 Linking

javascript - fullcalendar.js - 将 for 循环插入模态

javascript - HTML Canvas 单击时的 z 索引

javascript - 每当 redux 形式的有效性发生变化时触发事件

javascript - 类型错误 : Cannot read property 'props' of undefined In a React function

javascript - 无法在 Enzyme 中模拟压力机,因为找不到节点

javascript - Electron webContents执行JavaScript : Cannot execute script on second on loadURL

javascript - 导入 JS 模块调用 HTML 表单提交

javascript - 在 React 中单击两个元素之间切换 className

android - PNG Logo 在 Android 5 (api v22) 的启动画面中显示两次并变形