美文网首页Hybird开发程序员
ReactNative中navigator.pop后如何实现数据

ReactNative中navigator.pop后如何实现数据

作者: Dony | 来源:发表于2016-03-31 13:00 被阅读6594次

    问题:不同Scene之间,如何保持数据一致性?后一个页面数据与前一个页面的数据有关联时,当后一个页面做个update操作并在navigator.pop()后,前一个页面的数据如何自动update?

       

    场景:上图A界面显示了用户的头像,点击头像进入B界面,点击B界面的头像进入C界面,在C界面进行头像上传操作,头像上传完毕后,从C界面返回B界面时,此时B界面的头像要能自动更换成新的,同理再从B界面后退到A界面时,A界面的用户头像也必须是更新后的新头像。问题来了,界面的后退操作一般都是使用navigator.pop(),这个方法只实现后退,react-native官方文档上没显示navigator.pop()可以带参数做回调操作,那么要如何解决A、B界面在C界面做了更改头像后自动更新头像的操作呢?

    ## 解决方案1:

    A界面进入B界面时,带上回调参数,如

    this.props.navigator.push({‘id’:’b’,’callback’:this.refreshAAvatar}

    在B界面进入C时,带上回调参数,如

    this.props.navigator.push({‘id’:’c’,’callback’:this.refreshBAvatar});

    在C界面完成修改操作后执行navigator.pop()之前执行

    this.route.callback();即可让B界面完成刷新头像操作

    在B界面点左上角的后退箭头时,判断是否有头像更新,有的话,调用this.route.callback(),通知A界面更新头像

    通过页面之间做回调处理,似乎可以解决此类问题,但是当多个页面都需要做数据刷新操作时,这样的回调就很繁锁,而且左上角的后退按钮本来是一个很单一职责的操作,现在由于更新需要,要被“承担”更多的职责,明显提高了界面之间的耦合度,这样的设计处理不理想。

    ## 解决方案2:

    借用DeviceEventEmitter的事件侦听处理机制,在A、与B页面的ComponentDidMount时,添加侦听器,在ComponentWillUnmount时删除侦听器

    A界面:

    import  {DeviceEventEmitter} from 'react-native';
    //…
    componentWillUnmount(){
        this.subscription.remove();
    };

    componentDidMount(){
        this.subscription = DeviceEventEmitter.addListener('changeAvatar’,this.refreshAAvatar);
    };
    this.refreshAAvatar(data){
        Console.warn(‘要更新的头像地址’,data);
    };

    B界面:

    import  {DeviceEventEmitter} from 'react-native';
    //…
    componentWillUnmount(){
        this.subscription.remove();
    };

    componentDidMount(){
        this.subscription = DeviceEventEmitter.addListener('changeAvatar’,this.refreshBAvatar);
    };

    this.refreshBAvatar(data){
        Console.warn(‘要更新的头像地址’,data);
    };

    C界面:

    import  {DeviceEventEmitter} from 'react-native';

    //当成功修改用户头像后,调用事件通知
    DeviceEventEmitter.emit('changeAvatar’,avatarUrl);

    在本解决方案中,A、B界面启用了侦听,当任何有修改头像时,只要修改者发送changeAvatar事件,就可以通知所有侦听changeAvatar事件的界面,是不是比解决方案1更简单?

    相关文章

      网友评论

      • 尹士鹏:如果A页面是个根页面,又存在多处地方跳转到根页面,那么根页面的监听会被绑定多次,这样以后别处触发监听,根页面的监听会执行多次。而且监听并不会随着页面销毁而销毁,必须手动关闭。
        Dony:@尹士鹏 现在有redux可以解决
      • 阿树:将头像数据存 reduce,AB 界面从 reduce 取不就好了嘛?
        Dony: @阿树 数据的更新很多地方都要用到,头像只是一例子
      • Ivor0057:DeviceEventEmitter应该和Android里的EventBus机制差不多,都是观察者模式的实现,在两个页面之间添加了监听和回调,完成了其对应关系 ,用起来很方便。
      • 简翦儋箪:方法一可以在写清楚一点么,能不能贴点具体的代码,从b页面返回到a页面是不是要在a页面定义一个参数,用来判断是否要刷新,还是什么意思呢?

      本文标题:ReactNative中navigator.pop后如何实现数据

      本文链接:https://www.haomeiwen.com/subject/opdncttx.html