開發了一年的uni-app,在這里總結一些uni-app開發中的問題,提供幾個解決方法,分享給大家:
問題描述:一個主頁面,需要聯通一到兩個子頁面,子頁面傳值到主頁面,主頁面更新
問題難點:
首先我們需要一個邏輯模型(這里隨便畫了一個)
通過這個模型,我們可以看到一個問題,子頁面的內容怎么傳回主頁面,怎么讓這個傳回的方式更安全有效,這也是這個問題的難點,我總結了三種解決方法,在這里分享給大家:
第一種:url傳值
顧名思義,就是利用頁面的url方法來傳值,具體操作邏輯如下:
主頁面:用onload事件來獲取頁面初始化的url值,進行頁面刷新,跳轉到子頁面時用uni.redirectTo方法
子頁面:提交事件里將數據轉為url格式,跳轉回主頁面時用uni.redirectTo方法
案例:
主頁面:
<template> <view> <h1>opition.id</h1> <view @tap="totextfun">前往子頁面</view> </view> </template> <script> export default { data() { return { opition:{ } } }, onLoad(data){ this.opition = data }, methods: { //跳轉到子頁面 totextfun(){ uni.redirectTo({ url: '/pages/text/text1'}); } } } </script> <style> </style>
子頁面:
<template> <view> <view @tap="totextfun">跳轉回主頁面</view> </view> </template> <script> export default { data() { return { } }, methods: { //跳轉回主頁面事件 totextfun(){ uni.redirectTo({ url: '/pages/text/text?id=11'}); } } } </script> <style> </style>
優缺點:優點就是簡單,簡單,簡單,這個方法的實現邏輯的優勢是很簡單粗暴的,但是url傳值如果是微信小程序或者app還好,你要是用瀏覽器,那么你傳過去的值會被直接顯示在url里,數據不安全,而且還有一個問題,當我主頁面初始化時也是有url傳值過來的,那么主頁面跳轉到子頁面時也必須要用url把值傳遞過去,這樣寫太麻煩了,一個邏輯失誤會出大問題。
總結:這類方法適用於新人上手做一個dome來用,而且只能單對單頁面,子頁面如果歸屬於多個主頁面,那么會出現問題(除非你用url或者vuex解決)。
第二種:返回方法傳值
顧名思義,就是利用uni-app的getCurrentPages來獲取當前頁面與上一頁面的信息,通過修改上一頁面信息后返回的方法來實現,具體操作邏輯如下:
主頁面:用onshow事件執行初始化事件,進行頁面刷新,跳轉到子頁面時用uni.navigateTo方法
子頁面:提交事件里將數據轉為json格式,通過getCurrentPages獲取到上一級頁面的內容進行修改,跳轉回主頁面時用uni.navigateBack方法
案例:
主頁面:
<template> <view> <h1>opition.id</h1> <view @tap="totextfun">前往子頁面</view> </view> </template> <script> export default { data() { return { opition:{ } } }, onShow(){ //頁面跳轉回來要執行的事件 }, methods: { //跳轉到子頁面 totextfun(){ uni.navigateTo({ url: '/pages/text/text1'}); } } } </script> <style> </style>
子頁面:
<template> <view> <view @tap="totextfun">跳轉回主頁面</view> </view> </template> <script> export default { data() { return { } }, methods: { //跳轉回主頁面事件 totextfun(){ var pages = getCurrentPages();//當前頁 var beforePage = pages[pages.length - 2]; var json = { id:11 }; if(beforePage !=undefined){ if(beforePage.opition){//判斷是否為小程序,小程序的數據都在data里 beforePage.opition = json; }else{ beforePage.data.opition = json; } } uni.navigateBack(); } } } </script> <style> </style>
優缺點:優點是邏輯走通了,功能實現了,而且數據很安全的被傳回去了,但缺點也是有的,就是如果在子頁面刷新呢,因為獲取不到上一級頁面,代碼會報錯(也可以多加個判斷來進行處理),但是已經沒有返回上一個頁面帶傳值的功能了。
總結:這種方法雖然有缺點,但的確很實用,排除掉頁面刷新的情況,簡直無懈可擊,而且頁面刷新的的情況也可以直接調回首頁來處理,畢竟你都在子頁面刷新了,主頁面的東西肯定會沒掉,邏輯上已經走不通了。
第三種:Vuex傳值(需要學習vuex相關知識)
顧名思義,就是利用vuex來給數據提供一個暫時儲存的位置,從而實現數據的流通傳遞。
主頁面:用onshow事件來獲取vuex里的值,進行頁面刷新,跳轉到子頁面時用uni.redirectTo方法
子頁面:提交事件里將數據轉為json格式,通過vuex方法存到vuex的數據里,跳轉回主頁面時用uni.redirectTo方法
案例:
<template> <view> <h1>opition.id</h1> <view @tap="totextfun">前往子頁面</view> </view> </template> <script> //導入vuexjs import vuex from "@/store/index.js"; export default { data() { return { opition:{ } } }, onShow(){ //頁面跳轉回來要執行的事件 this.opition = vuex.state.opition; }, methods: { //跳轉到子頁面 totextfun(){ uni.redirectTo({ url: '/pages/text/text1'}); } } } </script> <style> </style>
子頁面:
<template> <view> <view @tap="totextfun">跳轉回主頁面</view> </view> </template> <script> //導入vuexjs import vuex from "@/store/index.js"; export default { data() { return { } }, methods: { //跳轉回主頁面事件 totextfun(){ var json = { id:11 }; vuex.commit("setOpition",json);//調用vuex來寫入json uni.redirectTo({ url: '/pages/text/text'}); } } } </script> <style> </style>
優缺點:優點是這個數據流程清晰,就算你刷新了也是可以達到數據流通的效果,但缺點也有,這個數據你需要一個上層入口來清除掉,不然你以后進入主頁面,通用信息還是會出現。
總結:這種方式也同樣很有效,適用於大型項目,它只要管理了入口,可以完美的形成一個閉環,不會有任何bug出現(反正我沒出現過問題)。
以上就是我對uni-app 多頁面傳值的三種解決方法,如果大家有其他更有效的方法,也歡迎分享到評論區( ̄▽ ̄)~*。