Uni-app返回上一頁面并攜帶參數(shù)的實現(xiàn)方法
一、前言
需要實現(xiàn)這么一個需求:在一個列表頁面,當子頁面直接返回時,不刷新列表頁面。但是當子頁面的數(shù)據(jù)有變動時,需要刷新列表頁面。本篇博客記錄一下我是如何解決這個問題的。
解決思路:在onShow()方法內(nèi)監(jiān)聽返回數(shù)據(jù),當是需要當前頁面刷新時,在子頁面設(shè)置一個標識符,當監(jiān)聽到這個標識符,就調(diào)用接口刷新數(shù)據(jù)。
在使用過程中遇到了些小坑,小白建議看完全部的內(nèi)容再選適合自己的方法解決,不要盲目copy代碼。
二、實現(xiàn)方法
1、第一個頁面 one.vue ,在onShow()方法內(nèi)監(jiān)聽返回的參數(shù),返回的參數(shù)在上一級頁面定義的變量叫‘isRefresh’;
<template>
<view>
<navigator hover-class="none" url="/pages/two/two">跳到第二個頁面</navigator>
</view>
</template>
<script>
export default {
data() {
return {
}
},
onShow() {
let that = this
uni.$on('isRefresh',function(data){
console.log('監(jiān)聽到事件來自返回的參數(shù):' + data);
// TODO 下面執(zhí)行刷新的方法
})
},
methods: {
}
}
</script>
<style>
</style>2、第二個頁面 two.vue,返回one.vue頁面,要傳遞的參數(shù)是index:1
<template>
<view>
<button @click="goBack">點擊返回上一頁</button>
</view>
</template>
<script>
export default {
data() {
return {
index:1,//返回上一頁要穿的參數(shù)
}
},
methods: {
goBack() {
uni.$emit('isRefresh', this.index)
uni.navigateBack({
delta: 1
})
}
}
}
</script>
<style>
</style>三、遇到的坑
當?shù)谝淮畏祷亓斜眄撁鏁r,沒有問題。第二次返回時,會監(jiān)聽兩次,第三次會監(jiān)聽三次,依次類推。查詢uni.$emit相關(guān)資料后發(fā)現(xiàn),這個是個全局的通訊事件。自 HBuilderX 2.0.0 起支持 uni.$emit、 uni.$on 、 uni.$once 、uni.$off ,可以方便的進行頁面的通訊 ,觸發(fā)的事件都是 App 全局級別的,跨任意組件,頁面,nvue,vue 等。事件詳情
調(diào)用事件后要記得移除事件,或者直接使用 uni.$once 只調(diào)用一次,用完會自動移除事件。
四、事件詳解
含義
1.uni.$emit(eventName,OBJECT):監(jiān)聽全局的自定義事件,事件由uni.emit 觸發(fā),回調(diào)函數(shù)會接收事件觸發(fā)函數(shù)的傳入?yún)?shù)。
其中eventName為事件名,OBJECT為觸發(fā)事件附加參數(shù)
示例代碼如下:
uni.$emit('update',{msg:'頁面更新'})2.uni.$on(eventName,callback):監(jiān)聽全局自定義事件,事件由uni.$emit()觸發(fā),回調(diào)函數(shù)會接收所有傳入的數(shù)。
eventName為事件名,callback為事件的回調(diào)函數(shù)。
示例代碼如下:
uni.$on('update',function(data){
console.log('監(jiān)聽到事件來自 update ,攜帶參數(shù) msg 為:' + data.msg);
})3.uni.$once:監(jiān)聽全局的自定義事件,事件由uni.emit 觸發(fā),但僅觸發(fā)一次,在第一次觸發(fā)之后移除該監(jiān)聽器。不需要手動移除監(jiān)聽。
4.uni.$off:移除全局自定義事件監(jiān)聽器。
因此,本次案例只需要使用 uni.$once 即可滿足需求,將 uni.$on 改成 uni.$once
<template>
<view>
<navigator hover-class="none" url="/pages/two/two">跳到第二個頁面</navigator>
</view>
</template>
<script>
export default {
data() {
return {
}
},
onShow() {
let that = this
uni.$once('isRefresh',function(data){
console.log('監(jiān)聽到事件來自返回的參數(shù):' + data);
// TODO 下面執(zhí)行刷新的方法
})
},
methods: {
}
}
</script>
<style>
</style>Tips
- 如果uni.$off沒有傳入?yún)?shù),則移除App級別的所有事件監(jiān)聽器;
- 如果只提供了事件名(eventName),則移除該事件名對應(yīng)的所有監(jiān)聽器;
- 如果同時提供了事件與回調(diào),則只移除這個事件回調(diào)的監(jiān)聽器;
- 提供的回調(diào)必須跟$on的回調(diào)為同一個才能移除這個回調(diào)的監(jiān)聽器;
示例:
<template>
<view class="content">
<view class="data">
<text>{{val}}</text>
</view>
<button type="primary" @click="comunicationOff">結(jié)束監(jiān)聽</button>
</view>
</template>
<script>
export default {
data() {
return {
val: 0
}
},
onLoad() {
setInterval(()=>{
uni.$emit('add', {
data: 2
})
},1000)
uni.$on('add', this.add)
},
methods: {
comunicationOff() {
// 因傳入了回調(diào)函數(shù),只會移除本頁面此回調(diào)函數(shù)的監(jiān)聽
uni.$off('add', this.add)
},
add(e) {
this.val += e.data
}
}
}
</script>
<style>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.data {
text-align: center;
line-height: 40px;
margin-top: 40px;
}
button {
width: 200px;
margin: 20px 0;
}
</style>到此這篇關(guān)于Uni-app返回上一頁面并攜帶參數(shù)的文章就介紹到這了,更多相關(guān)Uni-app返回上一頁攜帶參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用JavaScript + HTML實現(xiàn)表格滾動效果
本文介紹了如何使用HTML、CSS和JavaScript實現(xiàn)表格滾動效果,特別是在大屏展示或排行榜場景中,通過平滑滾動動畫,提升信息展示效率,支持數(shù)據(jù)動態(tài)更新和播放暫??刂?使用戶能夠高效瀏覽大量數(shù)據(jù),需要的朋友可以參考下2026-04-04
JavaScript對象_動力節(jié)點Java學院整理
這篇文章主要為大家詳細介紹了JavaScript對象的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
javascript中的__defineGetter__和__defineSetter__介紹
這篇文章主要介紹了javascript中的__defineGetter__和__defineSetter__介紹,類似面向?qū)ο笳Z言中的get和set關(guān)鍵字,需要的朋友可以參考下2014-08-08

