React Native踩坑之路 — static navaigationOptions中使用this

我的场景:在导航栏右侧自定义按钮进行一些跳转或者什么操作,需要有点击事件和state动态改变。

我的第一反应,很简单嘛,直接 onPress={this.go()} 和 this.state.num 就可以了啊。

但是,事情并没有那么简单的。

在我的static navaigationOptions 中根本无法直接获取到当前页面的this,像上面那样的使用会报错 undefined。

既然直接不能使用,那只能是通过参数把要用到的东西传进去啦!想函数go(),我们将函数的引用传递给navaigationOptions,在navaigationOptions中进行调用,是不是就可以找到了,同样,state的值也可以传过去。

具体使用如下:

1. 在componentDidMount中设置参数,以便传给navaigationOptions。在componentDidMount中是为了保证函数和state已被初始化

componentDidMount() {  
    this.props.navigation.setParams({navigatePress:this.go,selectNum:this.state.num});
}

2. 在navaigationOptions —> headerRight中使用params获取点击事件,在需要用到state的地方获取参数selectNum

static navigationOptions = ({navigation}) => {
    return {
        title: '选择联系人',
        headerRight:(
            <TouchableOpacity onPress={() => navigation.state.params.navigatePress()}>
                <View><Text>确定({navigation.state.params?navigation.state.params.selectNum:0})</Text></View>
            </TouchableOpacity>
        ),
    }
};

这样就可以正常获取了。

【补充:调用state时“navigation.state.params?navigation.state.params.selectNum:0”这样写,是因为在我使用的时候会传两次参数,第一次传过去的params是undefined,也没找到具体原因,所以就用三元运算符判断了一下,不作为参考】

还有,由于state值在setState之后会变化,但是componentDidMount只会在组件挂载之后调用一次,state更新引发都render并不会影响componentDidMount,所以,我在state更新都地方重新设置了state参数,像下面这样:

getContactsItem = (data) => {
    this.setState({
        num:data.selectNum,
    });
    //更新state
    this.props.navigation.setParams({selectNum:data.selectNum});
}

这样,我想要的效果就有了。如果有任何不对或者不合适的地方,欢迎指正。如果有更好的解决方法,也欢迎讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值