首页 > 其他分享 >Vue自定义事件原理

Vue自定义事件原理

时间:2023-01-07 23:34:41浏览次数:42  
标签:Vue 自定义 money vm 组件 原理 data event

自定义事件的基本用法

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <div id="app">
      <Father></Father>
    </div>
    <template id="father">
      <div>
        <h1>父组件</h1>
        <p>子组件发过来的红包{{money}}</p>
        <Son @hongbao="givemoney"></Son>
      </div>
    </template>
    <template id="son">
      <div>
        <h1>子组件</h1>
        <button @click="give">给父组件发送红包</button>
      </div>
    </template>
    <script src="./vue.js"></script>
    <script>
      // 父组件
      Vue.component("Father", {
        template: "#father",
        data() {
          return {
            money: 0,
          };
        },
        methods: {
          givemoney(sonmoney) {
            this.money = sonmoney;
          },
        },
      });
      // 子组件
      Vue.component("Son", {
        template: "#son",
        data() {
          return {
            money: 3000,
          };
        },
        methods: {
          give() {
            this.$emit("hongbao", this.money);
          },
        },
      });
      let vm = new Vue({
        el: "#app",
      });
    </script>
  </body>
</html>

2:事件总线

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <Dwa></Dwa>
        <Ewa></Ewa>
    </div>
    <template id="dwa">
        <div>
            <h1>大娃</h1>
            <p>二娃组件发过来的红包{{money}}</p>
        </div>
    </template>
    <template id="ewa">
        <div>
            <h1>二娃</h1>
            <button @click="give">给大娃发红包</button>
        </div>
    </template>
    <script src="./vue.js"></script>
    <script>
        // 组件
        Vue.component('Dwa', {
            template: '#dwa',
            data() {
                return {
                    money: 1000
                }
            },
            methods: {

            },
            mounted() {
                this.$on('hongbao', (money) => {
                    console.log(money)
                })
                this.$emit('hongbao', this.money)
            }

        })
        // 组件
        Vue.component('Ewa', {
            template: '#ewa',
            data() {
                return {
                    money: 3000
                }
            },
            methods: {
                give() {
                    Bus.$emit('hongbao', this.money)
                }
            }
        })
        // 事件总线
        let Bus = new Vue()

        let vm = new Vue({
            el: '#app'
        })
    </script>
</body>

</html>

3:原理分析

// 事件中心
vm._events = {
    a: [fn],
    b: [fn, fn]
}
Vue.prototype.$on = function (event, fn) {
    var vm = this;
    if (Array.isArray(event)) {
        for (var i = 0, l = event.length; i < l; i++) {
            vm.$on(event[i], fn);
        }
    } else {
        (vm._events[event] || (vm._events[event] = [])).push(fn);
    }
    return vm
};

Vue.prototype.$emit = function (event) {
    var vm = this;
    var cbs = vm._events[event]; // 根据事件名找对应数组也是回调集合
    if (cbs) {
        var args = toArray(arguments, 1);
        for (var i = 0, l = cbs.length; i < l; i++) {
            cbs[i].apply(vm, args)
        }
    }
    return vm
};
// 监听事件
vm.$on(['a', 'b'], function (data) {
    // data是传过来的数据
})
vm.$on('b', function (data) {
    // data是传过来的数据
})
// 触发事件
vm.$emit('b', this.data)

 

 

标签:Vue,自定义,money,vm,组件,原理,data,event
From: https://www.cnblogs.com/z-bky/p/17033865.html

相关文章

  • Blazor与Vue标签代码的可维护性对比
    通过一个简单示例来进行对比,Vue的ElementUI组件的行内编辑:Blazor的AntDesginBlazor组件的行内编辑:区别:el-table-column的label属性相当于Column的Title属性,这个是没......
  • 07-自定义对象
    自定义对象基本概念在js中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等。对象是由属性和方法组成的。属性:事物的特征,在对象......
  • 【vue】Vue-router
    Vue-router安装npminstallvue-router--save-devvue-cli中已经选择安装了vue-router,那这里不需要重复安装了解读route路径```src/router/index.js``import......
  • 230107_50_RPC底层原理
    Stub已经实现:可以任意新增接口和方法都可以通过这个stub代理出一个对应的对象。新增一个IProductService接口和方法;如下:IProductService接口packagecom.bill.rpc.......
  • Flex布局原理【转载】
    引言CSS3中的FlexibleBox,或者叫flexbox,是用于排列元素的一种布局模式。顾名思义,弹性布局中的元素是有伸展和收缩自身的能力的。相比于原来的布局方式,如float、positio......
  • .net core Kestrel宿主服务器自定义监听端口配置
    .netcoreKestrel宿主服务器自定义监听端口配置http://t.zoukankan.com/williamwsj-p-9645095.html.netcoreKestrel宿主服务器自定义监听端口配置在.netcore的w......
  • Vue3 中的组件 provide和inject 传值、获取组件实例的方法getCurrentInstance()
     一、 provide和inject1:在父级组件中提供数据     语法:provide('提供给子组件的变量名',提供给子组件的数据)   2:在子级组件中获取收据  ......
  • asp.net core部署时自定义监听端口,提高部署的灵活性
    asp.netcore部署时自定义监听端口,提高部署的灵活性原文连接:http://www.manongjc.com/detail/51-deiojnabsarikgh.html用的是命令参数的方式,简单写的,代码很low,不喜勿喷!......
  • 安卓应用漏洞学习-Content Provider组件的自定义权限
    前期回顾漏洞免费实战部分-安卓应用层getLastPathSegment函数问题漏洞实战部分2-安卓应用ZipEntry对象问题实战漏洞实战部分3-ContentProvider组件的openFile接口问题......
  • vue-router的使用
    vue-router是vue基础工具的重要组成部分。通过简单的配置路由组件映射关系,可以实现vue页面轻松跳转。 什么是前端路由它是URL地址与组件之间的对应关系,通常使用Hash地......