非模块化 Vue 开发的 bus 总线通信

个人感觉,JavaScript 非模块开发更适合新人上手,不需要安装配置一大堆软件环境,不需要编译,适合于中小项目开发,只需要一个代码编辑器即可开发,例如 vsCode。网页 html 文件通过 script 标签引入 JavaScript 脚本即可运行于各种浏览器,搭载一些 vue 常用工具,如 httpVueLoader 和 vue-router 工具,可以轻松实现 Vue 组件化以及路由功能,本文先练习一下 Vue 组件间的总线通信传值方式,组件的父子传值默认单向的 props,总线通信则不受组件级别影响,可以任意传递信息。
非模块化的 vue 已经集成了 bus 通信,使用起来甚至比模块化的 vue 还简便,不需要引用多余文件,接收信息用 this. o n ,发送信息用 v m . on,发送信息用 vm. on,发送信息用vm.emit 即可实现全局通信。

主文件 index.html 如下 ,(接收 m2.vue 发来的消息)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="/framework/vue-2.7.16.min.js"></script>
    <script src="/framework/httpVueLoader.min.js"></script>
    <title>非模块化 Vue 开发</title>
</head>
<body>
    <div id="vue2x">
        <h1> 萨瓦迪卡 </h1>
        <todo-item></todo-item>
        <span>{{cd}}</span>
        <ol> <todo-item v-for="item in menu" :todo="item"></todo-item> </ol>
        <!-- 父组件向子组件传递消息,必须用 :name=name 的形式 -->
        <part-item :post='post'></part-item>
    </div>
    <script>
        var vm = new Vue({
            el: '#vue2x',
            data: {  // 这里和组件内参数 post 保持一致,语法要求必须定义,值可以不定义
                cd: '',
                post: undefined,
                menu: [
                    { id: 1, text: '炒菜' },
                    { id: 2, text: '馄饨' },
                    { id: 3, text: '餐厅的特色菜品' }
                ]
            },
            methods: {},
            components: {
                "todo-item": httpVueLoader('m1.vue'),
                "part-item": httpVueLoader('m2.vue')
            },
            mounted: function () {
                this.$on('eventName', e => { this.cd = e; });
            },
            beforeDestroy() { this.$off('eventName'); }
        });
    </script>
</body>
</html>

相同目录下的 m1.vue 文件,(接收 m2.vue 发来的消息)

<template>
    <li>{{ todo.text }}</li>
</template>

<script>
module.exports = {
    // 对象接收参数的方法 validator 和 required 在 vue 生产模式不起作用
    props: {
        todo:
        {
            type: Object,
            required: true,
            default: { id: 0, text: '请问您想吃点啥' }
        }
    },
    methods: {},
    mounted: function () {
        vm.$on('eventName', e => { console.log('组件1收到的消息:', e); });
    },
    beforeDestroy() {
        vm.$off('eventName'); // 确保在组件销毁前取消事件监听
    }
}
</script>

相同目录下的 m2.vue 文件,发送消息

<template>
    <div>
        <div>组件2参数 : {{ arg }}</div>
        <input type="text" v-model="arg">
        <div class="sr">{{ post }}</div>
        <button @click="sendmsg">发送消息</button>
    </div>
</template>
<script>
module.exports = {
    // 接收主程序单向传来的参数,可以用数组 [arg1, arg2] 接收,也可以用对象 {} 接收
    // props: ['todo'] 接收参数也可以,但是这种数组方法无法实现默认赋值效果
    props: { post: { tpye: String, default: '总线通信测试' } },
    data() { return { arg: '' } },
    methods: {
        sendmsg: function () { vm.$emit('eventName', this.arg); }
    }
}
</script>

<style scoped>
.sr {
    font-size: larger;
    color: red;
    background-color: bisque;
}
</style>

在这里插入图片描述

相关推荐

  1. vue3跨组件(多组件)通信:事件总线【Event Bus

    2024-05-11 04:18:03       37 阅读
  2. VueVuex模块使用小结

    2024-05-11 04:18:03       8 阅读
  3. vue组件模块

    2024-05-11 04:18:03       33 阅读

最近更新

  1. gradle安卓开发软件简介

    2024-05-11 04:18:03       0 阅读
  2. UE5.2 AI实时抠像(无需绿幕) + OBS推流直播 全流程

    2024-05-11 04:18:03       0 阅读
  3. 微软Edge浏览器全解析

    2024-05-11 04:18:03       0 阅读
  4. toString方法介绍

    2024-05-11 04:18:03       0 阅读
  5. LLM大语言模型知识点整理

    2024-05-11 04:18:03       0 阅读
  6. 使用Boost.Asio编写TCP通信程序框架(一)

    2024-05-11 04:18:03       0 阅读
  7. 导师好奇我为什么开发后端模版只花了一小时!

    2024-05-11 04:18:03       1 阅读
  8. android 7.0 tts文字转语音

    2024-05-11 04:18:03       1 阅读

热门阅读

  1. 笔记2024

    2024-05-11 04:18:03       12 阅读
  2. Python入门系列-03 matplotlib库安装

    2024-05-11 04:18:03       13 阅读
  3. Rancher简介

    2024-05-11 04:18:03       14 阅读
  4. Ansible

    Ansible

    2024-05-11 04:18:03      12 阅读
  5. php 修改 文件权限 函数chmod()

    2024-05-11 04:18:03       12 阅读
  6. webpack

    webpack

    2024-05-11 04:18:03      12 阅读
  7. [链表专题]力扣206, 203, 19

    2024-05-11 04:18:03       13 阅读