需求场景描述:

1. 在父组件 myself.vue 里面定义数据 button_val

2. 在父组件 myself.vue.里面定义按钮,它的功能是吧 button_val  的值 -1

----

3. 子组件 test.vue 是一个按钮,它显示的数据是 父组件button_val 的值,功能是把 button_val 的值 +1

接下来看如何一步一步实现这个效果

官方文档解读:

查看官方文档:https://cn.vuejs.org/v2/guide/components-custom-events.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E7%9A%84-v-model

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 理解的更多相关文章

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

    Tips: 本文所描述的Vue均默认是Vue2版本 在我们初次接触Vue的时候,一定会了解到一个语法糖,那就是v-model指令,它带给我们的第一印象就是它可以实现双向绑定 那么,什么是双向绑定?通俗 ...

  2. vue自定义组件(vue.use(),install)+全局组件+局部组件

    相信大家都用过element-ui.mintui.iview等诸如此类的组件库,具体用法请参考:https://www.cnblogs.com/wangtong111/p/11522520.html ...

  3. 自定义组件v-model的实质性理解

    用了几个月Vue一直很纠结自定义组件的v-model实现,最近开始学习React时,React中受控组件与状态提升的理念与v-model不谋而合. 转载请注明地址: https://www.cnblo ...

  4. vue自定义组件中的v-model简单解释

    在使用iview框架的时候,经常会看到组件用v-model双向绑定数据,与传统步骤父组件通过props传值子组件,子组件发送$emit来修改值相比,这种方式避免操作子组件的同时再操作父组件,显得子组件 ...

  5. Vue - 自定义组件双向绑定

    前言 无论在任何的语言或框架中,我们都提倡代码的复用性.对于Vue来说也是如此,相同的代码逻辑会被封装成组件,除了复用之外,更重要的是统一管理提高开发效率.我真就接手过一个项目,多个页面都会用到的列表 ...

  6. Vue自定义组件之v-model的使用

    自定义组件之v-model的使用 v-model的语法糖可以为下面v-bind && @input联合完成: <input v-model="text"> ...

  7. [转] vue自定义组件(通过Vue.use()来使用)即install的使用

    在vue项目中,我们可以自定义组件,像element-ui一样使用Vue.use()方法来使用,具体实现方法: 1.首先新建一个Cmponent.vue文件 // Cmponent.vue<te ...

  8. vue 自定义组件销毁

    今天在开发电商vue前端项目时,用户每次登出再换其它用户登录时,页面显示的用户名和左则导航都还是上个用户的,刚开始以为是localStorage中没有清除全局数据,然后在用户点击退出系统时手动清除lo ...

  9. Vue自定义组件插入值

    我们自定义组件的时候有时候需要往组件里面插一些内容: //定义一个组件test,插值内容用slog来代替 export default { name: 'test', template:` <d ...

  10. VUE 自定义组件之间的相互通信

    一.自定义组件 1.全局自定义组件 我们在var vm = new Vue({});的上面并列写上Vue.component('自定义组件名',{组件对象});来完成全局自定义组件的声明.示例代码如下 ...

随机推荐

  1. 记一次ssh连接慢

    2020-03-28日机房搬迁完后,发现有一台60服务器ssh连接特别慢,但是其他服务器正常; 下面是解决过程: vim /etc/ssh/sshd_config       (编辑配置文件) 查找F ...

  2. python selenium 多账户自动登入163邮箱

    pycharm一些快捷键: ' ctrl ' +' / ' :注释 ' Tab ' :同时缩进 ' shift ' +' Tab ' :左移 一次缩进 本文webinfo.txt路径:C:\Pytho ...

  3. APS高级计划排程系统和生产排产系统

    一.什么是APS高级计划排程系统 APS高级计划与排程是解决生产排程和生产调度问题,常被称为排序问题或资源分配问题. 目前,市场逐步走向个性化.以销定产模式:生产逐步以多品种小批量形成存在.对于离散制 ...

  4. Table.RemoveLastN删除后面N….RemoveLastN(Power Query 之 M 语言)

    数据源: "姓名""基数""个人比例""个人缴纳""公司比例""公司缴纳"&qu ...

  5. Table.ReplaceValue替换…Replace…(Power Query 之 M 语言)

    数据源: 任意数据源,包括文本和非文本两列 目标: 对数据进行替换操作 操作过程: [主页](或[转换])>[替换值] M公式: = Table.ReplaceValue( 表, 查找值, 替换 ...

  6. CF493A Vasya and Football 题解

    Content 有两个球队在踢足球,现在给出一些足球运动员被黄牌或红牌警告的时间,求每个队员第一次被红牌警告的时间. 注意:根据足球比赛规则,两张黄牌自动换成一张红牌. 数据范围:比赛时间 \(90\ ...

  7. linux安装软件系列之yum安装

    自动搜索最快镜像插件: yum install yum-fastestmirror 安装yum图形窗口插件: yum install yumex 1.安装 yum install 全部安装 yum i ...

  8. 再识requests

    高级用法 本篇文档涵盖了 Requests 的一些高级特性. 会话对象 会话对象让你能够跨请求保持某些参数.它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 url ...

  9. Django的Form表单验证

    Form(from django import forms) 简短理解:后端提供了一个类:from django import forms,继承此类定义子类.子类中定义和form表单中提交到name名 ...

  10. 最强最全面的大数据SQL经典面试题(由31位大佬共同协作完成)

    本套SQL题的答案是由许多小伙伴共同贡献的,1+1的力量是远远大于2的,有不少题目都采用了非常巧妙的解法,也有不少题目有多种解法.本套大数据SQL题不仅题目丰富多样,答案更是精彩绝伦! 注:以下参考答 ...