关于javascript:Vue自定义组件实现vmodel指令

在咱们首次接触Vue的时候,肯定会理解到一个语法糖,那就是v-model指令,它带给咱们的第一印象就是它能够实现双向绑定

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

所以,在咱们深刻应用Vue之后,编写一个自定义组件,如何手动实现一个v-model的指令呢,明天咱们就来具体探讨一下

v-model指令的原理是什么?

  1. v-bind绑定一个value属性
  2. v-on监听以后元素的input事件,当数据变动时,将值传递给value实时更新数据

v-modelv-bind:value有什么区别?

自定义组件中,必定会应用v-bind指令来实现组件之间值的传递,所以在我还是菜鸟的那段时间,我始终有个纳闷,既然有的v-bind指令,为什么还须要在自定义的组件中实现v-model指令呢?在我实际了一番之后,我才明确,v-model既可能实现值的传递,也可能实现页面数据的实时变动,而v-bind只是实现值的传递,如果须要实现实时变动的成果,须要应用另外的办法批改变量的值,能够总结为上面两点

  1. v-model实现视图和数据的双向绑定,一者变动另一者也会同时变动
  2. v-bind只会在初始化化的时候将数据绑定到视图上,后续视图变动不会影响数据

撸一个v-model

看到这里,置信你也了解了为什么咱们会须要在自定义的组件中自定义一个v-model指令,上面咱们通过一个繁难的示例来撸一个v-model,在此之前咱们须要在一个空Vue我的项目中,定义一个dad.vue文件,以及child.vue文件。为了不便初学者学习,我将一个残缺的繁难示例我的项目放到了github仓库中供大家下载学习,大家如果喜爱能够为了点一颗Star,Thanks♪(・ω・)ノ!!!

<span id=”jumpId-dad”></span>

dad.vue

<template>
    <div>
        <child v-model='childName'></child>
    </div>
</template>

<script>
    import child from './child.vue';
    export default {
        name: 'dad',
        components: {
            child
        },
        data() {
            return {
                childName: '我是儿子'
            };
        },
        methods: {}
    };
</script>

<span id=”jumpId-child”></span>

child.vue

<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>

参考文档一 ———— vue自定义组件中的v-model
参考文档二 ———— Vue中v-model和v-bind:value的区别以及手动实现v-model
参考文档三 ———— Vue官网文档对于$emit的阐明

我是 fx67ll.com,如果您发现本文有什么谬误,欢送在评论区探讨斧正,感谢您的浏览!
如果您喜爱这篇文章,欢送拜访我的 本文github仓库地址,为我点一颗Star,Thanks~ 🙂
转发请注明参考文章地址,非常感谢!!!

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理