【问题标题】:How to pass navigator reference to React Native <Drawer/>?如何将导航器引用传递给 React Native <Drawer/>?
【发布时间】:2016-11-25 22:57:28
【问题描述】:

在我的 index.ios.js 中使用 react-native-drawer (https://github.com/root-two/react-native-drawer),我进行了以下设置并尝试将“导航器”引用传递到 的内容的 中。我在 中使用 console.log(this.props.navigator) 但是传入了错误的导航器引用,当我尝试在 中执行类似于 this.props.navigator.replace() 时>

我怎样才能像传入renderScene 和configureScene 一样传入正确的导航器构造函数? :

class practice extends Component {
    ...
    renderScene(route, navigator){
        ...
    }

    configureScene(route, routeStack){
        ...
    }

    render() {
        return (
          <Drawer
            content={<DrawerPanel navigator={navigator}/>}
            ...
          >
            <Navigator
              configureScene={this.configureScene}
              initialRoute={{name: 'Login', component: Login}}
              renderScene={this.renderScene}
              style={styles.container}
              navigationBar={
                <Navigator.NavigationBar
                  style={styles.navBar}
                  routeMapper={NavigationBarRouteMapper(this.openDrawer)}
                />
              }
            />
         </Drawer>
    );
  }
}

提前谢谢你!

更新 3****

在我的&lt;DrawelPanel/&gt;

import HomePage from './HomePage'

render(){

var pr = this.props
var navigator = pr.getNav()

return (
    <View style={{flex:1, padding: 30, backgroundColor: 'black'}}>
        <MadeButton 
            componentName={HomePage}
            navigator={navigator}
            pageName='HomePage'
            style={{fontSize:15, fontWeight:'bold', color:'white'}}
        />
    </View>
)

然后在我的&lt;MadeButton/&gt;

  static propTypes = {
    componentName: React.PropTypes.any,
    navigator: React.PropTypes.any,
    pageName: React.PropTypes.string,
    style: React.PropTypes.object
  }

  _navigate(type='Normal'){
    this.props.navigator.replace({
      component: this.props.componentName,
      type: type,
      name: this.props.pageName
    })
  }

  render(){
    var pr = this.props;
    var st = this.state;
    var styles = pr.style;

    return(
      <TouchableHighlight onPress={() => this._navigate()}>
        <Text style={styles}>{pr.pageName}</Text>
      </TouchableHighlight>
    )
  }

【问题讨论】:

    标签: javascript ios react-native react-jsx


    【解决方案1】:

    这是应该的。您保存导航器参考表单renderScene 方法定义一个getter 方法,将该方法传递给您想要的组件。

    class practice extends Component {
        ...
        renderScene(route, navigator){
            this._navigator = navigator
        }
    
        configureScene(route, routeStack){
            ...
        }
         
        getNav = () => {
          return this._navigator
        }
    
        render() {
            return (
              <Drawer
                content={<DrawerPanel getNav={this.getNav}/>}
                ...
              >
                <Navigator
                  configureScene={this.configureScene}
                  initialRoute={{name: 'Login', component: Login}}
                  renderScene={(route, navigator) => this.renderScene(route, navigator)}
                  style={styles.container}
                  navigationBar={
                    <Navigator.NavigationBar
                      style={styles.navBar}
                      routeMapper={NavigationBarRouteMapper(this.openDrawer)}
                    />
                  }
                />
             </Drawer>
        );
      }
    }

    【讨论】:

    • 试过了,但在 renderScene() 中出现以下错误:“无法添加属性 _navigator,对象不可扩展”。可能是什么问题?
    • this 默认不绑定。你需要做renderScene={(route, navigator) =&gt; renderScene(route, navigator)}。我已更新示例以反映更改。
    • @AakashSigdel 明白了。所以在 renderScene 里面我有以下内容:this._navigator = navigator return ( &lt;route.component navigator={navigator} {...route.passProps}/&gt; ) 和里面 我console.log(this.props) 和导航器现在出来是未定义的Object {navigator: undefined}。我错过了什么吗?
    • @AakashSigdel 不用担心,但请查看我的原始帖子以及更新的代码。我在 DrawerPanel 中尝试了 console.log,但它没有记录允许您这样做的正确的导航器道具,this.props.navigator.replace()。可能是什么问题?
    • 那是因为在执行this_navigator = navigator时,已经传递了DrawerPanel的prop,没有设置状态就不会重新渲染,所以没有传递新的porp,因此未定义。我在更新中提到的getter方法是有效的,因为函数总是在导航器的范围内,所以当你从DrawerPanel调用它时,它可以得到导航器。这有意义吗?
    【解决方案2】:

    我认为你错了。如果使用 ,则不应与 具有相同的父节点。

    const Drawer = <Drawer
                      content={<DrawerPanel navigator={navigator}/>}
                      ...
                   />
    <Navigator
      initialRoute={{ name: 'Drawer', component: Drawer }}
      renderScene={(route, navigator) =>
      configureScene={(route) => {
        return Navigator.SceneConfigs.VerticalDownSwipeJump;
      }}
      renderScene={(route, navigator) => {
        let Component = route.component;
        return <Component {...route.params} navigator={navigator} />
       }} />
      }
    />
    

    【讨论】:

    • 我在原帖中添加了更多细节。请看一下。真的做错了吗?我被告知应该是这样设置的。
    • 我知道你的意思!我想也许&lt;Drawer /&gt; 不是一个可以使用Navigator 的容器。就像模型在 0.17.0 中不能使用 ScrollView
    • 那我该如何在 中使用 this.props.navigator.replace() 之类的函数呢?
    【解决方案3】:

    在更新 2 中,您已完成:var navigator = pr.getNav。这只会将 getNav 函数分配给您刚刚定义的 navigator 变量。所以这里的导航器只是对 getNav 函数的引用。

    您需要做的是var navigator = pr.getNav(),然后将导航器传递给MadeButton。希望是澄清事情。

    【讨论】:

    • 啊,明白了。按照建议尝试但收到错误Cannot read property 'replace' of undefined。所以我在MadeButton 中尝试了console.log(this.props.navigator),但得到了undefined。不知道这是否是问题所在,但这就是我在 MadeButton:&lt;TouchableHighlight onPress={() =&gt; this._navigate()}&gt;...&lt;/TouchableHighlight&gt; 和 _navigate()、this.props.navigator.replace({...}) 中调用 navigator.replace 的方式。
    • 在执行 getNav() 之后,您是否在 DrawerPanel 上获取导航器对象。您也可以更新问题吗?
    • 我用 UPDATED 3**** 下的更新代码更新了原始帖子。请看一下。有一个非常奇怪的案例。有时,通过 pr.getNav() 可以正确获取导航器并且 &lt;MadeButton/&gt; 可以正确导航。但有时,当模拟器刷新时,导航器未定义,因此&lt;MadeButton/&gt; 会出现错误:Cannot read property "replace" of undefined。我很困惑可能是什么错误......
    • 只是再次签到看看你是否看过我之前的评论。谢谢!
    • 如果您看过我之前的评论,能否告诉我?
    猜你喜欢
    • 2022-11-11
    • 1970-01-01
    • 2022-11-10
    • 2017-10-20
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    相关资源
    最近更新 更多