【问题标题】:React native: rendering conditional component based on state value change in ModalReact Native:Modal中根据状态值变化渲染条件组件
【发布时间】: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


【解决方案1】:

将 _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

【讨论】:

  • 嘿 @Ahsan 我的 {this._renderPicker()} 必须是已经进入渲染方法的模式的一部分。也只是为了将它放在渲染方法中的信息并没有真正进行任何更新。
  • 您能否更新问题并提供渲染方法的完整代码...或至少提供与您的问题相关的所有代码
  • 嘿抱歉,我已经更新了代码。渲染函数有 this._availabiltyModal(),它有两个 TouchableHighlight,然后是 this._renderPicker() 方法
  • 刚刚编辑了答案...这是我在查看实现并了解我所拥有的知识后的观察。
  • 你说得对,嵌套组件中的子组件永远不会重新渲染,直到在 componentWillReceiveProps() 的帮助下更新子组件的道具。谢谢您的帮助! :)
猜你喜欢
  • 2020-05-16
  • 2019-05-23
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 2021-09-20
  • 2021-10-22
  • 2019-07-11
  • 1970-01-01
相关资源
最近更新 更多