详解Vue的sync修饰符


Posted in Vue.js onMay 15, 2021

1 、指令

指令即 Directive,从字面意思理解就是我告诉你要做什么,就是发送了一个指令,然后由接收指令的人去做就好了。在 Vue 中的指令有个统一好认的格式,就是以 v- 开头的就是指令,如:

<div v-text="x"> </div> //v-text指定标签文本指令
<div v-on:click="add"> <div> //v-on事件绑定指令

但并不是所有的指令都以 v- 开头,对于一些简写,也是指令,如

<img :src="x"> </img> //v-bind:src 的简写
<button @click="add"> </button> //v-on:click 的简写

2 、修饰符

修饰符是与指令中的事件处理指令 v-on 息息相关的一个语法糖,所谓语法糖就是很 sweet,简单好用,在编程界就是能帮你做好的都帮你做了,只剩最简单的事留给你做。

在事件处理程序中,有一些非常常见的需求,例如 event.preventDefault() 阻止默认事件和 event.stopPropagation()阻止事件冒泡等等。因此 Vue 就把这些事件处理过程中常见的需求帮我们处理好了,在我们需要时告诉 Vue 一声,它就会自动帮我们阻止默认事件、阻止事件冒泡等。那么我们告诉 Vue 的途径就是 Vue 提供给我们的修饰符,修饰符是由点开头的指令后缀来表示的

以阻止 <a> 标签的点击默认刷新页面事件的 preventDefault 方法示例如下:

普通做法

<a href="" v-on:click=" rel="external nofollow" pe($event)">Vue点击链接</a> //vue中访问原始的DOM事件,可以用特殊变量 $event 把它传入方法,在原始 HTML 中是 event
// ... 
methods: {
    pe(e){
        e.preventDefault()
    }
}

使用修饰符

<a v-on:click.prevent>Vue点击链接</a> //prevent修饰符就等同于上述的 e.preventDefault()

由上述的小例可以看出,修饰符是不是个语法糖,帮我们把常用的需求提前写好了,用的时候说一声就行。当有事件处理程序时直接在后面继续写即可,如下:

<a href="" v-on:click.prevent=" rel="external nofollow" pp">Vue点击链接</a>
// ... 
methods: {
    pp(){
        console.log('不跳转页面执行事件')
    }
}

修饰符是有顺序地执行的,如上述的 v-on:click.prevent="pp",意思就是在点击时,先执行修饰符 prevent 的阻止默认事件,然后再执行后面的 pp 事件处理函数。

修饰符几乎是和事件 event 的相关处理函数一一对应的,根据事件的不同,对应不同事件的修饰符,如下所示分为几大类:

详解Vue的sync修饰符

修饰符的来源和含义就是上述所述,至于具体有哪些,在实际用到时可去官网查找所需,有两个最最常用的需要记住,即 @click.stop 是阻止事件冒泡,@click.prevent 是阻止默认事件,@keypress.enter 是按键为回车事件。

3、 .sync 修饰符

.sync 修饰符相对来说比较特殊,因为其不是事件 event 原有的事件处理相关函数的演变,而是 Vue 自己定义的一个修饰符,如上述的修饰符分类中也将 .sync 分类为自定义事件的修饰符,那么这个自定义事件到底是什么事件呢?

这个事件对应的是 eventBus 事件,eventBus 事件是 MVC 中的一个模式,简单来说就是发布和订阅的过程,就是说有两方,甲方负责始终监听某个事件,乙方负责在需要的时候触发这个事件,甲方在监听到事件被触发时就执行某些操作。甲方就是订阅,乙方就是发布,双方就是发布和订阅模式。

那么在 Vue 中在什么时候会需要用到这种情况呢?

就是在 Vue 的组件在接受外部数据 props 时,Vue 规定,子组件在通过 props 接受外部数据后只有使用该数据的权利,但没有修改该属性的权利。因为,如果子组件修改了外部传来的数据,这样一来子组件和使用其的父文件都可以改来改去,在父组件和子组件都没有明显的改动来源,到最后都不知道这个数据是谁改的了,数据就不好控制了。因此 Vue 就规定组件只能有权使用 props 的属性,不得自己改变,那么若其想要改变,就必须通知该数据的真正拥有者改变,也就是使用该组件的父文件。

其使用的通知方式就是 eventBus 发布和订阅模式。

不使用 .sync

子组件触发事件,事件名格式必须是 update:myPropName ,用 $emit 函数触发

this.$emit('update:title', newTitle) //newTitle就是你想要修改props数据修改后的值

父组件可以监听那个事件并根据需要更新一个本地的数据属性

