自定义子组件的v-model

news/2025/2/22 4:40:19/

一、传统的父子传参

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

        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.ppmy.cn/news/1128000.html

相关文章

某高校的毕设

最近通过某个平台接的单子&#xff0c;最后Kali做的测试没有公开可以私聊给教程。 下面是规划与配置 1.vlan方面&#xff1a;推荐一个vlan下的所有主机为一个子网网段 连接电脑和http客户端的接口配置为access接口 交换机与交换机或路由器连接的接口配置为trunk接口---也可以…

xyhcms getshell

下载xyhcms3.6.2021版本并用phpstudy搭建 function get_cookie($name, $key ) {if (!isset($_COOKIE[$name])) {return null;}$key empty($key) ? C(CFG_COOKIE_ENCODE) : $key;$value $_COOKIE[$name];$key md5($key);$sc new \Common\Lib\SysCrypt($key);$value $sc-…

【前端设计模式】之策略模式

概述 在前端开发中&#xff0c;我们经常会遇到需要根据不同的条件或情况来执行不同的算法或行为的情况。这时&#xff0c;策略模式就能派上用场。策略模式是一种行为型设计模式&#xff0c;它将不同的算法封装成独立的策略对象&#xff0c;使得这些算法可以互相替换&#xff0…

【AI视野·今日Robot 机器人论文速览 第四十期】Mon, 25 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Mon, 25 Sep 2023 Totally 36 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;CloudGripper, 一套云化的机器抓取人数据采集系统&#xff0c;包含了32个机械臂的集群。(from KTH Royal Institute of Te…

Java分支结构:一次不经意的选择,改变了我的一生。

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、顺序结构二、分支结构1、if语句2、switch语句 好久不见&#xff01;命运之轮常常在不经意间转动&#xff0c;有时一个看似微…

oracle 乱码(编码为AMERICAN_AMERICA.US7ASCII)问题解决

案例 &#xff1a;mysql数据同步到oracle service类 本地用的多数据源 com.baomidou dynamic-datasource-spring-boot-starter private final JdbcTemplate jdbcTemplate;private static final List<String> lableList new ArrayList();static {lableList.add("…

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

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

mysql超级聚合with rollup

超级聚合&#xff0c;是在group by的基础上&#xff0c;再次进行聚合。 它再次聚合的列&#xff0c;是select中没有用到聚合函数的列。 文章目录 例子1解释例子2表以及数据 例子1 mysql> SELECT year, country, product, SUM(profit) AS profitFROM salesGROUP BY year, c…