1-事件處理
1.1-事件綁定
- 通過
v-on:事件名稱="事件處理函數"綁定事件
<button v-on:事件名稱="事件處理函數">按鈕</button>
1.2-事件傳參
- 通過事件處理函數後的
()傳遞參數即可
<button v-on:事件名稱="事件處理函數(參數)">按鈕</button>
1.3-事件對象
- 無需給事件處理函數傳遞額外參數
系統會自動注入事件對象, 直接在事件處理函數定義的位置通過形參接受即可
const vm=new Vue({
el:'#app',
data:{
},
methods:{
// 鍵盤事件處理函數, e是系統自動注入的事件對象
checkUser(e){
console.log(e.target.value);
}
}
});
- 需要給事件處理函數傳遞額外參數
$event是一個系統變量, 代表事件對象
<input type="text" placeholder="請輸入用户名" @keyup="checkUser($event,'hello')"/>
<script>
const vm=new Vue({
el:'#app',
data:{
// 錯誤提示信息
tips:''
},
methods:{
// 鍵盤事件處理函數, e是系統自動注入的事件對象
checkUser(e,msg){
// 系統已經存在的用户名
const users=['admin','jack','tom','rose'];
const username=e.target.value.trim();
if(username===''){
return this.tips='請輸入用户名';
}
if(users.indexOf(username)===-1){
// 更新tips: 用户名可以
return this.tips='恭喜你, 用户名可用';
}
this.tips='用户名不可用';
}
}
});
</script>
1.4-事件修飾符
- 作用: 限制事件觸發的條件
- 語法
@事件名稱.事件修飾符="事件處理函數"
1.4.1-stop
- 作用: 阻止事件冒泡
<div id="app">
<div class="wrap" @click="wrapClick">
<!-- 使用事件修飾符stop, 阻止事件冒泡 -->
<div class="box" @click.stop="boxClick"></div>
</div>
</div>
1.4.2-prevent
- 作用: 阻止默認行為
<a href="http://baidu.com" @click.prevent="handle">a標籤</a>
1.4.3-once
- 作用: 限定事件只執行一次
<!--使用事件修飾符once, 限制事件只執行一次-->
<button @click.once="handle">按鈕</button>
1.4.4-self
- 作用: 限定事件只能被自己觸發(不能被冒泡行為觸發)
<!-- self是限定事件只能由元素自己觸發, 不能被冒泡行為觸發 -->
<div class="wrap" @click.self="wrapClick">
<div class="box" @click="boxClick"></div>
</div>
1.4.5-capture
- 作用: 修改事件觸發的順序(事件觸發順序變成由外向內)
<div class="wrap" @click.capture="wrapClick">
<div class="box" @click="boxClick"></div>
</div>
1.5-按鍵修飾符
- 作用: 修飾鍵盤事件, 限制鍵盤事件的觸發時機
- 語法
@事件名稱.按鍵修飾符="事件處理函數"
- 系統內置的按鍵修飾符
.enter.tab.delete(捕獲“刪除”和“退格”鍵).esc.space.up.down.left.right
2-表單處理
2.1-v-model指令
- 作用: 實現雙向數據綁定(數據層<=>視圖層)
- 注意: v-model指令只能在表單元素上使用
<div id="app">
<!-- v-model: 可以將用户的輸入自動同步到數據層 -->
<h1>{{keywords}}</h1>
<hr>
<input type="text" placeholder="請輸入搜索關鍵詞" v-model="keywords">
<button @click="search">搜索</button>
</div>
<script>
const vm = new Vue({
el: '#app',
data: {
keywords:''
},
methods: {
search(){
console.log(this.keywords);
}
}
});
</script>
2.2-常見表單元素雙向數據綁定
<div id="app">
<!-- v-model: 可以將用户的輸入自動同步到數據層 -->
<div>
<input type="text" v-model="user.name" placeholder="姓名">
</div>
<div>
<input type="radio" value="男" v-model="user.sex">男
<input type="radio" value="女" v-model="user.sex">女
</div>
<div>
<input type="checkbox" value="學習" v-model="user.hobby">學習
<input type="checkbox" value="讀書" v-model="user.hobby">讀書
<input type="checkbox" value="彈鋼琴" v-model="user.hobby">彈鋼琴
</div>
<div>
<!-- multiple:實現多選 -->
<select v-model="user.language" multiple>
<option value="vue">vue</option>
<option value="react">react</option>
<option value="angular">angular</option>
</select>
</div>
<div>
<textarea v-model="user.introduce" cols="30" rows="2" placeholder="個人簡介"></textarea>
</div>
<div>
<button @click="submit">立即提交</button>
</div>
</div>
<script>
const vm = new Vue({
el: '#app',
data: {
user:{
name:'',
hobby:[],
sex:'',
language:[],
introduce:''
}
},
methods: {
submit(){
// 獲取用户輸入
console.log(this.user);
}
}
});
</script>
2.2-表單修飾符
2.2.1-書寫位置
一般是個v-model指令結合起來使用
2.2.2-語法規範
v-model.表單修飾符="數據對象"
- trim
- 作用: 自動去除用户輸入內容的首位空格
- number
- 作用: 將用户輸入內容自動轉換成數值類型, 對於無法轉換成數值的內容, 不會處理
- lazy
- 作用: 延遲數據同步, 當失去焦點的時候, 再將數據同步到數據層(v-model默認會實時同步數據)
3-vm.$set
- vm.$set(操作的數組或者對象,數組下標或者對象屬性名,值): vm代表vue實例對象
通過數組下標操作(新增/更新)數組元素, 不會觸發視圖的刷新;
通過賦值的方式給對象動態添加屬性, 不會觸發視圖的更新;
使用$set方法添加的數組元素或對象屬性可以觸發視圖的更新;
3.1-作用
- 通過下標添加或者修改數組元素(傳統賦值方式無法觸發視圖更新)
- 給對象動態添加元素(傳統賦值方式無法觸發視圖更新)
3.2-別名
- Vue.set(操作的數組或者對象,數組下標或者對象屬性名,值);
4-vue核心原理
4.1-雙向數據綁定(數據劫持)
- 通過
Object.defineProperty(所屬的對象,屬性名,{get(){},set(){}})定義的數據的讀取和賦值, 都可以被監聽到
<body>
<h1>Object.defineProperty()實現數據劫持</h1>
<hr>
<h1 id="h1"></h1>
</body>
<script>
// Object.defineProperty(所屬的對象,屬性名,{get(){},set(){}})定義數據的另外一種方式
// 定義了一個全局變量msg
Object.defineProperty(window,'msg',{
get(){
//get訪問器: 當讀取數據msg的時候, 會被觸發
console.log('get');
// 需要在此處指定變量的值
return 'msg的初始值';
},
// value是一個系統自動注入的參數, 代表的是msg最新的賦值
set(value){
// set訪問器: 當對數據msg進行二次賦值的時候, 會被觸發
// 應用場景: 通過視圖更新(vue底層會在此處觸發模板的重新編譯)
console.log('set',value);
// 通知視圖更新
document.querySelector('#h1').innerHTML=value;
}
});
// console.log(msg); // 讀取數據, 會自動觸發get方法的執行
// msg='hello'; // 重新賦值, 會自動觸發set方法的執行
// 頁第一加載的時候,輸出的內容
const h1=document.querySelector('#h1');
h1.innerHTML=msg;
</script>
4.2-模板編譯(正則替換)
- 模板編譯底層主要是通過正則替換來實現的
class Vue{
// 系統方法, 自動執行, 進行數據初始化
// props={el:'#app',data:{},methods:{}}
constructor(props){
// 將data中的數據,掛載到this上
for(let key in props.data){
this[key]=props.data[key];
}
// 將methods中的方法,掛載到this上
for(let key in props.methods){
this[key]=props.methods[key];
}
// 將模板對應的選擇器掛載到this上, 方便在其他方法中獲取
this.$el=props.el;
// 調用一次渲染方法
this.render();
}
// 渲染方法(模板編譯)
render(){
// 獲取對應的dom對象
const app=document.querySelector(this.$el);
// 編寫正則表達式
const reg=/\{\{(\w+)\}\}/g;
const html=app.innerHTML.replace(reg,(a,b)=>{
// a:是整個正則表達式匹配到的結果
// b:是()子表達式匹配到的結果
return this[b]
});
// 刷新視圖
app.innerHTML=html;
}
}
5-生命週期鈎子函數
- 本質: 一種特殊的函數, 會在vue實例創建, 運行,銷燬階段的不同時期自動觸發
- 注意: 鈎子函數是vue 在完成特定操作之後, 通知我們的一種方式
- 寫書位置: 和data,methods平級
5.1-創建階段
特點
- 只執行一次
鈎子函數
- beforeCreate: 創建前(還沒有完成數據和方法的創建, 數據和方法還不能使用)
- created: 創建後(完成數據和方法的創建,可以調用數據和方法)
- boforeMount: 掛載前(還沒有完成視圖的渲染)
- mounted: 掛載後(已經完成了視圖的渲染)
5.2-運行階段
特點
- 執行次數不確定
- 只有在視圖中引用過的data數據更新的時候, 才會被觸發
鈎子函數
- beforeUpdate: 更新前(還沒有完成視圖更新)
- updated: 更新後(已經完成了視圖更新)
5.3-銷燬階段
特點
- 執行一次
鈎子函數
- beforeDestroy: 銷燬前
- destroyed: 銷燬後