非模块化 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>

在这里插入图片描述

  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yxp_xa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值