微信小程序页面返回传值的4种解决方案汇总

2022-04-15 0 776
目录
  • 使用场景
  • 解决方案
    • 1、使用globalData实现
    • 2、使用本地缓存Storage实现
    • 3、使用小程序的Page页面栈实现
    • 4、使用wx.navigateTo API的events实现
  • 总结

    使用场景

    小程序从A页面跳转到B页面,在B页面选择一个值后返回到A页面,在A页面使用在B页面选中的值。例如:在购买订单页面跳转到地址列表,选择完地址以后回退到订单页面,订单页面的配送地址需要同步更新。

    解决方案

    常见的比容要容易解决的方案是使用小程序的全局存储globalData、本地缓存storage、获取小程序的页面栈,调用上一个Page的setData方法、以及利用wx.navigateTo的events属性监听被打开页面发送到当前页面的数据。下面给大家简单对比下四种方法的优缺点:

    1、使用globalData实现

    //page A
    const app = getApp() //获取App.js实例
    onShow() {//生命周期函数--监听页面显示
      if (app.globalData.backData) {
        this.setData({ //将B页面更新完的值渲染到页面上
          backData: app.globalData.backData
        },()=>{
         	delete app.globalData.backData //删除数据 避免onShow重复渲染
        })
      }
    }
    //page B
    const app = getApp() //获取App.js实例
    changeBackData(){
       app.globalData.backData = '我被修改了'
       wx.navigateBack()
    }
    

    2、使用本地缓存Storage实现

    //page A
      onShow: function () {
        let backData = wx.getStorageSync('backData')
        if(backData){
           this.setData({
         		 backData
        	},()=>{
         		 wx.removeStorageSync('backData')
        	})
        }
      },
     //page B
     changeBackData(){
        wx.setStorageSync('backData', '我被修改了')
        wx.navigateBack()
     },
    

    3、使用小程序的Page页面栈实现

    使小程序的页面栈,比其他两种方式会更方便一点而且渲染的会更快一些,不需要等回退到A页面上再把数据渲染出来,在B页面上的直接就会更新A页面上的值,回退到A页面的时候,值已经被更新了。globalData和Storage实现的原理都是在B页面上修改完值以后,回退到A页面,触发onShow生命周期函数,来更新页面渲染。

    //page B
    changeBackData(){
        const pages = getCurrentPages();
        const beforePage = pages[pages.length - 2]
        beforePage.setData({  //会直接更新A页面的数据,A页面不需要其他操作
          backData: "我被修改了"
        })
    }
    

    4、使用wx.navigateTo API的events实现

    wx.navigateTo的events的实现原理是利用设计模式的发布订阅模式实现的,有兴趣的同学可以自己动手实现一个简单的,也可以实现相同的效果。

    //page A
     goPageB() {
        wx.navigateTo({
          url: 'B',
          events: {
            getBackData: res => { //在events里面添加监听事件
              this.setData({
                backData: res.backData
              })
            },
          },
        })
      },
    //page B	
    changeBackData(){
        const eventChannel = this.getOpenerEventChannel()
           eventChannel.emit('getBackData', {  
         	 backData: '我被修改了'
        });
         wx.navigateBack()
     }
    

    总结

    1和2两种方法在页面渲染效果上比后面两种稍微慢一点,3和4两种方法在B页面回退到A页面之前已经触发了更新,而1和2两种方法是等返回到A页面之后,在A页面才触发更新。并且1和2两种方式,要考虑到A页面更新完以后要删除globalData和Storage的数据,避免onShow方法里面重复触发setData更新页面,所以个人更推荐大家使用后面的3和4两种方式。

    到此这篇关于微信小程序页面返回传值的4种解决方案的文章就介绍到这了,更多相关微信小程序页面返回传值内容请搜索NICE源码以前的文章或继续浏览下面的相关文章希望大家以后多多支持NICE源码!

    免责声明:
    1、本网站所有发布的源码、软件和资料均为收集各大资源网站整理而来;仅限用于学习和研究目的,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 不得使用于非法商业用途,不得违反国家法律。否则后果自负!

    2、本站信息来自网络,版权争议与本站无关。一切关于该资源商业行为与www.niceym.com无关。
    如果您喜欢该程序,请支持正版源码、软件,购买注册,得到更好的正版服务。
    如有侵犯你版权的,请邮件与我们联系处理(邮箱:skknet@qq.com),本站将立即改正。

    NICE源码网 JavaScript 微信小程序页面返回传值的4种解决方案汇总 https://www.niceym.com/30064.html