[TOC]
# 修饰符
## 一.v-model的修饰符
`v-model`是用于在表单表单元素上创建双向数据绑定的指令。在`<input>`和`<textarea>`上,默认通过监听元素的 input 事件来更新绑定的属性值。
### .lazy
.lazy:在改变后才会被触发,也就是说当`input`或`textarea`失去焦点时,它所绑定的值才会发生改变。
```
<!-- 若不使用 .lazy 修饰符,则在输入的过程中,haha 的值时不断变化的 -->
<input type="text" v-model.lazy="haha">
<p>输入的内容为:{{ haha }}</p>
```
### .number
`.number`:用来将输入的内容转换成数值,但如果输入的是字符串,则输出的也是字符串;
**用于`type='text'`**
```
<!-- html部分 -->
<input type="text" v-model.number="haha">
<p>输入的内容为:{{ haha }}</p>
<!--
输出的值及为input失去焦点后的value值,即haha的值与input中显示的值最终会保持一致
有下面几种情况:
1. 输入:123ebca154 输出:123 number类型
2. 输入:+123456 输出:123456 number类型
3. 输入:12e 输出:12 number类型
4. 输入:12.36e 输出:12.36 number类型
5. 输入:12.3.4.5 输出:12.3 number类型
6. 输入:-+1231abc 输出:-+1231abc string类型
7. 输入:abc 输出:abc string类型
8. 输入:+ 输出:+ string类型
9. 输入:- 输出:- string类型
-->
```
**用于`type='number'`:**
```
<!-- html部分 -->
<input type="number" v-model.number="haha">
<p>输入的内容为:{{ haha }}</p>
<!--
输出的值及为input的value值,当非法输入时,input最终展示的内容为输入的内容
有下面几种情况:
1. 输入:-.35 输出:-0.35 number类型
2. 输入:+-123e 不输出 非法输入,string类型
3. 输入:12e 不输出 非法输入,string类型
4.输入:+-..25 不输出 非法输入,string类型
-->
```
**无论是用在`text`中还是用在`number`中,都需要再进行处理:**
**用在`text`中:**
```
<script>
// 对haha监听,如下:
watch: {
haha (newVal, oldVal) {
this.hh = typeof newVal === 'string' && newVal !== '-' ? newVal.slice(0, newVal.length - 1) : newVal
}
}
</script>
```
**用在`number`中:**
```
<script>
// 给input绑定blur事件
methods: {
inputBlurFunc (newVal, oldVal) {
this.hh = typeof newVal === 'string' && newVal !== '-' ? newVal.slice(0, newVal.length - 1) : newVal
}
}
</script>
```
### .trim
`.trim`:自动过滤字符串前后的空格
```
<!-- html部分 -->
<input type="text" v-model.trim="haha">
<p>输入的内容为:{{ haha }}</p>
```
## 二. v-on的修饰符
### .stop
`.stop`:该修饰符将阻止事件向上冒泡。同理于调用`event.stopPropagation()`方法
```
<!-- html部分 -->
<div @click='clickDivFunc'>
<button @click.stop='clickBtnFunc'>点我</button>
<div>
```
### .prevent
`.prevent`:该修饰符会阻止当前事件的默认行为。同理于调用`event.preventDefault()`方法
```
<!-- html部分 -->
<form @submit.prevent='clickBtnFunc'></form>
```
### .self
`.self`:只有该元素本身能触发此事件,它的子元素无法触发它的事件;所以,当点击了它的子元素,按照冒泡原理,父元素的事件应当被触发,但是因为事件的触发源并不是它,所以它的事件不会被触发;如下:
```
<!-- html部分 -->
<!-- 点击按钮时是不会触发div上的事件 -->
<div @click.self='clickDivFunc'>
<button @click='clickBtnFunc'>点我</button>
<div>
```
### .once
`.once`:该修饰符表示绑定的事件只会被触发一次
```
<!-- html部分 -->
<button @click.once='clickBtnFunc'>点我</button>
```
### .nactive
`.native`:给某个组件的根元素上添加事件,需要添加该修饰符来使事件有效;使用在普通根元素上,改修饰符是无效的;如下:
```
<my-component v-on:click.native="clickFun"></my-component>
```
修饰符可以串联,如:
`<a v-on:click.stop.prevent="hahaFunc"></a>`
## 三.按键修饰符
Vue 允许为 v-on 在绑定键盘事件时添加按键修饰符,通过`keyup.keyCode`的方式来监听键盘特定按键的事件。也可以通过按键名称来监听,如下:
```
<!-- 通过keyCode的方式监听 -->
<input type='text' @keyup.13='submitFunc'>
<!-- 通过按键名称的方式监听 -->
<input type='text' @keyup.enter="submit">
```
**所有的按键别名:**
* enter
* tab
* delete (捕获 “删除” 和 “退格” 键)
* esc
* space
* up
* down
* left
* right
*****
>[danger]**注意**
如果使用了element-ui,想要监听input标签的键盘事件的触发,需要再添加`.nactive`进行修饰,否则会不起作用。
可能是因为element-ui封装了个div在input标签外面,把原来的事件隐藏了,所以如果不加**.native**的话,按键不会生效。
```
<el-input @keyup.enter.native="KeyUpEnter"></el-input>
KeyUpEnter() {
console.log('按下了enter键');
},
```
*****
**自定义按键修饰符**
通过`config.keyCodes`对象来自定义按键修饰符别名,如:
`Vue.config.keyCodes.f1 = 112`
*****
**附键盘码:**
![](https://img.kancloud.cn/31/61/3161f5ddc0210758a780ef99c6996a84_571x340.png)![](https://img.kancloud.cn/10/ff/10ff5b77e7738a584594368a5bcf62ce_572x385.png)![](https://img.kancloud.cn/ff/ef/ffef4194680556f3762778d3ae1015d2_573x470.png)
## 四.v-bing的修饰符
### .sync
`.sync`:当一个子组件改变了一个 prop 的值时,这个变化也会同步到父组件中所绑定,即在子组件中修改父组件的属性值;该修饰符会被扩展为一个自动更新父组件属性的`v-on`监听器,如下
```
<comp :foo.sync="bar"></comp>
```
扩展为:
```
<comp :foo="bar" @update:foo="val => bar = val"></comp>
```
当子组件需要更新foo的值时,它需要显式的触发更新事件,如下:
```
this.emit('update:foo', newValue)
```
- Javascript
- 组成
- Web API
- 初步认识DOM
- 经典案例 (使用获取id的方法)
- 节点和元素
- 经典案例 (使用获取节点和元素的方法)
- 函数
- 作用域链
- Array对象的方法
- String对象的方法
- 绑定事件
- 事件委托
- 逻辑运算
- js高级(面向对象、)
- 基本知识
- 数据类型
- 基本包装类型的使用
- 定义变量的区别
- JavaScript对象的动态特性
- 关键字in
- 关键字delete
- 运算符
- 创建对象的方式
- 回调函数
- 高阶函数
- 构造器属性
- this指向
- hasOwnProperty属性
- 私有成员和特权方法
- 面向对象和面向过程的基础
- 异常捕获
- 构造函数和普通函数的区别
- 构造函数的补充
- 原型
- 原型图
- 获取原型对象的方法
- 原型对象的访问和设置
- 判断某个对象是否是指定实例对象的原型对象
- constructor
- isPrototypeOf
- instanceof
- 检测对象是公有还是私有
- 核心概念
- 继承
- 混入式继承
- 原型式继承
- 原型链继承
- 借用构造函数继承(call继承,经典继承)
- 组合式继承(推荐)
- class继承
- __ proto __属性
- call方法和apply方法
- Fuction相关知识
- 创建函数的方式
- eval函数
- 浅拷贝和深拷贝
- 浅拷贝
- 深拷贝
- Object相关知识
- Object原型属性和方法
- Object静态成员对象
- 案例
- 数组去重
- 闭包
- 语法
- DOM事件和闭包
- 定时器和闭包
- 即使对象初始化
- 闭包的变形
- 设计模式
- 单例模式
- 发布订阅模式(观察者模式)
- 工厂模式
- 命名空间模式
- 同步和异步
- 垃圾回收机制
- get和set
- JQuery
- 动画方法
- 事件
- 方法
- 节点
- 方法er
- HTML + CSS
- 经验
- flex布局
- px,em ,rem区别
- 清除浮动
- Less
- UI框架
- 一.Bootstrap框架
- 常用类名
- 二 .Animate.css
- 三.WOW.JS
- 四.scrollReveal.js
- 五.zepto框架
- zepto选择器
- 滑动事件
- tap触摸事件
- zepto动画
- 六,swipe框架
- 分页器
- 左右按钮和循环轮播
- 底部滚动和轮播方向
- 自动播放和切换效果
- 移入移除事件
- swipe结合animate.css
- 总结
- 滚滚屏
- 自动化构建工具
- 1.gulp
- 使用gulp编译less成css,并最终压缩css
- 压缩css
- 合并和压缩js
- 压缩图片
- 编写server服务
- 包管理器
- 介绍
- brew
- npm十全大补汤
- ES6
- class类
- class类的使用
- class类的继承结构
- let 和const
- 结构语法
- 模板字符串
- 化简写法
- 形参的默认值
- ...rest参数
- rest剩余参数
- 扩展参数
- 正则表达式
- 创建正则表达式的方式
- 构造函数
- 字面量的方式
- 其他(修饰符)
- 判断是否匹配成功
- 正则表达式案例
- 常见的匹配原则
- 验证密码长度
- 表单验证
- 正则提取
- 正则替换
- vue
- 插值操作
- Mustache语法
- 过滤器
- 绑定相关知识
- 绑定对象
- 单向绑定
- 双向绑定
- 绑定属性
- 动态绑定style
- 绑定事件
- 补充
- 绑定语法
- 基础
- vue介绍
- MVVM
- 计算属性
- 指令
- v-cloak
- 显示和隐藏
- 循环
- 自定义指令
- 本地缓存
- localStorage
- sessionStorage
- 对象劫持
- 组件
- 局部组件
- 父子组件
- 全局组件
- 组件访问实例数据
- 父传子
- 子传父
- 兄弟传兄弟
- 插槽
- methods,computed,watch的区别
- Vue.observable()
- vue.config.js配置
- 修饰符
- .sync修饰符
- $attrs和$listeners
- Node.js
- 使用Node执行js代码的两种方式
- 交互模式
- 解释js文件
- http模板
- request对象的使用
- express框架
- 安装
- post
- 获取请求参数
- post返回页面
- 重定向到别的接口
- get
- 返回页面
- get获取请求参数
- 请求静态资源
- 热重启
- Ajax
- 请求方式
- get请求
- post请求
- jQuery中的ajax方法
- JQuery中的get请求
- jQuery中的post请求
- 微信小程序
- 认识
- 引入样式的方式
- 绑定数据
- 小程序组件
- scroll - view 可滚动视图区域
- 发起请求
- template模板
- rich-text
- web-view
- open-data
- checkbox组件
- label组件
- radio组件
- picker组件
- swiper组件
- Git
- 跨域
- 左侧固定,右侧自适应
- vuex
- 如何解决vuex页面刷新数据丢失问题
- 数据结构
- 树
- 问题累积
- Axios
- 前端路由