[ vue ] 自定义组件的 v-model 理解
需求场景描述:

1. 在父组件 myself.vue 里面定义数据 button_val
2. 在父组件 myself.vue.里面定义按钮,它的功能是吧 button_val 的值 -1
----
3. 子组件 test.vue 是一个按钮,它显示的数据是 父组件button_val 的值,功能是把 button_val 的值 +1
接下来看如何一步一步实现这个效果
官方文档解读:

1. 注意这里组件的默认规则:
prop: value
event: input
2. v-mode是vue提供的语法糖,它本质是这样的:
[ 效果 ]

[ 父组件 ]
<template>
<div class="q-ma-lg">
<div class="q-mb-lg">
<span>(父组件)监控lovingVue的值:</span>
{{lovingVue}}
</div>
<base-checkbox :value="lovingVue" @input="lovingVue = $event"/>
</div>
</template>
<script>
import test_child from 'components/test_child.vue'
export default {
data(){
return {
lovingVue:''
}
},
components:{
'base-checkbox':test_child
}
}
</script>
[ 子组件 ]
<template>
<div>
<span>(子组件)</span>
<input type="text" @input="$emit('input',$event.target.value)" />
</div>
</template>
<script>
1. 子组件本质是一个input框,通过监听用户input输入来抛出一个值,这个值就是用户输入的内容。
2. 父组件的行为就可以参照官方文档的那句话了: 一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件
这里父组件监听input事件来获取子组件抛出的值,并更新 lovingVue 。
3. 就此达到数据的双向绑定
3. 自定义prop和自定义事件:
默认v-model的props是:value
默认v-model的event是:input
这里我们来实现自定义prop和事件:
<!-- 父组件 -->
<template>
<div class="q-ma-lg">
<div class="q-mb-lg">
<span>(父组件)监控lovingVue的值:</span>
{{lovingVue}}
</div> <base-checkbox :customValue="lovingVue" @customEvent="lovingVue = $event"/> </div>
</template>
<script>
import test_child from 'components/test_child.vue'
export default {
data(){
return {lovingVue:''}
},
components:{'base-checkbox':test_child}
}
</script> <!-- ------------------------------------------------------------------------------- --> <!-- 子组件 -->
<template>
<div>
<span>(子组件)</span>
<input type="text" @input="$emit('customEvent',$event.target.value)" />
</div>
</template> <script>
export default {
model:{
prop:'customValue',
event:'customEvent'
},
props:{
customValue:String
}
}
</script>
需求的实现:
<!-- 父组件 -->
<template>
<div class="q-mt-lg">
<div style="width:200px;height:100px;border:1px solid" class="bg-primary">
<span>parent</span>
<q-btn
:label="button_val + ' (-1)'"
@click="button_val = button_val - 1"
color="grey"
class="q-ma-md"
/>
</div> <!-- 子组件 -->
<div style="width:200px;height:100px;border:1px solid" class="bg-info">
<span>child</span>
<test
v-model="button_val"
class="q-ma-md"
/>
</div>
</div>
</template>
<script>
import test from 'components/test.vue'
export default {
data(){
return {button_val:1}
},
components:{test}
}
</script> ---------------------------------------------- <!-- 子组件 -->
<template>
<div>
<q-btn color="primary" :label="buttonVal+' (+1)'" @click="handleTest"/>
</div>
</template> <script>
export default {
model:{
prop:'buttonVal',
event:'haha'
},
props:{
buttonVal:{
type:Number,
default:0
} },
data(){
return {}
},
methods:{
handleTest(){
this.$emit('haha',Number(this.buttonVal)+1)
} }
}
</script>
[ vue ] 自定义组件的 v-model 理解的更多相关文章
- Vue自定义组件实现v-model指令
Tips: 本文所描述的Vue均默认是Vue2版本 在我们初次接触Vue的时候,一定会了解到一个语法糖,那就是v-model指令,它带给我们的第一印象就是它可以实现双向绑定 那么,什么是双向绑定?通俗 ...
- vue自定义组件(vue.use(),install)+全局组件+局部组件
相信大家都用过element-ui.mintui.iview等诸如此类的组件库,具体用法请参考:https://www.cnblogs.com/wangtong111/p/11522520.html ...
- 自定义组件v-model的实质性理解
用了几个月Vue一直很纠结自定义组件的v-model实现,最近开始学习React时,React中受控组件与状态提升的理念与v-model不谋而合. 转载请注明地址: https://www.cnblo ...
- vue自定义组件中的v-model简单解释
在使用iview框架的时候,经常会看到组件用v-model双向绑定数据,与传统步骤父组件通过props传值子组件,子组件发送$emit来修改值相比,这种方式避免操作子组件的同时再操作父组件,显得子组件 ...
- Vue - 自定义组件双向绑定
前言 无论在任何的语言或框架中,我们都提倡代码的复用性.对于Vue来说也是如此,相同的代码逻辑会被封装成组件,除了复用之外,更重要的是统一管理提高开发效率.我真就接手过一个项目,多个页面都会用到的列表 ...
- Vue自定义组件之v-model的使用
自定义组件之v-model的使用 v-model的语法糖可以为下面v-bind && @input联合完成: <input v-model="text"> ...
- [转] vue自定义组件(通过Vue.use()来使用)即install的使用
在vue项目中,我们可以自定义组件,像element-ui一样使用Vue.use()方法来使用,具体实现方法: 1.首先新建一个Cmponent.vue文件 // Cmponent.vue<te ...
- vue 自定义组件销毁
今天在开发电商vue前端项目时,用户每次登出再换其它用户登录时,页面显示的用户名和左则导航都还是上个用户的,刚开始以为是localStorage中没有清除全局数据,然后在用户点击退出系统时手动清除lo ...
- Vue自定义组件插入值
我们自定义组件的时候有时候需要往组件里面插一些内容: //定义一个组件test,插值内容用slog来代替 export default { name: 'test', template:` <d ...
- VUE 自定义组件之间的相互通信
一.自定义组件 1.全局自定义组件 我们在var vm = new Vue({});的上面并列写上Vue.component('自定义组件名',{组件对象});来完成全局自定义组件的声明.示例代码如下 ...
随机推荐
- 【C++】最长回文子串/动态规划
ACM #include <bits/stdc++.h> using namespace std; const int maxn = 1010; char S[maxn]; int dp[ ...
- 关于python中的随机种子——random_state
random_state是一个随机种子,是在任意带有随机性的类或函数里作为参数来控制随机模式.当random_state取某一个值时,也就确定了一种规则. random_state可以用于很多函数,我 ...
- 关于为了一时方便,使用@Scheduled注解定时踩的坑
摘要: 事情是这样的前两周在做项目的时候碰到一个需求---要求每天晚上执行一个任务,公司统一使用的是 xxl-job 写定时任务的,我当时为了方便自己,然后就简单的使用了Spring的那个@Sched ...
- Java常用类,这一次帮你总结好!
常用类 常用类概述: 内部类 Object类 包装类 数学类 时间类 字符串 String Builder和StringBuffer DecimalFormat 一.内部类 概念:在一个类内部再定义一 ...
- Java定时器演进过程和生产级分布式任务调度ElasticJob代码实战
为何要使用分布式任务调度 **本人博客网站 **IT小神 www.itxiaoshen.com 演示项目源码地址** https://gitee.com/yongzhebuju/spring-task ...
- 解放双手,自动生成“x.set(y.get)”,搞定vo2dto转换
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 给你机会,你也不中用啊 这些年从事编程开发以来,我好像发现了大部分研发那些不愿意干的 ...
- 【python】青果教务系统模拟登陆
使用 python 的 selenium + chrome 来模拟登陆学校教务系统 完整代码传至 github,增加了一个自动识别验证码的功能,不过是用的别人的轮子,识别度也不高 这是需要手动输入验证 ...
- GAN 简介
GAN 原理: GAN 的主要灵感来源于博弈论中零和博弈的思想,应用到深度学习神经网络上来说,就是通过生成网络 G(Generator)和判别网络 D(Discriminator)不断博弈,进而使 ...
- Spring Boot应用程序启动器
官网地址:https://docs.spring.io/spring-boot/docs/2.1.12.RELEASE/reference/html/using-boot-build-systems. ...
- Spring实现自定义注解并且配置拦截器进行拦截
有时候我们会自定义注解,并且需要配置拦截器对请求方法含有该自定义注解的方法进行拦截操作 自定义注解类 NeedToken.java import java.lang.annotation.Docume ...