详解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 组件注册
Nov 20 Vue.js
vue下拉刷新组件的开发及slot的使用详解
Dec 23 Vue.js
vue-cli4.0多环境配置变量与模式详解
Dec 30 Vue.js
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
Jan 05 Vue.js
如何在 Vue 表单中处理图片
Jan 26 Vue.js
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
Feb 23 Vue.js
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
Feb 26 Vue.js
Vue中foreach数组与js中遍历数组的写法说明
Jun 05 Vue.js
解决Vue+SpringBoot+Shiro跨域问题
Jun 09 Vue.js
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
Apr 06 Vue.js
VUE递归树形实现多级列表
Jul 15 Vue.js
vue3 自定义图片放大器效果的示例代码
Jul 23 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
The specified CGI application misbehaved by not returning a complete set of HTTP headers
2011/03/31 PHP
php实现保存submit内容之后禁止刷新
2014/03/19 PHP
PHP上传文件时自动分配路径的方法
2015/01/09 PHP
thinkphp如何获取客户端IP
2015/11/03 PHP
PHP统计目录中文件以及目录中目录大小的方法
2016/01/09 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
2019/10/15 PHP
jQuery循环滚动展示代码 可应用到文字和图片上
2012/05/11 Javascript
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
JavaScript遍历table表格中的某行某列并打印其值
2014/07/08 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
javascript中eval解析JSON字符串
2016/02/27 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
2016/07/18 Javascript
简单实现jQuery弹幕效果
2017/05/06 jQuery
解决Vue2.0 watch对象属性变化监听不到的问题
2018/09/11 Javascript
纯异步nodejs文件夹(目录)复制功能
2019/09/03 NodeJs
浅谈JS中几种轻松处理'this'指向方式
2019/09/16 Javascript
react 生命周期实例分析
2020/05/18 Javascript
Nuxt的动态路由和参数校验操作
2020/11/09 Javascript
Python自定义scrapy中间模块避免重复采集的方法
2015/04/07 Python
python调用java模块SmartXLS和jpype修改excel文件的方法
2015/04/28 Python
对python中Librosa的mfcc步骤详解
2019/01/09 Python
Python实现word2Vec model过程解析
2019/12/16 Python
关于ResNeXt网络的pytorch实现
2020/01/14 Python
python3.6连接mysql数据库及增删改查操作详解
2020/02/10 Python
基于python检查矩阵计算结果
2020/05/21 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
2020/06/28 Python
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
澳大利亚波西米亚风情网上商店:Czarina
2019/03/18 全球购物
青年文明号事迹材料
2014/01/18 职场文书
县政府办公室领导班子个人对照检查材料
2014/09/16 职场文书
医院护士党的群众路线教育实践活动对照检查材料思想汇报
2014/10/04 职场文书
学校党的群众路线教育实践活动总结材料
2014/10/30 职场文书
2014年化妆品销售工作总结
2014/12/01 职场文书
python 模块重载的五种方法
2021/04/24 Python
漫画「日和酱的要求是绝对的」第3卷封面公开
2022/03/21 日漫