自定义子组件的v-model

一、传统的父子传参

        作为前端程序员,我们在开发时,用到最多的就是父子传参了吧,这一点相信大家都很熟悉了,在这里简单的说一下

        1.父传子

        (1)  在父组件中引入子组件,并在父组件的components中注册该组件

import Son from './son'
export default {name: 'Father',components: {Son}
}

          (2)在父组件中将该子组件当正常标签一样使用,将要传递的数据用子组件的属性去传递

<template><div><Son type="666" /></div>
</template>

        (3)在子组件的props里面去接收父组件传递的值,并说明类型

export default {name: 'Son',props: {type: String}
}

        (4)此时,父组件传递的值就可以在子组件中和子组件本身的data中的数据一样使用了

<template><div>来自父组件的 {{ type }}</div>
</template>

        2.子传父

        (1)在父组件中写该子组件的标签上去自定义一个事件类型,并绑定一个对应的事件处理函数,该函数的参数即是子组件传递过来的数据

<template><div><Son @toFather="fromSon" /></div>
</template><script>
import Son from './son'
export default {name: 'Father',components: {Son},methods: {fromSon(data) {console.log('子组件传递的参数',data )}}
}
</script>

        (2)在子组件中通过$emit去调用父组件中自定义的事件类型对应的事件,$emit的第一个参数为对应的父组件的事件类型,第二个参数为要传递的数据。

<template><div><button @click="dataToFather" /></div>
</template><script>
export default {name: 'Son',data() {return {sonData: '子组件的数据'}},methods: {dataToFather() {this.$emit('toFather', this.sonData)}}
}
</script>

        那么有没有一种方法可用更简便的实现同一个值的父子互传呢?在我说出这个问题时候相信很多人都感觉哪里很熟悉吧!听起来是不是和v-model很像?事实上,自定义组件也可以自定义v-model!

 二、自定义子组件的v-model

         1.首先我们需要在父组件中正常的引入子组件,并将其当做标签使用

<template><div><Son  /></div>
</template><script>
import Son from './son'
export default {name: 'Father',components: {Son}
}
</script>

        2.我们要去子组件中去制定改子组件的v-model的使用规则:与data同级的地方写一个model,其对应的属性值为一个对象,包含两个属性:

  • prop:此属性是用来绑定在使用v-model后子组件中要改变的值是哪个的
  • event:此属性是用来代替原来在父组件中子组件标签上面的自定义事件类型的,后续使用$emit去调用的就是这个事件类型

        在这里还要注意,在props里面还是需要正常去接收该值并说明类型的,否组无法在子组件中拿到并使用

