当前位置: 首页 > article >正文

【快应用】快应用学习之兄弟组件通信

【关键词】

兄弟组件通信、Publish/Subscribe模式

【实现方案】

这里介绍利用框架本身提供的事件绑定接口来模拟Publish/Subscribe模式实现兄弟组件通信的方法。

一、实现步骤及代码

1、一个子组件定义Sub 端的逻辑处理,有processMessage、customEventInVm2(当然也可以定义Pub端如sendMsg)

<template>
  <div class="tutorial-page" style="flex-direction: column;">
    <text class="tutorial-title">二弟:</text>
    <text>处理消息:{{msg}}</text>
    <text>事件内容:{{eventDetail}}</text>
    <input type="button" value="点击给大哥发送消息" onclick="sendMsg" class="input-ed"/>
  </div>
</template>

<style lang="less">
   .input-ed {
    width: 300px;
    height: 80px;
    font-size: 30px;
    background-color: #00bfff;
    border-radius: 20px;
  }
</style>

<script>
  import moment from 'moment'
  export default {
    props: [],
    data() {
      return {
        msg: '大家好,我是二弟',
        eventDetail: '大家好,我是二弟',
      }
    },
    sendMsg() {
      if (this.previousVm) {
        this.previousVm.receiveMsg('大哥,我是你二弟啊')
      }
    },
    processMessage(msg) {
      const now = moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
      this.msg = `${now}: ${msg}`
    },
    /**
     * 通过events对象:绑定事件
     */
    events: {
      customEventInVm2(evt) {
        const now = moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
        this.eventDetail = `${now}: ${evt.detail}`
      }
    }
  }
</script>

2、  兄弟组件可以通过父组件中建立相互引用达到相互持有的ViewModel目的,通过在生命周期onReady中执行establishRef实现

<!-- 父组件 -->
<import name="comp-part2" src="./part2"></import>
<import name="comp-part3" src="./part3"></import>

<template>
  <div class="tutorial-page" style="flex-direction: column;">
    <!-- 兄弟VM通信 -->
    <div>
      <comp-part2 id="sibling1"></comp-part2>
    </div>
    <div style="margin-top: 30px">
      <comp-part3 id="sibling2"></comp-part3>
    </div>
  </div>
</template>

<style lang="less">
</style>

<script>
  export default {
    onInit: function () {
        this.$page.setTitleBar({text: '父组件', textColor: '#4a90e2', backgroundColor: '#FFFFFF', backgroundOpacity: 0.5, menu: false})
    },
    onReady() {
      this.establishRef()
    },
    /**
     * 建立相互VM的引用
     */
    establishRef(evt) {
      const siblingVm1 = this.$vm('sibling1')
      const siblingVm2 = this.$vm('sibling2')
      siblingVm1.parentVm = this
      siblingVm1.nextVm = siblingVm2
      siblingVm2.parentVm = this
      siblingVm2.previousVm = siblingVm1

      siblingVm1.previousVm = siblingVm2
    }
  }
</script>

3、  另外一个子组件定义Pub 端,执行sendMessage即可完成触发(当然也可以定义Sub端,如receiveMsg)

<template>
  <div class="tutorial-page" style="flex-direction: column;">
    <text class="tutorial-title">大哥:</text>
    <text>处理消息:{{msg1}}</text>
    <input type="button" value="点击给二弟发送消息" onclick="sendMesssage" class="input-dg"/>
  </div>
</template>

<style lang="less">
  .input-dg {
    width: 300px;
    height: 80px;
    font-size: 30px;
    background-color: #00bfff;
    border-radius: 20px;
  }
</style>

<script>
  import moment from 'moment'
  export default {
    props: [],
    data() {
      return {
        msg1: '大家好,我是大哥',
      }
    },
    
    receiveMsg(msg) {
      const now = moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
      this.msg1 = `${now}: ${msg}`
    },
    sendMesssage() {
      if (this.previousVm) {
        // Way1. 调用方法
        this.previousVm.processMessage('二弟,我是你大哥啊')
        // Way2. 触发事件
        this.previousVm.$emit('customEventInVm2', '二弟,我是你大哥啊')
      }
    }
  }
</script>

二、效果图展示

cke_17412.pngcke_21993.png

【参考文档】

https://doc.quickapp.cn/tutorial/framework/parent-child-component-communication.html


http://www.kler.cn/a/136643.html

相关文章:

  • 计算机网络 (23)IP层转发分组的过程
  • python【数据结构】
  • SpringBoot环境和Maven配置
  • C语言的语法
  • 数据库回滚:大祸临头时
  • 【网络安全 | 漏洞挖掘】HubSpot 全账户接管(万字详析)
  • Vue框架学习笔记——创建Vue实例、实例与容器对应关系
  • C语言的5个内存段你了解吗?( 代码段/数据段/栈/堆)
  • Python将原始数据集和标注文件进行数据增强(随机仿射变换),并生成随机仿射变换的数据集和标注文件
  • 【C++ Primer Plus学习记录】for循环
  • 51.Sentinel微服务保护
  • 架构探索之路-第一站-clickhouse | 京东云技术团队
  • C++设计模式——单例模式
  • 基于单片机GPS轨迹定位和里程统计系统
  • 全国见!飞桨星河社区五周年,邀你共赴大模型盛宴!
  • 什么是调试和性能分析工具?
  • 【广州华锐互动】VR虚拟现实技术助力太空探险:穿越时空,探索宇宙奥秘
  • 第二证券:龙头公司大手笔回购 港股今年以来回购总额逼近千亿港元
  • 基于Java封装继承多态实现的一个简单图书系统
  • 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
  • clickhouse分布式之弹性扩缩容的故事
  • MATLAB画图分辨率、图像大小研究
  • 使用drawio的图层构建更强大的图表
  • 剪辑视频怎么把说话声音转成文字?
  • 【面试】你有使用过链路追踪技术吗?
  • 什么样的企业可以使用免费版的CRM?