码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 手撕Vue-实现事件相关指令


    合集 - 手写Vue全家桶(14)
    1.Vue双向数据绑定原理-上09-272.Vue双向数据绑定原理-中09-303.Vue双向数据绑定原理-下09-304.手撕Vue-构建Vue实例10-035.手撕Vue-提取元素到内存10-146.手撕Vue-查找指令和模板10-157.手撕Vue-编译指令数据10-158.手撕Vue-编译模板数据10-159.手撕Vue-监听数据变化10-1510.手撕Vue-数据驱动界面改变上10-1511.手撕Vue-数据驱动界面改变中10-1512.手撕Vue-数据驱动界面改变下10-1913.手撕Vue-界面驱动数据更新10-21
    14.手撕Vue-实现事件相关指令10-21
    收起

    经过上一篇文章的学习,实现了界面驱动数据更新,接下来实现一下其它相关的指令,比如事件相关的指令,v-on 这个指令的使用频率还是很高的,所以我们先来实现这个指令。

    v-on 的作用是什么,是不是可以给某一个元素绑定一个事件。

    紧接着了解了 v-on 的作用之后,我在 example.html 的结构代码当中添加了一个 div 用 v-on 绑定了一个点击事件,然后在 methods 当中添加了一个 myFn 的方法,然后在点击事件触发的时候调用了 myFn 方法。

    
    
    
        
        Vue基本模板
        
    
    
    
    我是div

    如上已经将基本的结构搭建完毕了,现在需要做的事情就是需要处理一下 v-on 这个指令。

    首先来看我们自己编写的 Nue 源码,在创建 Nue 实例的时候, 调用了 new Compiler(this);,进入 Compiler,constructor 方法继续往下看, 在进入 this.buildTemplate(fragment);,遍历所有的节点,判断是否是一个元素时,调用了 this.buildElement(node);, 进入 buildElement 方法,可以看到之前就是在这里处理了 v-model 这个指令,现在我们需要在这里处理 v-on 这个指令。

    我先将 name, value 打印到控制台,输出结果如下:

    type text
    v-model name
    v-on:click myFn
    

    可以得出如果我们编写的是 v-model,那么 name 就是 v-model,value 就是 name,如果编写的是 v-on:click,那么 name 就是 v-on:click,value 就是 myFn。

    知道了这些信息之后就可以开展下一步了,我在将 name 按照 : 进行分割一次就会拿到的是 v-on 与 click,click 就是待会我们要注册的事件类型,在用解构的方式将 name, value 取出来,代码如下:

    let [directiveName, directiveType] = name.split(':');
    

    directiveName 就是 v-on,directiveType 就是 click。

    然后再将之前的代码 name.split('-'); 改写为 directiveName.split('-');, 这个时候我们将解构出来的结果如下:

    model
    on
    

    这个时候就可以在之前的工具类当中添加一个 on 方法, 来用处理 v-on,在添加 on 方法之前,改造一下根据指令名称, 调用不同的处理函数的代码,将之前的代码改写为如下:

    CompilerUtil[directive](node, value, this.vm, directiveType);
    

    多了一个 directiveType 参数,这个参数就是指令的类型,比如 v-on:click,那么 directiveType 就是 click,这个时候就可以在工具类当中添加一个 on 方法了,代码如下:

    on: function (node, value, vm, type) {
        node.addEventListener(type, (e) => {
            alert('事件注册成功了');
        });
    }
    

    这个时候我们在页面上点击 div 的时候,就会弹出一个提示框,说明事件注册成功了。

    image-20231021102245038

    事件注册成功了是没问题,但是这个事件执行的内容,是自己的,并不是通过 v-on 绑定的,所以我们需要将这个事件执行的内容改为通过 v-on 绑定的,这个时候就需要用到之前的 methods 对象了,我们需要通过 methods 对象来获取到对应的方法,然后将这个方法执行。

    接下来要改造一下创建 Nue 实例的时候,将 methods 保存起来,改造一下 Nue 的构造函数,以后在根据对应的方法名称,获取到对应的方法, 再执行即可,代码如下:

    this.$methods = options.methods;
    

    image-20231021103538146

    改造完毕之后,我们就可以在工具类当中的 on 方法当中,通过 methods 对象获取到对应的方法,然后执行即可,代码如下:

    on: function (node, value, vm, type) {
        node.addEventListener(type, (e) => {
            vm.$methods[value](e);
        });
    }
    

    这个时候我们在页面上点击 div 的时候,就会弹出一个提示框,说明事件注册成功了,并且事件执行的内容也是通过 v-on 绑定的。

    image-20231021163138741

    在 myFn 方法中打印一下 this,发现并不是 Nue 的实例,而是 myFn 本身:

    image-20231021164157119

    这个时候就需要将 myFn 的 this 改为 Nue 的实例,这个时候就需要用到 call 方法了,代码如下:

    node.addEventListener(type, (e) => {
        vm.$methods[value].call(vm, e);
    });
    

    call 方法的第一个参数是改变 this 的指向,第二个参数是传递的参数,这个时候我们在 myFn 方法中打印一下 this,发现已经是 Nue 的实例了。

    image-20231021164018995

    到此为止,v-on 指令的实现已经完成了。

  • 相关阅读:
    编译支持GPU的opencv,并供python的import cv2调用
    小波去噪算法的简易实现及其扩展(小波锐化、高斯拉普拉斯金字塔去噪及锐化)之一。
    “5G+北斗”赋能千行百业,中海达亮相2023中国移动全球合作伙伴大会
    如何选择合适的域名注册商?需要考虑哪些方面因素?
    2022年0704-Com.Java.Basis 第十三课 《Java中的异常处理》经历前面的十二课的学习:我在思考在Java中报错如何处理
    Azure Data Factory(八)数据集验证之服务主体(Service Principal)
    vue3的Watch使用详解
    Java SE 9 模块化示例
    【canvas】前端创造的图片粒子动画效果:HTML5 Canvas 技术详解
    Linux 本地 Docker Registry本地镜像仓库远程连接
  • 原文地址:https://www.cnblogs.com/BNTang/p/17779199.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号