[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`
*****
**附鍵盤碼:**

## 四.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
- 前端路由