教你如何實現頁面間的資料通訊

華為開發者論壇發表於2021-07-05

場景描述

某些情況下,開發者可能需要實現頁面間的訊息傳遞來獲取資料,例如A頁面跳轉至B頁面後,B頁面傳送訊息給A頁面,A頁面能夠接收到。此時可以透過訊息通道的機制來實現頁面間的相互通訊。


實現思路

頁面 messageChannel建立了訊息通道,並接收訊息。跳轉到頁面test,在頁面test透過訊息通道傳送訊息。頁面messageChannel收到訊息後透過toast展示出來。


解決方法

頁面messageChannel.ux檔案:

<template>
    <div class="item-container">
        <input type="button" onclick="creatChannel" value="建立訊息通道"/>
        <input type="button" onclick="routeChannel" value="跳轉到detail頁面傳送訊息"/>
        <input type="button" onclick="cancelChannel" value="關閉訊息通道"/>
    </div>
</template>
<style>
    .item-container {
        margin-bottom: 50px;
        flex-direction: column;
        justify-content:center;
    }
    input{
      margin-bottom: 70px;
    }
</style>
<script>
    import prompt from '@system.prompt'
    import router from "@system.router"
    var channel;
    export default {
        data: {
            componentName: 'messageChannel'
        },
        onInit: function () {
            this.$page.setTitleBar({text: 'messageChannel'})
        },
        creatChannel: function () {
            channel = new BroadcastChannel('channel1');
            prompt.showToast({message: '建立訊息通道成功'});
            channel.onmessage = function (event) {
              console.log(event.data)
              prompt.showToast({message: '接受訊息:' + event.data});
          }
        },
        routeChannel: function () {
            router.push({
                uri: '/Test'
            });
        },
        cancelChannel: function () {
            channel.close();
            prompt.showToast({message: '關閉訊息通道成功'});
        }
    }
</script>

頁面test.ux檔案:

<template>
  <div class="item-container">
      <input type="button" onclick="postChannel" value="傳送訊息"/>
  </div>
</template>
<style>
  .item-container {
    margin-bottom: 50px;
    flex-direction: column;
    justify-content:center;
  }
</style>
<script>
  export default {
      data: {
          componentName: 'detail',
      },
      onInit: function () {
          this.$page.setTitleBar({text: 'detail'})
      },
      postChannel: function () {
          var channel = new BroadcastChannel('channel1');
          channel.postMessage("hello world");
      }
  }
</script>

更多參考

快應用文件參考:

https://developer.huawei.com/consumer/cn/doc/development/quickApp-References/quickapp-script


原文連結: https://developer.huawei.com/consumer/cn/forum/topic/0201460275887380907?fid=0101271690375130218

原作者:Mayism

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69970551/viewspace-2779661/,如需轉載,請註明出處,否則將追究法律責任。

相關文章