[ 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('自定义组件名',{组件对象});来完成全局自定义组件的声明.示例代码如下 ...
随机推荐
- 记一次ssh连接慢
2020-03-28日机房搬迁完后,发现有一台60服务器ssh连接特别慢,但是其他服务器正常; 下面是解决过程: vim /etc/ssh/sshd_config (编辑配置文件) 查找F ...
- python selenium 多账户自动登入163邮箱
pycharm一些快捷键: ' ctrl ' +' / ' :注释 ' Tab ' :同时缩进 ' shift ' +' Tab ' :左移 一次缩进 本文webinfo.txt路径:C:\Pytho ...
- APS高级计划排程系统和生产排产系统
一.什么是APS高级计划排程系统 APS高级计划与排程是解决生产排程和生产调度问题,常被称为排序问题或资源分配问题. 目前,市场逐步走向个性化.以销定产模式:生产逐步以多品种小批量形成存在.对于离散制 ...
- Table.RemoveLastN删除后面N….RemoveLastN(Power Query 之 M 语言)
数据源: "姓名""基数""个人比例""个人缴纳""公司比例""公司缴纳"&qu ...
- Table.ReplaceValue替换…Replace…(Power Query 之 M 语言)
数据源: 任意数据源,包括文本和非文本两列 目标: 对数据进行替换操作 操作过程: [主页](或[转换])>[替换值] M公式: = Table.ReplaceValue( 表, 查找值, 替换 ...
- CF493A Vasya and Football 题解
Content 有两个球队在踢足球,现在给出一些足球运动员被黄牌或红牌警告的时间,求每个队员第一次被红牌警告的时间. 注意:根据足球比赛规则,两张黄牌自动换成一张红牌. 数据范围:比赛时间 \(90\ ...
- linux安装软件系列之yum安装
自动搜索最快镜像插件: yum install yum-fastestmirror 安装yum图形窗口插件: yum install yumex 1.安装 yum install 全部安装 yum i ...
- 再识requests
高级用法 本篇文档涵盖了 Requests 的一些高级特性. 会话对象 会话对象让你能够跨请求保持某些参数.它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 url ...
- Django的Form表单验证
Form(from django import forms) 简短理解:后端提供了一个类:from django import forms,继承此类定义子类.子类中定义和form表单中提交到name名 ...
- 最强最全面的大数据SQL经典面试题(由31位大佬共同协作完成)
本套SQL题的答案是由许多小伙伴共同贡献的,1+1的力量是远远大于2的,有不少题目都采用了非常巧妙的解法,也有不少题目有多种解法.本套大数据SQL题不仅题目丰富多样,答案更是精彩绝伦! 注:以下参考答 ...