Vue自定义组件实现v-model指令

Tips: 本文所描述的Vue均默认是Vue2版本

在我们初次接触 Vue的时候,一定会了解到一个语法糖,那就是 v-model指令,它带给我们的第一印象就是它可以实现双向绑定

那么,什么是双向绑定?通俗一点来说,就是当数据发生变化的时候,视图同时发生变化,这可以说是 Vue的精髓之处了
(不过关于双向绑定,后续可以出一篇更为详尽的博文来深入模拟一下Vue的实现,这里重点还是探讨实现自定义组件的v-model指令)

所以,在我们深入使用 Vue之后,编写一个自定义组件,如何手动实现一个 v-model的指令呢,今天我们就来详细探讨一下

自定义组件中,必定会使用 v-bind指令来实现组件之间值的传递,所以在我还是菜鸟的那段时间,我一直有个疑惑,
既然有的 v-bind指令,为什么还需要在自定义的组件中实现 v-model指令呢?在我实践了一番之后,我才明白,
v-model既能够实现值的传递,也能够实现页面数据的实时变化,而 v-bind只是实现值的传递,如果需要实现实时变化的效果,
需要使用另外的方法修改变量的值,可以总结为下面两点

看到这里,相信你也理解了为什么我们会需要在自定义的组件中自定义一个v-model指令,下面我们通过一个简易的示例来撸一个 v-model
在此之前我们需要在一个空 Vue项目中,定义一个dad.vue文件,以及child.vue文件。
为了方便初学者学习,我将一个完整的简易示例项目放到了github仓库中供大家下载学习,
大家如果喜欢可以为了点一颗Star,Thanks♪(・ω・)ノ!!!

<template>

</template>

<script>
    import child from './child.vue';
    export default {
        name: 'dad',
        components: {
            child
        },
        data() {
            return {
                childName: '我是儿子'
            };
        },
        methods: {}
    };
</script>
<template>
    <!-- vue中的自定义组件中,若父组件中用v-model的话,其实相当于v-bind:value='***'并且v-on:input='***' -->
    <!-- 因此子组件内部用props接收value值,用$emit触发input事件,默认传递value值和input事件是模拟v-model的默认规则 -->
    <!-- 基础知识提示:@是v-on监听事件的简写,:是v-bind绑定属性的简写 -->
    <div class="box-v-model">
        <input type="text" class="input-v-model" :value="value" @input="inputChange">
        <!-- 简写的方式 -->
        <!-- <input type="text" @input="value=$event.target.value" :value="value" /> -->
        <div>{{ value }}</div>
    </div>
</template>

<script>
    export default {
        name: "child",
        props: {
            value: {
                type: String
            }
        },
        methods: {
            // $emit 方法可以触发当前实例上的事件,这里触发的事input事件,附加参数都会传给监听器回调
            // input 事件在用户输入时触发,它是在元素值发生变化时立即触发
            inputChange(e) {
                this.$emit("input", e.target.value);
            }
        }
    }
</script>

我是 fx67ll.com,如果您发现本文有什么错误,欢迎在评论区讨论指正,感谢您的阅读!
如果您喜欢这篇文章,欢迎访问我的 本文github仓库地址,为我点一颗Star,Thanks~ 😃
转发请注明参考文章地址,非常感谢!!!

Original: https://www.cnblogs.com/fx67ll/p/15458182.html
Author: fx67ll
Title: Vue自定义组件实现v-model指令

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/599359/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java数据结构和算法

    一、数据结构 数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同…

    数据库 2023年6月11日
    0102
  • Java面试题(五)–Rabbits

    1、什么是MyBatis? 1、Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建…

    数据库 2023年6月16日
    0110
  • form表单上传文件及后端获取文件

    写在前面(强调) 使用form表单上传文件时必须要干的两件事: 1.form&#x8868;&#x5355;&#x7684;method&#x630…

    数据库 2023年6月14日
    0136
  • markdown笔记

    注:笔记旨在记录 1.1 展示一级标题(在标题紧接的下一行加若干个’=’) ======= 1.2 展示二级标题 (在标题紧接的下一行加若干个’…

    数据库 2023年6月16日
    0107
  • Nginx负载均衡

    Nginx负载均衡 负载均衡概述 早期的网站流量和业务功能都比较简单,单台服务器足以满足基本的需求,但是随着互联网的发展,业务流量越来越大并且业务逻辑也跟着越来越复杂,单台服务器的…

    数据库 2023年6月6日
    088
  • 计算机图形学

    计算机图形学 光追一般指光线追踪。 光线跟踪(也叫ray tracing或者光束投射法)。是一个在二维(2D)屏幕上呈现三维(3D)图像的方法。 BRDF是双向反射分布函数(Bid…

    数据库 2023年6月14日
    081
  • 没有 Cgroups,就没有 Docker

    Cgroups 是什么? Cgroups 是 control groups 的缩写,是 Linux 内核提供的一种可以 限制、 记录、 隔离进程组(progress groups)…

    数据库 2023年6月6日
    0116
  • AUFS:多点合一,写时复制

    AUFS(全称:advanced multi-layered unification filesystem,高级多层统一文件系统),用于为 Linux 文件系统实现 联合挂载。提到…

    数据库 2023年6月6日
    095
  • java死锁(Java-level deadlock)

    java-level deadlock 如下代码可以模拟java死锁。注意:当出现死锁时,应用程序是无响应的。错误信息: Found one Java-level deadlock…

    数据库 2023年6月9日
    086
  • Arrays.asList()你真的知道怎么用吗?

    发现问题 前几天在看别人的项目的时候,发现一个问题,简单复现一下这个问题 // 注意这是一个Integer对象的数组哦 Integer[] arr = new Integer[]{…

    数据库 2023年6月11日
    074
  • vs2022升级后打开项目报错预定义类型system.void未定义或导入”

    今天打开项目,vs2022提示升级,于是我就点了升级,升级完成后,再次打开项目,代码中就出现了很多红线,提示 如下错误,还有很多其他类似的错误 大概意思就是 mscorlib.dl…

    数据库 2023年6月9日
    0145
  • 翻译 | Kubernetes Operator 对数据库的重要性

    一些刚接触 Kubernetes 的公司尝试使用传统环境中运行数据库的方法在 Kubernetes 中运行数据库。但是,不建议这样做。因为这可能会导致数据丢失,并且也不建议这样管理…

    数据库 2023年5月24日
    0120
  • 二叉树遍历的常用方法

    概述 二叉树的遍历可以说是解决二叉树问题的基础。我们常用的遍历方式无外乎就四种 &#x524D;&#x5E8F;&#x904D;&#x5386;、 …

    数据库 2023年6月11日
    085
  • python 里 certifi 库的作用

    安装了certifi之后,和requests库一样也有一个cacert.pem,可以用编辑器打开cacert.pem,里面包含了很多可信任知名公司的证书/公钥库的路径,我这里是py…

    数据库 2023年6月9日
    0100
  • [LeetCode]7. 整数反转

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例 1: 输入: 123输出: 321示例 2: 输入: -123输出: -321示例 3: 输入: 1…

    数据库 2023年6月9日
    082
  • Server returns invalid timezone. Go to ‘Advanced’ tab and set ‘serverTimezone’ property manually.

    用pycharm连接mysql报错改变serverTimezone改了之后确实可以连接上mysql数据库 人生很长,一起加油 Original: https://www.cnblo…

    数据库 2023年6月6日
    090
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球