小程序页面之间数据传递的四种方法

Posted 爱倒腾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小程序页面之间数据传递的四种方法相关的知识,希望对你有一定的参考价值。

近期再使用小程序开发的时候遇到小程序页面和页面之间的数据传递问题。总结一下大致有以下几种方式实现页面数据传递。

最常见的就是路由传参,使用场景主要是页面汇总的少量数据的传递。以下都以Taro+vue示例,原生、react或者uniapp同理,替换以下关键字Taro即可

注意:以下的几种方式会把参数string化,例如: true -> ‘true’; 1 -> ‘1’

1. 少量数据传递

例如: 从A页面->B页面
使用页面跳转navigateBack 保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。

参数: 隔开,=相连
官方文档

A页面

  wx.navigateTo(
  	url: 'test?id=1'
  )

B页面

import  useDidShow, useRouter  from "@tarojs/taro"

// 在 show生命周期中获取
useDidShow(() => 
    const router: any = useRouter();
    const data = router.params ?? ; // 取router里面的params 
);

这种适用于数据量少的情况,也不建议复杂或者数据量打的时候使用该方法(个人建议而已-.-)

2. 数据量大或者相对复杂的数据传递

从A页面->B页面,适用于页面跳转数据量较多或者复杂的数据时
A页面

Taro.navigateTo(
  url: '/test',
  success: function(res) 
    // 通过 eventChannel 向被打开页面传送数据
    res.eventChannel.emit('test-data',  data: 'test' ) 
    // res.eventChannel.emit 第二个参数是要传递的数据 **第二个参数只能是key-value形式的对象**
  
)

B页面,在show生命周期中获取

 useDidShow(() => 
    const current = pages[pages.length - 1];
    const event = current.getOpenerEventChannel();
        event.on('test-data', params => 
            console.log(params); //  data: 'test' 
        );
    );

3. 返回上一个页面的数据传递

B页面->A页面,从B页面返回A页面时需要传递一些数据时。返回上一个页面navigateBack
示例:
B页面返回上一个页面

 // 获取全部页面
 let pages= getCurrentPages()
 // 获取前一个页面的序号
 let prevPage = pages[pages.length - 1]
 // 给前一个页面设置数据
 prevPage.setData(...)
 
 wx.navigateBack(
   delta: 1 // 返回一个页面
   // 返回的页面数,如果 delta 大于现有页面数,则返回到首页
 )

在A页面

useDidShow(async () => 
    const data = Taro.getCurrentInstance().page.data ;
    // 页面返回的参数
    )

4. 使用本地缓存

使用setStorageSyncgetStorageSync(建议在以上三种都不满足使用场景时使用该方法)

// set
 Taro.setStorageSync('test', data);
 // get
 Taro.getStorageSync('test')

目前接触就这四种,应该还有其他方式,只是常用这四种。欢迎补充和指正。

微信小程序 页面跳转的四种方式

wx.navigateTo(OBJECT)

这是最普遍的一种跳转方式,其官方解释为:“保留当前页面,跳转到应用内的某个页面”类似于html中的 window.location.href=" "

wx.navigateTo({
  url: 'test?id=1'
})

实际效果如下:

小程序中左上角有一个返回箭头,可返回上一个页面;

也可以通过方法 wx.navigateBack 返回原页面;

wx.redirectTo(OBJECT)

关闭当前页面,跳转到应用内的某个页面。类似于html中的 window.open('你所要跳转的页面');

wx.redirectTo({
  url: 'test?id=1'
})

效果如下:
左上角没有返回箭头,不能返回上一个页面;

wx.switchTab(OBJECT)

跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面;

app.json:

{
  "tabBar": {
    "list": [{
      "pagePath": "index",
      "text": "首页"
    },{
      "pagePath": "other",
      "text": "其他"
    }]
  }
}
wx.switchTab({
  url: '/index'
})


wx.navigateTowx.redirectTo 不允许跳转到 tabbar 页面,只能用 wx.switchTab 跳转到 tabbar 页面;

wx.reLaunch(OBJECT)

关闭所有页面,打开到应用内的某个页面。

wx.redirectTo 一样左上角不会出现返回箭头,但两者却不完全相同;

这里要提到小程序中的 getCurrentPages() 方法:

wx.navigateTo 中,每跳转一个新的页面,其原始页面就会被加入堆栈,通过调用 wx.navigateBack(OBJECT) 可通过获取堆栈中保存的页面返回上一级或多级页面;

wx.redirectTo 方法则不会被加入堆栈,但仍可通过 wx.navigateBack(OBJECT) 方法返回之前堆栈中的页面;

wx.reLaunch 方法则会清空当前的堆栈。

// 此处是A页面
wx.navigateTo({
  url: 'B?id=1'
})

// 此处是B页面
wx.navigateTo({
  url: 'C?id=1'
})

// 在C页面内 navigateBack,将返回b页面
wx.navigateBack({
  delta: 1
})
// 此处是B页面
wx.redirectTo({
 url: 'C?id=1'
})

// 在C页面内 navigateBack,则会返回a页面 
wx.navigateBack({
 delta: 1
})
// 此处是B页面
wx.reLaunch({
 url: 'C?id=1'
})

// 在C页面内 navigateBack,则无效

以上是关于小程序页面之间数据传递的四种方法的主要内容,如果未能解决你的问题,请参考以下文章

小程序丨页面跳转的四种方法

微信小程序 页面跳转的四种方式

微信小程序详解——页面之间的跳转方式路由和参数传递

小程序页面传递数据 、传递数组对象 小程序传值

小程序(5)传递数据

开发 | 如何在微信小程序的页面间传递数据?