vue 中 .sync 修饰符,是 2.3.0+ 版本新增的功能

在有些情况下,我们可能需要对一个 prop 进行“双向绑定”。不幸的是,真正的双向绑定会带来维护上的问题,因为子组件可以变更父组件,且在父组件和子组件两侧都没有明显的变更来源。

这也是为什么我们推荐以 update:myPropName 的模式触发事件取而代之。举个例子,在一个包含 title prop 的假设的组件中,我们可以用以下方法表达对其赋新值的意图:

在子组件中,props 中 使用 title,然后修改 title 为新的值,并通知父组件:

this.$emit('update:title', newTitle)

然后父组件可以监听那个事件并根据需要更新一个本地的数据 property。例如:

<text-document
v-bind:title="doc.title"
v-on:update:title="doc.title = $event"
></text-document>

为了方便起见,我们为这种模式提供一个缩写,即 .sync 修饰符:

<text-document v-bind:title.sync="doc.title"></text-document>

当我们用一个对象同时设置多个 prop 的时候,也可以将这个 .sync 修饰符和 v-bind 配合使用:

<text-document v-bind.sync="doc"></text-document>

这样会把 doc 对象中的每一个 property (如 title) 都作为一个独立的 prop 传进去,然后各自添加用于更新的 v-on 监听器。

实际应用场景:

vue dialog 弹窗中使用

父组件引入一个子组件,子组件是一个弹窗,父组件控制弹窗打开,子组件关闭弹窗时通知父组件,父组件不用再监听更新事件

父组件:

<template>
  <div>
  <el-button @click="open">打开弹窗</el-button>
  <my-dialog :visible.sync="dialogVisible" />
  </div>
<template>
<script>
export default {
  data() {
   return {
    dialogVisible: false
   }
  },
  methods: {
    open() {
      this.dialogVisible = true
    }
  }
}
</script>
 

子组件中:

需要使用 :before-close 来处理关闭后的操作,不要使用@close 方法,因为传给父组件visible为false后,子组件会监听到visible的变化,会再执行@close方法

<template>
<el-dialog
title="新建"
width="70%"
  :visible="visible"
:before-close="close"
@close="close"
>
    <div>子组件</div>
</el-dialog>
</template> props: {
visible: {
type: Boolean,
require: true,
default: false
}
}, methods: {
close() {
this.$emit('update:visible', false)
}
}

vue 中的 .sync 修饰符 与 this.$emit('update:key', value)的更多相关文章

  1. vue中的.sync修饰符用法

    在项目中接触到父组件传值给子组件的时候,想在子组件改变父组件传的值.(比如用于弹窗关闭) 但是正常来说,vue2是不允许子组件直接改父组件传进去的值的. 所以我们需要在子组件内定义自定义事件,通知父组 ...

  2. vue中通过.sync修饰符实现子组件修改父组件数据

    vue父子通讯是单向数据流,也就是子组件不能修改父组件的值,但是在一些情况下是需要这样做的. 先看官方文档: 接下来举例实现 1.实现一个双向数据绑定,子组件改变的时候,父组件也在改变 父组件 < ...

  3. vue中的.passive修饰符

    一.passive作用 详情请参考MDN(https://developer.mozilla.org/zh-CN/docs/Web/API/EventTarget/addEventListener)中 ...

  4. vue组件中的.sync修饰符使用

    在vue的组件通信props中,一般情况下,数据都是单向的,子组件不会更改父组件的值,那么vue提供.sync作为双向传递的关键字,实现了父组件的变动会传递给子组件,而子组件的carts改变时,通过事 ...

  5. vue中的.native修饰符

    如果你想在某个组件的根元素上绑定事件,直接使用 @click=''function' 是不生效的,我们可以添加.native修饰符 @click.native=''function'',请看以下dem ...

  6. vue中的事件修饰符

    vue提倡的是在方法中只有对数据的处理,所以提供了事件修饰符用于DOM的事件处理,常用的事件修饰符有以下几个: (1). stop:阻止冒泡(通俗讲就是阻止事件向上级DOM元素传递) 点击内层div的 ...

  7. Vue中的native修饰符解析

    native修饰符 一般来说,vue本身提供了v-on:eventName这个语法来提供vue的时事件绑定,通常使用@eventName这个语法糖代替上述语法. 使用过程中没有考虑@eventName ...

  8. 怎样在 Vue 中使用 事件修饰符 ?

    Vue 中可以通过 v-on 来绑定事件监听函数, 不过事件会有许多额外情况, 比如 是否阻止冒泡 / 是否阻止重载 / 是否限制点击次数 / 是否可以通过按键触发 等等. 这时就需要使用到 事件修饰 ...

  9. 030——VUE中鼠标语义修饰符

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 029——VUE中键盘语义修饰符

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. KB 与 KiB

    字节(Byte)是计算机中存储数据的基本单位,每 8 位比特(bit)组成一个字节.各种信息在计算机中存储.处理至少需要一个字节.例如,一个 ASCII 码用一个字节表示,一个汉字用两个字节表示. 根 ...

  2. (原创)【B4A】一步一步入门05:控件、公有属性、水平锚定、垂直锚定(控件篇01)

    一.前言 前面的教程,已经完整讲述了用B4A开发安卓APP从新建项目到编译发布的完整流程.从本篇开始,我们将会从B4A的细节处着手,一步一步掌握B4A. 从本篇开始的子系列为"控件篇&quo ...

  3. C# WCF实现聊天室功能

    1.WCF是什么 Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架 看这篇文章之前,可以先看我的另一篇文章,初步了解一下WCF: ...

  4. sqlserver生成指定的序列

    WITH numbers AS ( SELECT 1 AS num UNION ALL SELECT num + 1 FROM numbers WHERE num < 30 ) SELECT C ...

  5. wwise 音频引擎介绍

    https://blog.csdn.net/GJQI12/article/details/108007696

  6. nginx 更改配置client_max_body_size nginx.conf 修改默认限制上传附件大小

    Nginx 上传大文件超时解决办法 情况如下:用nginx作代理服务器,上传大文件时(测试上传50m的文件),提示上传超时或文件过大. 原因是nginx对上传文件大小有限制,而且默认是1M.另外,若上 ...

  7. web上传插件Uploadify

    Uploadify简单说来,是基于Jquery的一款文件上传插件.它的功能特色总结如下: 支持单文件或多文件上传,可控制并发上传的文件数 在服务器端支持各种语言与之配合使用,诸如PHP,.NET,Ja ...

  8. Python语言课程实验报告

    Python语言基础实验 一.实验目的和要求 1.了解Python的基本数据类型: 2.学习了解变量的定义与使用: 3.学会使用Python运算符: 4.掌握数据类型的实际应用. 二.实验环境 软件版 ...

  9. 安装 deepin linux 系统、linux 使用记录

    安装 deepin 深度linux系统 官网:https://www.deepin.org/zh/ 包含了下载ios镜像和安装教程: 最新版本:https://www.deepin.org/zh/do ...

  10. 关于pytest生成测试报告

    之前用pytest集成allure,记录的很清楚确实很好,但是我不知道怎么把生成的所有结果通过邮箱发送 可以使用pytest-html生成的html是这样的 也很清楚 但是!!!!!!!!!!!!!! ...