vue自定义组件实现v-model双向数据绑定
一、Vue2 实现自定义组件双向数据绑定
① v-model 实现双向数据绑定
在vue2中,子组件上使用v-model的值默认绑定到子组件的props.value属性上,由于子组件不能改变父组件传来的属性,所以需要通过$emit触发事件使得父组件中数据的变化,然后再同步到子组件。vue2默认触发v-model数据变化的事件为input。
使用如下:
子组件MySon
<template><div><div>双向数据绑定:{{$props.value}}</div><div><button @click="addValue">点击++</button></div></div>
</template>
<script>
export default {name: "MySon",props: ['value'],methods: {addValue() {// 触发父组件中v-model绑定数据的变化,由于不能改变props数据中的值,所以不要写this.$props.value++这样的操作this.$emit('input', this.$props.value + 1)}}
}
</script>
如果希望改变接收v-model的属性或改变触发v-model数据变化的事件,可通过model:{}配置实现,如:
<template><div><div>双向数据绑定:{{$props.value666}}</div><div><button @click="addValue666">点击++</button></div></div>
</template>
<script>
export default {name: "MySon",props: ['value666'],// --> 配置接收v-model数据的属性以及改变数据的事件 <--model: {prop: 'value666',event: 'updateValue666'},methods: {addValue666() {this.$emit('updateValue666', this.$props.value666 + 1)}}
}
</script>
父组件
<template><div id="app"><MySon v-model="num"></MySon></div>
</template>
<script>
import MySon from "@/components/MySon.vue";
export default {name: 'App',components: {//注册子组件MySon},watch: {// 监视num数据的变化 num(newValue, oldValue) {console.log('num: ' + oldValue + ' -> ' + newValue)},},data() {return {num: 10,}},
}
</script>
② .sync 实现子组件多个数据双向绑定
在Vue2中使用v-model只能使用一次,如果要实现多个双向数据绑定,可以借助.sync修饰,使用语法为 :属性.sync="数据" ,用这种绑定代替v-model,触发数据改变的事件为update:属性名
使用如下:
子组件
<template><div><div>sync双向数据绑定:{{$props.data}}</div><div><button @click="addData">点击++</button></div></div>
</template>
<script>
export default {name: "MySon",// 用props.data属性接收双向绑定的数据 props: ['data'],methods: {addData() {// 触发 update:data 事件改变父组件中绑定的值 this.$emit('update:data', this.$props.data + 1)}}
}
</script>
父组件
<template><div id="app"><!-- 用 :data.sync 将数据双向绑定到子组件的data属性上 --> <MySon :data.sync="num"></MySon></div>
</template>
<script>
import MySon from "@/components/MySon.vue";
export default {name: 'App',components: {MySon},watch: {num(newValue, oldValue) {console.log('num: ' + oldValue + ' -> ' + newValue)}},data() {return {num: 10}},
}
</script>
至于为什么子组件要通过$emit('update:属性名', 数据);来触发父组件数据变化,原因如下:
<MySon :data.sync="num"></MySon>||\/等价于
<MySon :data="num" @update:data="(newData) => {num = newData}"></MySon>
二、Vue3 实现双向数据绑定
在Vue3中,v-model可以实现多个数据双向数据绑定,同时.sync修饰符已经不再生效。
① v-model 实现双向数据绑定
vue3中子组件上使用v-model绑定的数据默认传到子组件的props.modelValue属性上(vue2是props.value属性),并且默认触发数据变化的事件为update:modelValue (vue2为input)
使用如下:
子组件
<template><div><div>双向数据绑定modelValue:{{props.modelValue}}</div><div><button @click="addModelValue">点击++</button></div></div>
</template>
<script setup>// props.modelValue接收v-model绑定的数据const props = defineProps(['modelValue'])const emit = defineEmits(['update:modelValue'])function addModelValue(){// 触发父组件中双向绑定数据的变化emit('update:modelValue', props.modelValue + 1)}
</script>
父组件
<template><Son v-model="num"></Son>
</template>
<script setup>import {ref, watch} from "vue";import Son from "@/components/Son.vue"; const num = ref(0)// 监视num数据变化watch(num, (newValue, oldValue) => {console.log('num: ' + oldValue + '->' + newValue)})
</script>
② v-model: 属性 实现多个数据双向绑定
数据绑定语法:v-model:属性="数据"
触发数据变化的事件:update:属性
使用如下:
子组件
<template><div><div>双向数据绑定data:{{props.data}}</div><div><button @click="addData">点击++</button></div></div>
</template>
<script setup>const props = defineProps(['data'])const emit = defineEmits(['update:data'])const addData = () => {emit('update:data', props.data + 1)}
</script>
父组件
<template><!-- 将num数据绑定到子组件的data属性上 --><Son v-model:data="num"></Son>
</template>
<script setup>import {ref, watch} from "vue";import Son from "@/components/Son.vue";const num = ref(0)watch(num, (newValue, oldValue) => {console.log('num: ' + oldValue + '->' + newValue)})
</script>
相关文章:
vue自定义组件实现v-model双向数据绑定
一、Vue2 实现自定义组件双向数据绑定 ① v-model 实现双向数据绑定 在vue2中,子组件上使用v-model的值默认绑定到子组件的props.value属性上,由于子组件不能改变父组件传来的属性,所以需要通过$emit触发事件使得父组件中数据的变化…...
excel指定单元格输入相同的值,比如给D1~D10000输入现在的值
注意,一点不用用WPS,不然运行宏是会报:Droiact-Module1,第1行等Λ列语法错误: Unexpected identifier 步骤 1,altF11打开宏 2,输入脚本 3,点击运行按钮 成功后会看看到...
中国最强乳企伊利,三个季度净赚超百亿
伊利三季度的业绩完全超出了市场预期。 在一个飞天茅台都在不断跌价的消费趋势里,伊利三季度扣非净利润的同比增幅达到13.4%。大部分机构和投资者,都没料到伊利这一次的表现如此强悍。这一次,伊利在“大气层”。 并且,伊利前三季…...
SpringBoot源码解析(二):启动流程之引导上下文DefaultBootstrapContext
SpringBoot源码系列文章 SpringBoot源码解析(一):启动流程之SpringApplication构造方法 SpringBoot源码解析(二):启动流程之引导上下文DefaultBootstrapContext 目录 前言一、入口二、DefaultBootstrapContext1、BootstrapRegistry接口2、BootstrapCon…...
配置elk插件安全访问elk前台页面
编辑els配置文件vim elasticsearch.yml,添加以下配置文件 用elk用户,启动els服务 关闭防火墙,查看els启动是否成功,通过是否启动java进程来判断 或者通过查看是否启动9200和9300端口来判断是否启动 交互模式启动密码配置文件interactive表示交…...
[操作系统作业]页面置换算法实现(C++)
💓博主csdn个人主页:小小unicorn ⏩专栏分类:linux 🚚代码仓库:小小unicorn的代码仓库🚚 🌹🌹🌹关注我带你学习编程知识 目录 必做题代码分析(重点以时间统计…...
前端技术月刊-2024.11
本月技术月刊聚焦于前端技术的最新发展和业务实践。业界资讯部分,React Native 0.76 版本发布,带来全新架构;Deno 2.0 和 Node.js 23 版本更新,推动 JavaScript 生态进步;Flutter 团队规模缩减,引发社区关注…...
搜索引擎语法大全(Google、bing、baidu)
搜索引擎语法大全 搜索引擎语法通常指的是在搜索引擎中使用特定的运算符和语法来优化搜索结果。 提高搜索精度:使用特定的语法可以帮助用户更精确地找到相关信息,避免无关结果。例如,通过使用引号搜索确切短语,可以确保搜索结果包…...
java设计模式之行为型模式(11种)
行为型模式 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象型模式,前者采用继承机制来在类间分派…...
微服务系列一:基础拆分实践
目录 前言 一、认识微服务 1.1 单体架构 VS 微服务架构 1.2 微服务的集大成者:SpringCloud 1.3 微服务拆分原则 1.4 微服务拆分方式 二、微服务拆分入门步骤 :以拆分商品模块为例 三、服务注册订阅与远程调用:以拆分购物车为例 3.1 …...
leetcode 1470.重新排列数组
1.题目要求: 2.题目代码: class Solution { public:vector<int> shuffle(vector<int>& nums, int n) {vector<int> x_array(nums.begin(),nums.begin() n);vector<int> y_array(nums.begin() n,nums.end());int x_index 0;int y_index 0;for…...
windows在两台机器上测试 MySQL 集群实现实时备份
在两台机器上测试 MySQL 集群实现实时备份的基本步骤: 一、环境准备 机器配置 确保两台机器(假设为服务器 A 和服务器 B)能够互相通信,例如它们在同一个局域网内,并且开放了 MySQL 通信所需的端口(默认是 …...
点晴模切ERP系统助力模切企业转型升级之路
随着我国制造业规模不断扩大,中国制造业已经从高速扩张转向深入挖潜的关键阶段。数字化转型不仅有助于提升企业的生产效率和管理水平,还能有效应对市场竞争,实现可持续发展。在数字化转型的过程中,企业资源规划(ERP&am…...
redis修改配置文件配置密码开启远程访问后台运行
编辑 Redis 配置文件 编辑 /etc/redis/redis.conf,设置必要的参数。 sudo vim /etc/redis/redis.conf设置后台运行: 找到以下行,将 no 改为 yes: daemonize yes设置密码: 找到以下行,取消注释并设置密码为…...
市场分化!汽车零部件「变天」
全球汽车市场的动荡不安,还在持续。 本周,全球TOP20汽车零部件公司—安波福(Aptiv)发布2024年第三季度财报显示,三季度公司经调整后确认收入同比下降6%;按照区域市场来看,也几乎是清一色的下滑景…...
SCSS在Vue中的用法
SCSS在Vue中的用法 一、安装相关依赖1、安装sass - loader和node - sass(或dart - sass) 二、在组件中使用SCSS1、单文件组件(.vue)中的样式使用2、**全局样式使用SCSS**3、在组件中使用变量和混入(Mixins)…...
CPU用户时间百分比
在计算机系统中,"CPU用户时间百分比(CPU User Time)"是一个性能监控指标,它描述了CPU在用户模式下执行的累积时间与总的CPU时间的比例。这个指标可以帮助我们了解系统在执行用户态程序时的负载情况。下面是一些关于CPU用…...
RN中的StyleSheet
一、RN中样式的特点 RN的样式和前端的CSS的样式有一些区别。主要如下: RN中的样式 前端的CSS 继承性 没有继承性 有继承性 命名 fontSize(小驼峰命名) font-size 尺寸单位 with: 100 With: 100px 特殊的样式名 marginHorizontal…...
Swift 开发教程系列 - 第1章:Swift 简介与开发环境配置
在开始开发 Swift 应用之前,了解 Swift 语言的背景和设置开发环境非常重要。接下来,我们将逐步介绍 Swift 的基本概念,并带你完成开发环境的安装和项目创建。 1.1 Swift 简介 Swift 是由 Apple 开发的一种现代化编程语言,于 201…...
躺平成长-下一个更新的数据(躺平成长数据显示核心)
旭日图(Sunburst Chart)是一种用于展示具有层次结构数据的可视化图表。 开源竞争: (当你无法掌握技术的时候,就开源这个技术,培养出更多的技术依赖,让更多的人帮助你完善你的技术,那…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