<myconponent :title="Ptitle" @update:title="Ptitle = $event" ></myconponent>
//在父组件中监听该事件,该事件触发后传递的值以 $event 接收,$event === newTitle ,Ptitle是父组件的数据

或者是定义的接受函数的参数

<myconponent :title="Ptitle" @update:title="val => Ptitle = val" ></myconponent>
//这时接收的值作为函数的参数

使用 .sync

上述的过程在实际需求中很常用,因此 Vue 就将父组件的监听定义成了一个传值时的修饰符,为 .sync ,上述代码使用 .sync 修饰符后为:

子组件(是一样的)

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

父组件

<myconponent :title.sync="Ptitle"></myconponent> //等同于上面的传值并监听

是不是很 sweet 呢?

4 、总结

.sync 的用法规则

1.组件不能修改 props 外部数据

2.this.$emit 可以触发事件,并传参

3.$event 可以获取 $emit 的参数

以上就是详解Vue的sync修饰符的详细内容,更多关于Vue的sync修饰符的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
在Vue中使用Echarts可视化库的完整步骤记录
Nov 18 Vue.js
基于vue与element实现创建试卷相关功能(实例代码)
Dec 07 Vue.js
Vue实现点击当前行变色
Dec 14 Vue.js
Vue实现手机号、验证码登录(60s禁用倒计时)
Dec 19 Vue.js
vue组件是如何解析及渲染的?
Jan 13 Vue.js
如何在Vue项目中添加接口监听遮罩
Jan 25 Vue.js
vue实现可拖拽的dialog弹框
May 13 Vue.js
vue基于Teleport实现Modal组件
May 31 Vue.js
解决Vue+SpringBoot+Shiro跨域问题
Jun 09 Vue.js
一定要知道的 25 个 Vue 技巧
Nov 02 Vue.js
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
Nov 27 Vue.js
VUE之图片Base64编码使用ElementUI组件上传
Apr 09 Vue.js
深入理解Vue的数据响应式
May 15 #Vue.js
详解Vue的options
May 15 #Vue.js
vue实现无缝轮播效果(跑马灯)
May 14 #Vue.js
Vue接口封装的完整步骤记录
Vue全家桶入门基础教程
vue实现可拖拽的dialog弹框
vue如何批量引入组件、注册和使用详解
You might like
PHP无法访问远程mysql的问题分析及解决
2013/05/16 PHP
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
php实现简单爬虫的开发
2016/03/28 PHP
php结合mysql与mysqli扩展处理事务的方法
2016/06/29 PHP
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
Javascript快速排序算法详解
2014/12/03 Javascript
JS仿Windows开机启动Loading进度条的方法
2015/02/26 Javascript
jQuery实现的手机发送验证码倒计时效果代码分享
2015/08/24 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【二】
2016/05/10 Javascript
javascript加载xml 并解析各节点的值(实现方法)
2016/10/12 Javascript
Bootstrap CDN和本地化环境搭建
2016/10/26 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
JS 判断某变量是否为某数组中的一个值的3种方法(总结)
2017/07/10 Javascript
vue双花括号的使用方法 附练习题
2017/11/07 Javascript
Vue项目查看当前使用的elementUI版本的方法
2018/09/27 Javascript
Vue 中的受控与非受控组件的实现
2018/12/17 Javascript
微信小程序页面间传递数组对象方法解析
2019/11/06 Javascript
python计算最大优先级队列实例
2013/12/18 Python
Python遍历zip文件输出名称时出现乱码问题的解决方法
2015/04/08 Python
Python 基础知识之字符串处理
2017/01/06 Python
Python 多线程实例详解
2017/03/25 Python
Python使用matplotlib绘制三维图形示例
2018/08/25 Python
Python socket实现的文件下载器功能示例
2019/11/15 Python
python 安装impala包步骤
2020/03/28 Python
Django 解决model 反向引用中的related_name问题
2020/05/19 Python
CSS3 清除浮动的方法示例
2018/06/01 HTML / CSS
canvas粒子动画背景的实现示例
2018/09/03 HTML / CSS
详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android和ios)
2016/12/15 HTML / CSS
美国领先的汽车轮胎和轮毂供应商:TireBuyer
2016/07/21 全球购物
Lookfantastic西班牙官网:英国知名美妆购物网站
2018/06/13 全球购物
会计主管岗位职责范文
2013/11/08 职场文书
个人合作协议书范本
2014/04/18 职场文书
大学运动会加油稿200字(5篇)
2014/09/27 职场文书
房屋转让协议书
2014/10/18 职场文书
2015年电话销售工作总结范文
2015/04/20 职场文书
springboot应用服务启动事件的监听实现
2022/04/06 Java/Android