当前位置: 首页 > news >正文

vue中.sync修饰符与$emit(update:xxx)双向数据绑定

文章目录

  • 一、单向数据流
  • 二、`props`父子传值
    • 2.1、父组件
    • 2.2、子组件
    • 2.3、优缺点
      • 2.3.1、优点
      • 2.3.2、缺点
  • 三、`.sync`修饰符双向绑定
    • 3.1、父组件
    • 3.2、子组件
    • 3.3、优缺点
      • 3.3.1、优点
      • 3.3.2、缺点
    • 3.4、[文档](https://v2.cn.vuejs.org/v2/guide/components-custom-events.html#sync-%E4%BF%AE%E9%A5%B0%E7%AC%A6)
  • 四、最后

一、单向数据流

所有的 props 都遵循着单向绑定原则,props 因父组件的更新而变化,自然地将新的状态向下流往子组件,而不会逆向传递。这避免了子组件意外修改父组件的状态的情况,不然应用的数据流将很容易变得混乱而难以理解。另外,每次父组件更新后,所有的子组件中的 props 都会被更新到最新值,这意味着你不应该在子组件中去更改一个 prop

正常的父子组件传值及修改值,需要props传递属性到子组件,然后需要子组件触发自定义事件到父组件去改值。

二、props父子传值

2.1、父组件

  1. 在父组件中定义数据及传递给子组件
  2. 接收自定义事件,在自定义事件中修改值
<template><div><child :title="title" @change="changeTitle"></child></div>
</template>
<script>export default {data() {return {title:"old title"}},methods: {// 最鸡肋的就是这个环节changeTitle(e) {this.title = e // new title}}}
</script>

2.2、子组件

  1. 子组件中接收数据,定义触发修改值的方法及$emit触发自定义事件携带参数到父组件
<template><div><div @click="changeTitle">{{title}}</div></div>
</template>
<script>export default {props: {title: {default: "old title"},},methods: {changeTitle(){// 触发一个更新事件this.$emit('change:title',"new title")}}}
</script>

2.3、优缺点

2.3.1、优点

明确的数据流props通过显式地传递数据,使得数据的来源和使用更加清晰明确。
数据单向流动props的数据只能由父组件向子组件传递,避免了数据的混乱和不可预测性。
较好的可维护性props作为接口定义,可以提高组件的可维护性和可复用性。

2.3.2、缺点

相对繁琐:对于较为复杂的数据传递和组件间的通信,需要通过定义多个props,增加了代码的复杂度。
需要额外的事件机制:子组件需要通过事件或方法通知父组件进行数据更新,增加了一定的开发成本和复杂度。

三、.sync修饰符双向绑定

3.1、父组件

<template><div><child :title.sync="title" /></div>
</template>
<script>export default {data() {return {title:"old title"}}}
</script>

3.2、子组件

<template><div><div @click="changeTitle">{{title}}</div></div>
</template>
<script>export default {props: {title: {default: "old title"},},methods: {changeTitle(){// 触发一个更新事件this.$emit('update:title',"new title")}}}
</script>

3.3、优缺点

3.3.1、优点

对比props父子传值及.sync修饰符双向绑定,最直观的感受就是代码简化了
.sync 修饰符实质就是父组件监听子组件更新某个props的请求的缩写语法,一种语法糖。

简洁的语法:使用.sync修饰符可以简洁地实现父子组件的双向数据绑定。
方便的数据更新:子组件可以直接修改父组件的数据,子组件的变化会直接影响到父组件中对应的数据。

:title.sync="title"
// 写法等同于
:title="title"
@update:title="title = $event"

3.3.2、缺点

数据绑定不够明确:由于子组件可以直接修改父组件的数据,可能导致数据变得不可预测,增加了调试和维护的难度。
双向绑定可能带来性能问题:频繁的数据变动可能导致性能问题,需要合理控制双向绑定的使用。

3.4、文档

在这里插入图片描述

四、最后

本人每篇文章都是一字一句码出来,希望大佬们多提提意见。顺手来个三连击,点赞👍收藏💖关注✨。创作不易,给我打打气,加加油☕

相关文章:

  • Learn the architecture - Understanding Armv9-A trace
  • gRPC之grpc负载均衡(resolver)
  • STM32USART+DMA实现不定长数据接收/发送
  • Node.js 的 os 模块介绍
  • 【多传感器融合】BEVFusion: 激光雷达和视觉融合框架 NeurIPS 2022
  • TemplateHit中提取query和hit比对上序列索引的映射字典
  • 用户运营:如何搭建用户分析体系
  • Centos 7 在线安装(RPM) PostgreSQL 14 15 16
  • ChatGPT 使用入门
  • C++学习 --函数对象
  • AWS EC2 如何 使用 SSM会话管理器登陆
  • python——第十五天
  • boa服务器移植
  • 关闭vscode打开的本地服务器端口
  • Linux系统iptables扩展
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • C++11: atomic 头文件
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • es6(二):字符串的扩展
  • gcc介绍及安装
  • JavaScript设计模式与开发实践系列之策略模式
  • Java精华积累:初学者都应该搞懂的问题
  • PAT A1017 优先队列
  • Python - 闭包Closure
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Sass 快速入门教程
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 订阅Forge Viewer所有的事件
  • 二维平面内的碰撞检测【一】
  • 今年的LC3大会没了?
  • 每天一个设计模式之命令模式
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #laravel 通过手动安装依赖PHPExcel#
  • $ git push -u origin master 推送到远程库出错
  • (1)(1.13) SiK无线电高级配置(五)
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (2022 CVPR) Unbiased Teacher v2
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (安卓)跳转应用市场APP详情页的方式
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)计算机毕业设计高校学生选课系统
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)树状数组
  • (转)项目管理杂谈-我所期望的新人
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .net core 依赖注入的基本用发
  • .net 生成二级域名
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • @我的前任是个极品 微博分析
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [20150321]索引空块的问题.txt