最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Vue自定义组件实现v-model指令 - 掘金

    正文概述 掘金(fx67ll)   2021-10-25   401

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

    在我们初次接触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♪(・ω・)ノ!!!

    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>
    

    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~ :)
    转发请注明参考文章地址,非常感谢!!!


    起源地下载网 » Vue自定义组件实现v-model指令 - 掘金

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元