new Vue(el, data, methods, computed, filters, components, 生命周期函數)
- el:
挂載頁面元素
- data:
資料
- methods:
定義函數
- computed:
計算屬性 這裡面定義的是方法 但是調用時一般是以變量的形式去調用的 這個要比 methods的方法效率更高 方法循環時會每次調用 而這個會有一個緩存 隻會調用一次
- filters:
定義過濾器函數
- components:
局部元件注冊
vue的生命周期(建立->消亡)
- beforeCreate
- created:
一般情況下會在這裡面做網絡請求
- beforeMount
- mounted
- beforeUpdate
- updated
- beforeDestroy
- destroyed
模闆文法
- 插值文法:
{{ massage }} {{}}内不僅可以寫變量 也可以寫表達式
vue指令
插值指令
- v-once:
隻是一個指令 沒有="" 内容隻能被指派一次 當資料改變時并不會改變
- v-html:
按照html文法加載資料
- v-text:
将資料加載到标簽 并且覆寫标簽内的所有内容
- v-pre:
将所有的内容原封不動的展示出來 可以使模闆插值文法失效 類似python的原始字元串
- v-cloak:
這個屬性類似于display:none vue不解析就不顯示模闆 在vue解析之前有這個屬性,解析之後将這個屬性删除
動态綁定指令
-
v-bind:
動态綁定屬性 (v-bind:src)可以縮寫為(:src) 可以使用任何屬性 :src='' 内容支援變量、數組、對象、方法、以及表達式
-
v-on:
綁定事件 (v-on:click)可以縮寫為(@click) 支援所有事件
- $event:
@click(prm, $event) $event預設寫法 接收浏覽器産生的event對象
- stop修飾符:
@click.stop 可以阻止事件冒泡
- prevent修飾符:
@click.prevent 阻止submit送出
- 鍵盤修飾符:
@keyup.enter 監聽回車建做事件操作 enter表示回車 這裡可以更改為其他鍵
- once修飾符:
@click.once 事件隻能被觸發一次 這裡防止重複送出很有效
- $event:
-
v-for:
循環操作 在周遊對象時 如果隻接受一個值 預設為value
- 元件的key屬性
在循環是可以選擇綁定一個key 但是盡量不要綁定index 因為index 是每次變化的 如果往list裡插入一個值 那麼所有的 index會重新排序做改變 而綁定item内的資料 則不受排序影響 是以性能更好 一般而言key會綁定一個唯一值
- 元件的key屬性
-
v-if:
條件成立時渲染代碼快
-
v-else:
else代碼塊
- v-else-if:
-
v-show:
條件成立時顯示代碼塊 否則隐藏代碼塊 和display:none相同 而v-if是直接不建立DOM 這裡會始終有DOM隻是不顯示
- Vue.set(要修改的對象, 索引值, 要修改的值)
-
v-model:
雙向綁定 用來同步更新 預設為value屬性
- lazy修飾符:
懶加載 不會實時的去雙向綁定更新 隻有使用者回車或取消焦點的時候進行更新
- number修飾符:
預設情況下雙向綁定的資料全部都是string類型 這裡可以指定綁定的類型
- trim修飾符:
自動去除字元串兩邊的空格
- lazy修飾符:
<h2>{{message}}</h2>
<!--v-model 的雙向綁定-->
<input type="text" v-model="message">
<!--雙向綁定也可以用另一種方式來實作-->
<input type="text" :value="message" :input="valueChange">
<script >
function valueChange(event){
console.log("當輸入框内容被改變 input時間觸發, 通過浏覽器産生的 event來擷取input内容");
this.message = event.target.value;
}
</script>
<!--簡寫-->
<input type="text" :value="message" @input="message=$event.target.value">
虛拟DOM
渲染
- key渲染
通過标簽的key屬性 決定vue在更新DOM的時候是否重新加載DOM 如果是相同的key則可以服用 不用重新加載DOM 但是DOM的屬性資料會變化 如果是不相同則直接重新加載一個新的DOM
- vue的響應式
并不是所有的修改都是響應式的 例如List的操作 如果使用 list.push("hello") 頁面是響應式的 若使用list[0] = 'hello' 此時資料已經改變但是 頁面不會進行響應式的修改
ES6
數組的方法
-
push方法
向list最後插入一個值
-
pop方法
從list最後取出一個值并删除
-
shift方法
從list取出第一個元素并删除
-
unshift方法
在list最前插入一個值
- splice方法
- 删除元素
如果是要删除元素 第一個參數為從第幾個開始 第二個參數傳入你要删除幾個元素 如果隻傳第一個元素 則第一個參數下标的元素 後面的全部删除
- 插入元素
第一個表示開始元素 第二個參數預設為0 第三個以後的參數為要插入的參數
- 替換元素
第一個表示參數開始,第二個參數表示截止,第3個以後的參數表示插入的參數
- 删除元素
-
sort方法
将list進行排序
-
reverse方法
将list進行反轉
-
進階字元串
`` 可以識别換行符
function
- function縮寫
add: function() {}
// 可以改寫為
add(){}
- function不定長參數
add(...param){}
// ...表示可接受不定長的參數 此時param為list類型
// 類似于python的 def add(*param)
- for循環
// 普通for循環
for (let i = 0; i < 10; i++){
console.log(list[i]);
}
// 索引for循環
for (let i in [1, 2, 3]){
console.log(list[i])
}
// 增強for循環
for (let item of [1, 2, 3]){
console.log(item)
}
- 高階函數
// filter函數
const numList = [10, 20, 100, 21, 50, 20, 332, 213, 2123];
let newList = numList.filter(function(n){
return n >= 50
});
// map函數
let new2List = newList.map(function(n) {
return n * 2
});
// reduce函數 對數組中所有内容進行彙總 第一個參數為回調函數 第二個參數為初始化的值
let totalCount = new2List.reduce(function(preValue, n){
// 初始化preValue是高階函數初始化的值 n是list中的元素
// 每一次回調都會将 return的結果指派給preValue
return preValue + n
}, 0);
- 箭頭函數
const numList = [10, 20, 100, 21, 50, 20, 332, 213, 2123];
let total = numList.filter(n => n <= 50).map(n => n * 2).reduce((pre, n) => pre + n, 0);
console.log(total);
元件化
- 基本使用
- 全局元件 全局元件表示注冊的元件可以在任何地方使用
- 局部元件 建立的局部元件隻能在挂載元素的内部使用
// 建立元件構造器(子元件)
const cpn1 = Vue.extend({
template: `
<div>
<h2>cpn1标題</h2>
<p>cpn1内容</p>
</div>
`
});
// 建立元件構造器(父元件)
const cpn = Vue.extend({
// ``是進階字元串 可以換行
template: `
<div>
<h2>cpn标題</h2>
<p>cpn内容</p>
<cpn1></cpn1>
</div>
`,
// 這裡可以在元件構造器内注冊其他元件 這注冊的這個元件可以用在模闆内
components: {
cpn1: cpn1
}
});
// 注冊全局元件
Vue.component('my-dev', cpn);
// 注冊局部元件 vm可以看做是root元件
const vm = new Vue({
el: '#app',
data: {},
methods:{},
// 注冊局部元件
component:{
cpn: cpn
}
});
// 使用元件
// <my-dev></my-dev>
- 元件注冊文法糖
- 注冊 可以直接省略 extend 直接用對象進行替代
Vue.component('cpn1', {
template: `
<div>
<h2>cpn1标題</h2>
<p>cpn1内容</p>
</div>
`
});
- 模闆分離寫法
<!--通過id 進行選擇器給template屬性指派 替代template中看起來很難受的字元串-->
<script type="text/x-template" id="cpn">
<h3>标題</h3>
<p>内容。。。</p>
</script>
<template id="cpn2">
<h1>标題</h1>
</template>
<script>
Vue.component('my-cpn', {
template: "#cpn"
});
</script>
-
元件内容通路Vue執行個體資料
預設元件内部是不能直接通路Vue執行個體内的資料内容的
在元件的内部會有一個data屬性 而這個data屬性必須是一個函數 傳回一個對象,對象内部儲存着資料
- 為什麼元件内的data必須是一個函數?
因為元件在複用時 應用的data如果是一個對象的話 ,那麼每次引用都是同一個對象,當對這個 對象作出更改的時候,所有用到該資料的地方都會被關聯修改,是以需要用函數傳回一個對象 這代表這每一次 複用元件都會去調用一次data函數 擷取一個新的data對象,這樣就能互相隔離,其實這裡是類似于深拷貝和淺拷貝的關系
- 為什麼元件内的data必須是一個函數?
元件之間的通信
- props的用法(父元件向子元件傳遞)
- props支援的資料類型
- String
- Number
- Boolean
- Array
- Object
- Date
- Function
- Symbol
- 注意: 當定義分離模闆時需要一個根元件 如果沒有根元件則不能正常解析
<!--子元件模闆-->
<template id="cpn">
<div>
<p>{{c_movies}}</p>
<h2>{{c_message}}</h2>
<ul>
<li v-for="item in c_movies"> {{item}}</li>
</ul>
</div>
</template>
<!--父元件模闆-->
<div id="app">
<!-- props資料來雙向綁定父元件中的資料-->
<cpn :c_movies="movies" :c_message="message"></cpn>
</div>
<script>
// 子元件
const cpn = {
template: "#cpn",
// 父親元件向子元件傳遞資料
// 第一種 數組方式
// props: ['c_movies', 'c_message'],
// 第二種 對象方式
props: {
// 1.類型限制
// c_movies: Array,
// c_message: String,
// 2.提供一些預設值
c_message: {
// 資料類型
type: String,
// 預設值
default: '這個是消息資料',
// 是否必選參數
required: true,
},
c_movies: {
type: Array,
default: []
}
},
data() {
return {}
}
};
// 父元件
const vm = new Vue({
el: "#app",
data: {
message: '資訊',
movies: ['海王', '海賊王', '慶餘年', '神話']
},
components: {
cpn: cpn
}
});
</script>
- this.$emit的用法(子元件向父元件傳遞事件)
<!--子元件模闆-->
<template id="cpn">
<div>
<button v-for="item in categories" @click="bthClick(item)">
{{item.name}}
</button>
</div>
</template>
<!--父元件模闆-->
<div id="app">
<!--監聽子元件事件-->
<!--監聽到子元件事件後 如果綁定父元件的method若不傳item 則預設就是item 不是event-->
<cpn @item_click="cpn_click"></cpn>
</div>
<script>
// 子元件
const cpn = {
template: "#cpn",
data() {
return {
categories: [
{id: '1', name: '熱門推薦'},
{id: '2', name: '手機數位'},
{id: '3', name: '家用家電'},
{id: '4', name: '電腦辦公'},
{id: '5', name: '生活日用'},
]
}
},
methods: {
bthClick(item) {
console.log(item);
// 發射子元件的自定義事件到父元件 傳遞item參數
this.$emit("item_click", item)
}
}
};
// 父元件
const vm = new Vue({
el: "#app",
data: [],
components: {
cpn
},
methods: {
// 接受item參數
cpn_click(item) {
console.log('監聽到了來自子元件的事件!');
console.log(item);
}
}
});
</script>