var vm=new vue({html
//這裏是選項 他能夠包含數據、模板、掛載元素、方法、生命週期鉤子等函數vue
})node
created在實例被建立後調用vuex
created(){express
this.hello();數組
}緩存
beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyedapp
底層實現上Vue將模板編譯成虛擬DOM渲染函數,在應用狀態改變時,vue計算出從新渲染組件的最小代價並應用到DOM上。函數
先看怎麼用測試
插值:雙大括號!!!!!!必須的 數據改變 大括號內的值也跟着改變
<span>{{msg}}</span>
若是你想插入一次接下來大括號內的數據不改變 則添加v-once屬性:
<span v-once>不改變{{msg}}</span>
<span>{{msg}}</span>效果和<span v-html="msg"></span>相同 ,可是後者是將數據轉變爲純文本 不是HTML 爲了輸出HTML 因此使用v-html
大括號不能在HTML屬性中使用 要使用v-bind
<span v-bind:id="msg"></span>
若是msg爲false 移除屬性
<span></span>
{{msg+1}}
{{msg==true?0:1}}
<div v-if="msg">若是msg爲true則插入div標籤</div>
<div v-bind:id="msg">若是msg爲false則移除屬性,不然顯示</div>
<div v-on:click="toDo">點擊觸發函數</div>
<input v-model="msg"/>//雙向數據綁定
.....等等 vue還支持自定義指令。後面說。
v-bind:href 或者 v-bind:id 能夠縮寫爲 :href 和:id 就是省略前面的 v-bind
v-on:click 縮寫爲@click=""
computed 計算屬性會根據data 的值改變
<div>{{getNewMsg}}</div>
new Vue({
el:'#App',
data:{
msg:'hello'
},
computed:{
getNewMsg:function(){
return this.msg.split('').reverse().join('');
}
}
})
上邊代碼計算屬性只用到了get,沒有set。因此咱們能夠給本身一個set
下面舉一個小例子
<template>
methods也能夠實現剛纔computed的效果。
<div>{{getNewMsg}}</div>
new Vue({
el:'#App',
data:{
msg:'hello'
},
methods:{
getNewMsg:function(){
return this.msg.split('').reverse().join('');
}
}
})
寫法上的區別是computed計算屬性的方式在用屬性時不用加(),而methods方式在使用時要像方法同樣去用,必須加()。
兩種方式在緩存上也大有不一樣,利用computed計算屬性是將 content與message綁定,只有當message發生變化時纔會觸發content,而methods方式是每次進入頁面都要執行該方法,可是在利用實時信息時,好比顯示當前進入頁面的時間,必須用methods方式
用於觀察VUE實例上的數據變更
<div>{{msg}}</div>
new Vue({
el:'#App',
data:{
msg:'hello',
text:'word',
all:''
},
watch:{
msg:function(){
this.all=this.msg+this.text;
}
}
})
<div class="boxStyle" v-bind:class="{active:isActive}"></div>
若是isActive爲false 則不顯示 active 這個class,不然相反。
class和v-bind:class能夠共同使用。
class支持三目運算符 <div v-bind:class="active?style01:style02"></div>
內聯樣式 <div v-bind:style="{color:red,fontSize:fontSize+'px'}"></div>
還能夠綁定到一個對象上
<div v-bind:style="obj"></div>
data(){
return{
obj:{
color:'red',
fontSize:'12px'
}
}
}
v-if 、 v-else、v-else-if
<div v-if="msg>0">大於0</div>
<div v-else-if="msg==0">等於0</div>
<div v-else>小於0</div>
還可使用template
<template v-if="msg>0">
<div>1111</div>
</template>
<template v-else>
<div>2222</div>
</template>
上邊的代碼修改msg切換不一樣的div內容,可是vue是不會從新渲染div標籤的。根據就地複用策略,只是替換div裏面的內容。若是想每次都從新渲染div標籤。須要使用key,key不一樣則每次從新渲染。
v-show只是控制display。
v-if有更高的切換消耗,v-show有更高的初始化消耗。
v-for
data(){
return{
parents:"我是",
msg:[
{name:'foo'},
{name:'bar'},
]
}
}
<div>
<div v-for="{data,index} in msg">
{{parents}}-{{index}}-{{data.name}}
</div>
</div>
渲染結果: 我是-0-foo 我是-1-bar
使用template的好處
1。經過HTML模板就能夠輕鬆定位JS對應方法
2。不須要JS手動綁定事件,易於測試
3。當viewmodel銷燬 全部的事件處理器自動刪除,無需手動刪除
<div v-on:click="msg">點擊</div>
new Vue({
el:'app',
methods:{
say:function(name,event){
alert(name+'我是vue')
if(event){event.preventDefault}
}
}
})
若是要獲取原生DOM事件,須要傳入event
.stop 組件單擊事件冒泡
.prevent 提交事件不在重載頁面
.capture 使用事件捕獲模式
.self 只當在本元素才發生
.once 新增
使用方式:
<div v-on:click.stop></div>
修飾符能夠串聯
<div v-on:click.stop.prevent="todo"></div>
v-model 實現雙向數據綁定
<span>{{msg}}</span>
<input v-model="msg"/>
new Vue({
el:'#app',
data:{
msg:'我是默認'
}
})
不管是複選框 單選框 下拉列表 基本上獲取到用戶選中的值的方式,就是使用v-model到一個數組
<input type="checkbox" id="jack" value="jack" v-model="checkedName"/>
<label for="jack">jack</label>
<input type="checkbox" id="mini" value="mini" v-model="checkedName"/>
<label for="mini">mini</label>
若是用戶選中,則數組會把選中對象的value值存入數組中。
.lazy 取消input事件轉爲change事件同步
.number 將用戶輸入的值轉爲number類型,若是返回NAN,則返回原值
.trim 取消先後空格
使用方式:
<input v-model.lazy="msg"/>
Vue.component('my-component',{
//選項
data:function(){
//在組件裏 data 必須是函數,而且不能使用箭頭函數
}
})
經過使用組件實例選項註冊,可使組件在另外一個組件中使用
var child={
template:'<div>我是組件</div>'
}
new Vue({
components:{
'my-components ':child
}
})
思想:父組件通訊子組件,使用props。子組件通訊父組件使用自定義事件,經過$on('事件名稱')監聽事件 和 $emit('事件名稱') 觸發事件。
若是使用vuex,在根組件註冊,咱們在任意組件中均可以經過$store拿到store對象。若是子組件想要獲取到父組件的數據,或者說非父子組件想要拿到彼此的數據,最高效的方式是使用vuex。
可是,仍是要說下基本的props用法。
Vue.components('child',{
props :['msg'],
template:'<div>{{msg}}</div>'
})
<child msg="hello"></child>
注意:由於HTML不區分大小寫,因此在傳遞props時,駝峯寫法要經過短橫線隔開
<div my-props="hello"></div>
Vue.components('child',{
props:['myProps'],
template:'<div>{{myProps}}</div>'
})
傳遞props使用 v-bind,這樣父組件修改子組件也獲得修改
<div>
<input v-model="msg"/>
<child v-bind:msg="msg"></child>
</div>
Vue.components('child',{
props:['msg'],
template:'<div>{{msg}}</div>'
})
字面量:<child msg="1"></child> props爲 "1"
動態語法: <child v-bind:msg="1"></child> props爲 1
props是單向綁定的,父組件修改影響子組件,可是不能反過來,這是爲了防止子組件修改父組件的狀態,讓數據流難以理解。
能夠經過Vuex管理state,這樣子就避免了繁瑣的props傳遞。後面會發布VUEX講解的文章,請關注~
只用於new建立的實例中,建立實例時傳遞 props。主要做用是方便測試。
支持類型:string number boolean function object array
props:{
msg:Number,//只檢測類型
//檢測類型+其餘驗證
call:{
type:Number,
default:0,
requiredLtrue,
validator:function(val){
return val>=0
}
}
}
使用 v-on 綁定事件
父組件在使用子組件的地方直接用v-on監聽子組件觸發的事件, 子組件觸發事件會觸發父組件事件
子組件中要使用this.$emit('事件',參數)
父組件就可使用 $on去監聽
例如 在父組件中:
<child v-on:子組件$emit的事件名稱="父組件事件名稱"></child>
使用一個空的vue實例做爲中央事件總棧
var bus=new Vue()
在A組件中觸發事件
bus.$emit('a',1);
在B組件建立的鉤子中監聽事件
bus.$on('a',function(id){
})
在子組件中
<div>
<h1>我是子組件標題</h1>
<slot>只有在沒分發的內容才顯示</slot>
</div>
在父組件中
<div>
<child>
<p>這裏的內容會替換掉子組件中的slot</p>
</child>
</div>
渲染結果爲
<div>
<div>
<h1>我是子組件標題</h1>
<p>這裏的內容會替換掉子組件中的slot</p>
</div>
</div>
給slot添加name屬性
在子組件中
<div>
<h1>我是子組件標題</h1>
<slot name="body">我是具名slot</slot>
</div>
在父組件中
<div>
<child>
<div slot="body">這裏替換掉 name爲body的slot</div>
</child>
</div>
不想使用template,也能夠用render寫JSX。例如根據判斷自動生成DOM結構,若是大量的判斷用template會有大量的代碼,這時候能夠用render,使用createElement去建立標籤。
這裏只寫個小用法。
new Vue({
el:"#app",
render:h=>h(App)
})
若是不使用render咱們能夠這樣
new Vue({
el:'#app',
components:{App},
template:'<App/>'
})
有時候咱們須要對DOM元素進行底層操做,因此須要自定義事件。
例如咱們建立v-focus
Vue.directive('focus',{
inserted:function(el){
el.focus();
}
})
組件接收一個選項
directives:{
focus:{
//指定的定義
}
}
使用:<div v-focus></div>
剛纔咱們全局定義 用到了 inserted函數,這就是鉤子函數。
bind:function(){} //只調用一次,指令第一次綁定到元素時調用。
inserted:function(){} //被綁定元素插入到父節點 調用
update:function(){} //更新時調用
componentUpdated:function(){} //被綁定元素所在模板完成一次更新週期時調用
unbind:function(){} //指令與元素解綁調用
el:指令綁定的元素對象
binding:一個obj對象,他包括如下屬性:
name:指令名稱
value:綁定的值
oldValue:前一個值 只能在update函數和componentUpdate函數中使用
expression:綁定的值是字符串形式 例如 v-demo="1" 爲1
arg: 傳給指令的值 v-demo:foo arg值爲foo
modifiers: 修飾符對象 只能在update函數和componentUpdate函數中使用
vnode:vue編譯生成的虛擬節點
oldVnode:上一個虛擬節點
var mixin={
created:function(){
this.hello();
},
methods:{
hello:function(){
console.log("Hello");
}
}
}
var Component=Vue.extend({
mixins:[mixin]
})
若是相同的屬性,都會被調用,只是混合對象的鉤子將在組件自身鉤子以前調用
若是 例如 方法的名字相同,就取組件自身的方法