React Native 克隆的子组件不会随着道具的变化而重新渲染

Posted

技术标签:

【中文标题】React Native 克隆的子组件不会随着道具的变化而重新渲染【英文标题】:React Native cloned child component is not being rerendered as props change 【发布时间】:2017-10-01 22:21:22 【问题描述】:

我正在创建一个自定义导航器组件。我需要为 Navigator 的堆栈组件提供一个 navigator 道具,以允许它们像这样推送和弹出场景:

this.props.navigator.push(<Product id='4815'>)
this.props.navigator.pop()

为了实现这个结果,在我的 Navigator 类中,我使用了React.cloneElement()

class Navigator extends Component 

  constructor(props) 
    super(props)
    this.state =  stack: [this._addNavigator(props.children)] 
  

  _addNavigator(scene) 
    return React.cloneElement(scene, 
      navigator: 
        push: this.push,
        pop: this.pop,
        popToRoot: this.popToRoot
      
    )
  

  push(scene) 
    this.setState(
      stack: [...this.state.stack, this._addNavigator(scene)]
    )
  

  ...

  

一切都很好,除了特定场景。

class App extends Component 
  constructor(props) 
    super(props)
      this.state =  toggle: false 
  
  render() 
    return (
      <View>
        <TouchableOpacity onPress=() => 
          this.setState( toggle: !this.state.toggle )
        >
          <Text>Toggle</Text>
        </TouchableOpacity>
        <Navigator>
          <SampleScene backgroundColor=this.state.toggle ? 'green' : 'black' />
        </Navigator>
      </View>
    )
  

当我将一些可变属性传递给 Navigator 子组件时,只要该属性发生更改,子组件就不会重新渲染。在上面的示例中,SampleScene 的背景颜色保持黑色(因为 toggle 的 App 类初始状态设置为 false),尽管用户按下了切换按钮。似乎 SampleScene 的 render() 方法只被调用了一次。如何解决此问题?

【问题讨论】:

【参考方案1】:

问题解决了。在 Navigator 中,我不得不通过 componentWillReceiveProps 拦截新的 props。通过 setState 方法将堆栈设置为 newProps 的子项,使 Navigator 正确重新渲染。

【讨论】:

以上是关于React Native 克隆的子组件不会随着道具的变化而重新渲染的主要内容,如果未能解决你的问题,请参考以下文章

React Native 更改 let 值不会在子组件中更改为道具

从克隆的 React 组件中删除一个道具

React native 不在组件之间传递道具?

react-native 中的小问题活动指标 |组件 |组件内的道具 |道具 |设置状态

react native:TouchableOpacity 组件上的样式道具

React Native 数组道具混淆