<script>
export default {name: 'Son',model: {prop: 'value', // 父组件的v-model所绑定的值是这里的prop的属性值对应的props中的值event: 'change' // 定义通过$emit去调用的父组件的事件,在父组件的v-model改变时则会按照这个方法去处理},props: {value: String, // 接受父组件传递的v-model后面值的类型,必须在此注册不然没法使用},
}
</script>

        3.到这里,我们就可以在父组件中子组件标签上面使用v-model了

<template><div>父组件{{ sonData }}<Son v-model="sonData" type="66" /><el-input v-model="sonData" clearable maxlength="200" /></div>
</template><script>
import Son from './son'
export default {name: 'Father',components: {Son},data() {return {sonData: '2'}}
}
</script>

        4.在子组件中通过$emit去向父组件传递由v-model绑定的数据

<template><div><el-input v-model="toFather" clearable maxlength="200" @change="change" /></div>
</template><script>
export default {name: 'Son',model: {prop: 'val1ue', // 父组件的v-model所绑定的值是这里的prop的属性值对应的props中的值event: 'change' // 定义通过$emit去调用的父组件的事件,在父组件的v-model改变时则会安装这个方法去处理},props: {value: String, // 接受父组件传递的v-model后面值的类型,必须在此注册不然没法使用},data() {return {toFather: '子组件的数据'}},methods: {change() {this.$emit('change', this.toFather)}}
}
</script>

        走到这一步,我们的自定义v-model就算是完成了,我们会发现,在父组件中改变<Son v-model="sonData" /> 中的sonData时,子组件中的value会跟着改变,同样,在子组件中通过改变<el-input v-model="toFather" clearable maxlength="200" @change="change" />去调用change方法时,该方法也会通过我们置顶好的规则去将参数传递给父组件中v-model所绑定的sonData!


大家也可以去参考官方文档:自定义事件 — Vue.js (vuejs.org)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/89478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于PLE结合卡尔曼滤波的RSSI定位算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ............................................................... for Num_xb Num_xb2Num_…

C++思考和一些代码规范(09/28)

文章目录 一、C的一些思考记录1&#xff09;C函数进化&#xff08;函数->函数指针->函数模板->仿函数|函数对象->lambda表达式&#xff09; 一、C的一些思考记录 1&#xff09;C函数进化&#xff08;函数->函数指针->函数模板->仿函数|函数对象->lamb…

golang: Code of Conduct

目录 1. golang: Code of Conduct 1. golang: Code of Conduct Go Community Code of Conduct

目标检测YOLO实战应用案例100讲-面向路边停车场景的目标检测(下)

目录 4.3 引入正则化方法 4.3.1 正则化方法原理 4.3.2 何处引入正则化方法

小白vite+vue3搭建项目整个流程

第一步 查看npm 版本npm -v&#xff0c;npm版本是7&#xff0c;创建项目命令&#xff1a; npm create vitelatest threejsVue -- --template vue第二步 // 进入项目名为threejsVue的项目命令 cd threejsVue // 安装路由 npm install vue-router4 // 安装css npm install -D s…

Unity之VR如何实现跟随视角的UI

前言 我们在制作VR项目的时候,大部分时候,是把UI固定到一个位置,比如桌子或者空中,这么做固然稳定,但是当我们有以下需求的时候,固定位置的UI可能会不适用: 1.场景较小,操作物体占用了很大体积,没有固定的可以清晰显示完整UI的位置。 2.需要频繁的前后左右,更换姿势…

外贸企业网站做谷歌SEO优化没转化怎么办?

如果您的外贸企业网站在经过谷歌SEO优化后仍然没有获得预期的转化效果&#xff0c;这可能意味着您的优化策略需要重新审视和调整。以下是谷歌seo优化服务商九凌网络的一些建议&#xff0c;帮助您解决这个问题&#xff1a; 1. 重新定义目标关键词 首先&#xff0c;确保您了解您的…

【Qt】QTabWidget如何添加控件到Tab页水平位置

在开发中&#xff0c;QTabWidget控件经常出现在项目或软件中&#xff0c;有时为了美观兼顾操作便利&#xff0c;需要把按钮或其他控件添加到QTabWidget控件的Tab页水平位置。 实现思路&#xff1a; 查看帮助文档&#xff0c;发现该类有个方法void setCornerWidget()可以实现所…

【QT+CUDA】QT中使用cuda,QT+VS+cuda下载安装配置

文章目录 相关网址汇总&#xff1a; 一、软件安装&#xff1a;VS、CUDA、QT1 安装VS1.1 下载1.2 vs2017安装1.3 vs2015安装 2 安装CUDA2.1 下载2.2 安装2.3 测试2.4 卸载 3 安装QT3.1 下载3.2 安装 二、QT使用cuda1 .pro文件 三、常用操作1 NVIDIA控制面板&#xff1a;显卡、驱…

el-collapse 嵌套中 el-checkbox作为标题,选中复选框与el-tree联动

<el-drawertitle"应用授权":visible.sync"menuDrawer"><el-collapse accordion style"padding: 15px"><el-collapse-item v-for"item in platList"><template slot"title"><el-checkbox v-model…

力扣刷题-链表-环形链表

具体题目与思路见&#xff1a;https://programmercarl.com/0142.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8II.html#%E6%80%9D%E8%B7%AF 该文章详细介绍了如何寻找环入口点&#xff0c;以及数学原理。 class ListNode(object):def __init__(self, x):self.val xself.next Nonecl…

brew 常用命令

安装&#xff1a; /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"卸载&#xff1a; sudo /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)&qu…

windows11系统没有系统散热方式的解决办法

一、问题描述 当我们查看Win11系统的&#xff08;同时按下键盘的WinR键即可打开运行窗口&#xff09;【控制面板】-->【硬件和声音】-->【电源选项】-->【更改计划设置】-->【 更改高级电源设置】-->【处理器电源管理】下没有系统散热方式的选项&#xff0c;如下…

IDEA运行第一个Java简单程序(新建项目到运行类)

目录 前言 一、准备工作 JDK下载安装 1.IDEA下载安装 二、IDEA建立项目 &#xff08;一&#xff09;新建项目&#xff08;银河系&#xff09; &#xff08;二&#xff09;新建模块&#xff08;地球&#xff09; &#xff08;三&#xff09;新建包&#xff08;国家&#…

PWM杂项

PWM 是脉冲宽度调制 (Pulse Width Modulation) 的缩写&#xff0c;是一种常用的在数字系统中控制模拟电路或者电源的技术。其基本原理是通过控制一系列方波的高电平时间宽度&#xff0c;以实现对模拟信号等的精细控制。下面简单介绍下 PWM 的基本工作流程&#xff1a; PWM 信号…

Java_GUI编程-----1、 GUI编程简介

Java_GUI编程 1、 GUI编程简介 该怎么学&#xff1f; 这是什么&#xff1f; 它怎么玩&#xff1f; 平时应该如何运用&#xff1f; 组件 窗口 弹窗 面板 文本框 列表框 按钮 图片 监听事件 鼠标事件 键盘事件 工具 一、简介 GUI的核心技术&#xff1a;Swing、…

学之思项目第一天-完成项目搭建

一、前端 拉下前端代码执行 npm i 然后执行npm run serve就行了 二、后端 搭建父子模块 因为这个涉及到前台以及后台管理所以使用父子模块 并且放置一个公共模块&#xff0c;放置公共的依赖以及公共的代码 2.1 搭建父子工程 这个可以使用直接一个个的maven模块&#xff…

Vue 动态设置css伪元素content的值,解决不渲染和渲染为数字的问题

目前的代码如下 <div class"overall-results-evaluate" :style"styleObject"><!-- 其他代码&#xff08;亦或者是使用styleObject的标签&#xff0c;父级有styleObject的style属性后&#xff0c;子级写样式时都可以使用&#xff09; --> <…

直方图投影法判断裂缝走势(裂缝类型)

裂缝类型 裂缝类型有很多种&#xff0c;这里我们仅仅判断线性裂缝与网状裂缝&#xff0c;线性裂缝按照其走势有可分为横向裂缝、纵向裂缝和斜向裂缝。 我觉得大家应当有这样的意识&#xff0c;面对网状裂缝&#xff0c;它的二维参数是否有意义&#xff1f;答案是没有&#xf…

解决 MyBatis-Plus 中增加修改时,对应时间的更新问题

问题&#xff1a;在添加修改时&#xff0c;对应的 create_time 与 insert_time 不会随着添加修改而自动的更新时间 第一步&#xff1a;首先在对应的属性上&#xff0c;加上以下注解 如果只添加以下注解&#xff0c;在增加或者修改时&#xff0c;可能对应的 LocalDateTime 会出…