vue 中的 .sync 修饰符 与 this.$emit('update:key', value)

摘要:
vue中.sync修饰符,是2.3.0+版本新增的功能在有些情况下,我们可能需要对一个prop进行“双向绑定”。举个例子,在一个包含titleprop的假设的组件中,我们可以用以下方法表达对其赋新值的意图:在子组件中,props中使用title,然后修改title为新的值,并通知父组件:this.$emit然后父组件可以监听那个事件并根据需要更新一个本地的数据property。

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

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

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

在子组件中,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:sync.visible="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="新建"

  :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)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇根据查询条件批量修改表数据OSPF原理及配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue项目中在同一页面多次引入同一个echarts图表子组件的自适应问题

 在父组件页面引入两次该图表子组件显示的效果:       由于是百分比宽高,所以在窗口发生变化时,需要让图表也跟着自适应,所以才出现了本次讨论的问题啦。  先看下完整的图表子组件代码(在父组件就是直接引入,不需要传参哦): <template> <div ref="pieDom" style=" 100%;height: 10...

滴滴开源 Vue 组件库— cube-ui

cube-ui 是滴滴去年底开源的一款基于 Vue.js 2.0 的移动端组件库,主要核心目标是做到体验极致、灵活性强、易扩展以及提供良好的周边生态—后编译。 自 17 年 11 月开源至今已有 5 个月,在这个过程中 cube-ui 受到了不少的关注,同时从社区中也收到了很多很好的反馈和建议。我们也一直在迭代更新,从最初的 1.0 版本到最近发布的 1....

nginx运行vue项目,并对后端做负载均衡

一、打包vue项目 WebStorm打包vue项目过程参考:Vue_打包并发布项目。 二、部署至nginx 1.上传项目 将打包结果(dist文件夹)通过SFTP上传至Linux服务器(我用的是虚拟机),位置随意,我放到了nginx解压文件夹同级目录下。 2.创建配置文件 进入nginx解压文件夹下创建配置文件,custom.conf是我创建的配置文件。...

Vue 中引用组件错误【mint-ui】

场景: 官网:http://mint-ui.github.io/docs/#/zh-cn2/quickstart npm i mint-ui -S main.js 文件中引入并使用 1 //引入 2 import Mint from 'mint-ui' 3 import 'mint-ui/lib/style.css' 4 5 Vue.use(Mint...

mysql创建触发器

首先,我们来了解一下什么是触发器,触发器,就是在对一张表数据进行增(insert),删(delete),改(update)的时候,为了保持数据的一致性,对别的表也要进行相应的数据修改。 我们都知道mysql最后事务提交后,数据是会保存到磁盘上的,那么每次在insert,delete,update时候旧数据和新数据,会在内存中生成临时的行数据,分别叫old和...

vue安装及升级

先装好note.js 安装过程很简单,一直点下一步就ok了。1.1我们通过打开命令行工具(win+R),输入node -v查看node的版本,若出现相应的版本号说明你安装成功了  1.2.npm包管理器,是集成在node中的,所以安装了node也就有了npm,直接输入 npm -v 命令,显示npm的版本信息 现在node环境已经安装完成了,npm包管...