轻松get!uniapp、小程序携数据返前页不刷新秘籍
2023-01-23 12:37:36
数据返回上一页而不刷新页面的巧妙原理
在Uniapp和微信小程序中,我们经常需要实现数据返回上一页而不用重新加载整个页面的功能。这种做法的核心就在于复用上一页的WebView,而不是重新加载它。
要做到这一点,我们需要利用WebView的URL。通过修改URL的查询字符串(query string),我们可以将数据传递到上一页。查询字符串的格式通常为:key1=value1&key2=value2
。
Uniapp实现数据返回
在Uniapp中,我们可以使用uni.navigateTo()
方法来实现这一功能。它的第二个参数可以用来传递数据。例如,我们要传递一个名为“name”的数据,可以这样写:
uni.navigateTo({
url: '../pages/index/index?name=张三',
})
在上一页,我们可以使用uni.getCurrentPages()
获取当前页面的WebView对象,然后调用evaluateJavaScript()
方法来获取查询字符串中的数据。例如,要获取“name”的值:
const pages = uni.getCurrentPages()
const currentPage = pages[pages.length - 1]
const webView = currentPage.$getAppWebview()
webView.evaluateJavaScript('uni.getLaunchOptionsSync().query', (res) => {
console.log(res)
})
微信小程序实现数据返回
在微信小程序中,可以使用wx.navigateTo()
方法来实现数据返回。同样,它的第二个参数用于传递数据。例如,传递“name”:
wx.navigateTo({
url: '../pages/index/index?name=张三',
})
在上一页,我们可以使用wx.getCurrentPages()
获取当前页面的WebView对象,然后调用evaluateJavaScript()
方法来获取查询字符串中的数据。例如,要获取“name”的值:
const pages = wx.getCurrentPages()
const currentPage = pages[pages.length - 1]
const webView = currentPage.$getAppWebview()
webView.evaluateJavaScript('wx.getLaunchOptionsSync().query', (res) => {
console.log(res)
})
注意点
需要注意以下几点:
- 数据只能通过查询字符串传递,不能通过body或header。
- 数据大小有限制。
- Uniapp中,如果上一页的WebView被销毁,无法通过evaluateJavaScript()获取数据。
- 微信小程序中,如果上一页的WebView被销毁,无法通过evaluateJavaScript()获取数据。
常见问题解答
问:为什么不能使用body或header传递数据?
答:因为WebView只支持通过查询字符串传递数据。
问:数据大小限制是多少?
答:具体限制取决于Uniapp或微信小程序的版本。
问:如何在Uniapp中判断上一页的WebView是否被销毁?
答:可以使用getCurrentPages()
方法,如果上一页不在页面栈中,则说明WebView已被销毁。
问:如何在微信小程序中判断上一页的WebView是否被销毁?
答:与Uniapp类似,可以使用getCurrentPages()
方法来判断。
问:如何传递复杂数据,比如数组或对象?
答:复杂数据可以先转换成JSON字符串,然后再传递。