怎么开场对我来讲一个是个很纠结的问题,Emmm这应该算个好开场。
最近在作一个RN的app端调试工具,在把它嵌入原生app中的时候遇到了一个问题,RN组件里面接受不到原生传过来的initialProps?!javascript
先po一下问题缘由和答案,看官们有兴趣的话能够再看看下面的废话。
问题缘由:首先看下咱们通常怎么写,java
const AppWithDebug = createStackNavigator({ Home: { screen: App }, ...debugRoute }); AppRegistry.registerComponent(appName, () => AppWithDebug);
通常状况下,咱们会把createStackNavigator生成的对象,做为AppRegistry.registerComponent的入口文件,这个时候react-navigation在接收到initialProps以后并不会向下传递,而是只向下传递自身的navigation对象内容所以这个时候咱们在组件中就拿不到原生传过来的initialProps内容了。
解决方案:隔离入口,再也不使用createStackNavigator的结果去做为AppRegistry.registerComponent的入口,如react
const AppWithDebug = createStackNavigator({ Home: { screen: App }, ...debugRoute }); class AppEntry extends Component { render() { return <AppWithDebug screenProps={ this.props }/> } }; AppRegistry.registerComponent(appName, () => AppEntry);
react-navigation再也不处于项目入口的位置,入口处由一个包含了导航组件的组件代替。此时咱们在AppEntry组件中就能够直接经过this.props拿到initialProps的值了,再经过screenProps向下传递便可,AppWithDebug中能够经过this.props.screenProps获取initialProps的相关内容。
~~问题解决~~如下是爬坑过程~~git
碰到这个问题第一反应,什么鬼?官方文档是这么介绍的啊,github
这里的initialProperties注入了一些演示用的数据。在 React Native 的根组件中,咱们可使用this.props来获取到这些数据。--RN中文网
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL: jsCodeLocation moduleName: @"RNHighScores" initialProperties: @{ @"scores" : @[ @{ @"name" : @"Alex", @"value": @"42" }, @{ @"name" : @"Joel", @"value": @"10" } ] } launchOptions: nil]; 注:请忽略个人强行缩进,节省点你们横向拖动的时间
文档写的明明白白,难道我是个傻子?你传过来,我直接this.props.xxx,一点毛病没有啊,为啥拿不到?在去原生同窗那里一看他们的demo获取正常。。。app
这个时候就准备在本身的项目上开始各类骚操做尝试一下,可是没等我大展拳脚就发现本身可能掉进react-navigation的坑里了,由于最开始去获取initialProps的时候打印了一下this.props对象,发现只有navigation一个子属性,因而就把导航去掉试了一下发现initialProps的属性竟然就蹦出来了,这个时候基本就能够肯定问题出在react-navigation上了。
这个时候去react-navigation的github官网上查一下issue,就发现了这个
看样子楼主遇到了同样的问题,而且真的是一步一步的证实了react-navigation在这个上面的bug,但第一次看了一圈没找到答案,直到第二次才找到答案
看到这里,真的是恍然大悟,你应该也明白了吧~其实就是隔离入口工具
常常看到结论,会恍然大悟“哦 原来就这样啊 这么简单”。
其实不少时候答案并不复杂,咱们所或缺的是思考问题的方法,之因此写答案下面的这些”废话“,也是最近特别烦躁,常常会被问题卡住而且变得更烦躁,想给本身提个醒,让本身静一静。
目前的开发工做,除非是原创性的工做,通常状况下你遇到的问题都是别人遇到过的,只要去找,可能会很长时间,但终归仍是能够解决的,github的issue是个找答案的好地方,耐心寻找。
烦躁并不能解决问题,只会扰乱你的思路,因此不要被情绪左右你的理智。
~加油 你是最胖的~this