uni-app之頁面通訊——uni.$emit、uni.$on、uni.$once、uni$off


uni.$emit(eventName,Object)

觸發全局的自定義事件,附加參數都會傳給監聽器回調函數。

屬性 類型 描述
eventName String 事件名
Object Object 觸發全局的自定義事件,附加參數都會傳給監聽器回調函數。

示例代碼如下:

 uni.$emit('update',{msg:'頁面更新'})

uni.$on(eventName,callback)

監聽全局的自定義事件,事件由 uni.$emit 觸發,回調函數會接收事件觸發函數的傳入參數。

屬性 類型 描述
eventName String 事件名
callback Function 事件的回調函數。

示例代碼如下:

uni.$on('update',function(data){
     console.log('監聽到事件來自 update ,攜帶參數 msg 為:' + data.msg);
})

uni.$once(eventName,callback)

監聽全局的自定義事件,事件由 uni.$emit 觸發,但僅觸發一次,在第一次觸發之后移除該監聽器。

屬性 類型 描述
eventName String 事件名
callback Function 事件的回調函數。

uni.$off([eventName, callback])

移除全局自定義事件監聽器。

屬性 類型 描述
eventName String 事件名
callback Function 事件的回調函數。
  • 如果uni.$off沒有傳入參數,則移除App級別的所有事件監聽器;
  • 如果只提供了事件名(eventName),則移除該事件名對應的所有監聽器;
  • 如果同時提供了事件與回調,則只移除這個事件回調的監聽器;
  • 提供的回調必須跟$on的回調為同一個才能移除這個回調的監聽器;

代碼示例

$emit$on$off常用於跨頁面、跨組件通訊,這里為了方便演示放在同一個頁面。

 1 <template>
 2         <view class="content">
 3             <view class="data">
 4                 <text>{{val}}</text>
 5             </view>
 6             <button type="primary" @click="comunicationOff">結束監聽</button>
 7         </view>
 8     </template>
 9 
10     <script>
11         export default {
12             data() {
13                 return {
14                     val: 0
15                 }
16             },
17             onLoad() {
18                 setInterval(()=>{
19                     uni.$emit('add', {
20                         data: 2
21                     })
22                 },1000)
23                 uni.$on('add', this.add)
24             },
25             methods: {
26                 comunicationOff() {
27                     uni.$off('add', this.add)
28                 },
29                 add(e) {
30                     this.val += e.data
31                 }
32             }
33         }
34     </script>
35 
36     <style>
37         .content {
38             display: flex;
39             flex-direction: column;
40             align-items: center;
41             justify-content: center;
42         }
43 
44         .data {
45             text-align: center;
46             line-height: 40px;
47             margin-top: 40px;
48         }
49 
50         button {
51             width: 200px;
52             margin: 20px 0;
53         }
54     </style>
  • uni.$emit、 uni.$on 、 uni.$once 、uni.$off 觸發的事件都是 App 全局級別的,跨任意組件,頁面,nvue,vue 等
  • 使用時,注意及時銷毀事件監聽,比如,頁面 onLoad 里邊 uni.$on 注冊監聽,onUnload 里邊 uni.$off 移除,或者一次性的事件,直接使用 uni.$once 監聽

參考網址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM