一、初始化Vue對象:html
<body>vue
<div id="app">ios
<h1>{{ message }}</h1> //若是是methods中的函數須要加()寫法爲{{ 函數名( )}} 計算屬性computed中不須要加();ajax
</div>axios
<script>api
new Vue({數組
el:"#app", //el 是element的縮寫 後面是相似的選擇方式,使用英文(,)進行隔離瀏覽器
data : { //data 是vue的一種方法裏面用於存放變量,數組等緩存
message: 'nashengYa' , //單個寫法app
users:[ //數組寫法 須要使用v-for進行遍歷
{name:'nansheng',age:'24',show:false},
{name:'tim',age:'24',show:false},
{name:'tony',age:'18',show:false},
{name:'herry',age:'23',show:false},
{name:'james',age:'21',show:false},
]
},
methods:{ //methods 是Vue的一種方式,用來實現一些方法
},
})
</script>
</body>
二、計算屬性computed:
computed 與 methods 的區別:
1. 若是是methods中的函數須要加()寫法爲{{ 函數名( )}} 計算屬性computed中不須要加();
2 .兩種方式在緩存上也大有不一樣,利用computed計算屬性是將 content與message綁定,只有當message發生變化時纔會觸發content,而methods方式是每次進入頁面都要執行該方法,可是在利用實時信息時,好比顯示當前進入頁面的時間,必須用methods方式
計算屬性
計算屬性
在模板中綁定表達式是很是便利的,可是它們實際上只用於簡單的操做。在模板中放入太多的邏輯會讓模板太重且難以維護。例如:
<div id="example"> {{ message.split('').reverse().join('') }} </div> |
在這種狀況下,模板再也不簡單和清晰。在實現反向顯示 message
以前,你應該確認它。這個問題在你不止一次反向顯示 message 的時候變得更加糟糕。
這就是爲何任何複雜邏輯,你都應當使用計算屬性。
基礎例子
<div id="example"> <p>Original message: "{{ message }}"</p> <p>Computed reversed message: "{{ reversedMessage }}"</p> </div> |
var vm = new Vue({ el: '#example', data: { message: 'Hello' }, computed: { // a computed getter reversedMessage: function () { // `this` points to the vm instance return this.message.split('').reverse().join('') } } }) |
結果:
Original message: "Hello"
Computed reversed message: "olleH"
這裏咱們聲明瞭一個計算屬性 reversedMessage
。咱們提供的函數將用做屬性 vm.reversedMessage
的 getter 。
console.log(vm.reversedMessage) // -> 'olleH' vm.message = 'Goodbye' console.log(vm.reversedMessage) // -> 'eybdooG' |
你能夠打開瀏覽器的控制檯,修改 vm 。 vm.reversedMessage
的值始終取決於 vm.message
的值。
你能夠像綁定普通屬性同樣在模板中綁定計算屬性。 Vue 知道 vm.reversedMessage
依賴於 vm.message
,所以當 vm.message
發生改變時,依賴於 vm.reversedMessage
的綁定也會更新。並且最妙的是咱們是聲明式地建立這種依賴關係:計算屬性的 getter 是乾淨無反作用的,所以也是易於測試和理解的。
計算緩存 vs Methods
你可能已經注意到咱們能夠經過調用表達式中的method來達到一樣的效果:
<p>Reversed message: "{{ reverseMessage() }}"</p> |
// in component methods: { reverseMessage: function () { return this.message.split('').reverse().join('') } } |
不通過計算屬性,咱們能夠在 method 中定義一個相同的函數來替代它。對於最終的結果,兩種方式確實是相同的。然而,不一樣的是計算屬性是基於它的依賴緩存。計算屬性只有在它的相關依賴發生改變時纔會從新取值。這就意味着只要 message
沒有發生改變,屢次訪問 reversedMessage
計算屬性會當即返回以前的計算結果,而沒必要再次執行函數。
這也一樣意味着以下計算屬性將不會更新,由於 Date.now()
不是響應式依賴:
computed: { now: function () { return Date.now() } } |
相比而言,每當從新渲染的時候,method 調用總會執行函數。
咱們爲何須要緩存?假設咱們有一個重要的計算屬性 A ,這個計算屬性須要一個巨大的數組遍歷和作大量的計算。而後咱們可能有其餘的計算屬性依賴於 A 。若是沒有緩存,咱們將不可避免的屢次執行 A 的 getter !若是你不但願有緩存,請用 method 替代。
計算屬性 vs Watched Property
Vue.js 提供了一個方法 $watch
,它用於觀察 Vue 實例上的數據變更。當一些數據須要根據其它數據變化時, $watch
很誘人 —— 特別是若是你來自 AngularJS 。不過,一般更好的辦法是使用計算屬性而不是一個命令式的 $watch
回調。思考下面例子:
<div id="demo">{{ fullName }}</div> |
var vm = new Vue({ el: '#demo', data: { firstName: 'Foo', lastName: 'Bar', fullName: 'Foo Bar' }, watch: { firstName: function (val) { this.fullName = val + ' ' + this.lastName }, lastName: function (val) { this.fullName = this.firstName + ' ' + val } } }) |
上面代碼是命令式的和重複的。跟計算屬性對比:
var vm = new Vue({ el: '#demo', data: { firstName: 'Foo', lastName: 'Bar' }, computed: { fullName: function () { return this.firstName + ' ' + this.lastName } } }) |
這樣更好,不是嗎?
計算 setter
計算屬性默認只有 getter ,不過在須要時你也能夠提供一個 setter :
// ... computed: { fullName: { // getter get: function () { return this.firstName + ' ' + this.lastName }, // setter set: function (newValue) { var names = newValue.split(' ') this.firstName = names[0] this.lastName = names[names.length - 1] } } } // ... |
如今在運行 vm.fullName = 'John Doe'
時, setter 會被調用, vm.firstName
和 vm.lastName
也會被對應更新。
觀察 Watchers
雖然計算屬性在大多數狀況下更合適,但有時也須要一個自定義的 watcher 。這是爲何 Vue 提供一個更通用的方法經過 watch
選項,來響應數據的變化。當你想要在數據變化響應時,執行異步操做或昂貴操做時,這是頗有用的。
例如:
<div id="watch-example"> <p> Ask a yes/no question: <input v-model="question"> </p> <p>{{ answer }}</p> </div> |
<!-- Since there is already a rich ecosystem of ajax libraries --> <!-- and collections of general-purpose utility methods, Vue core --> <!-- is able to remain small by not reinventing them. This also --> <!-- gives you the freedom to just use what you're familiar with. --> <script src="https://unpkg.com/axios@0.12.0/dist/axios.min.js"></script> <script src="https://unpkg.com/lodash@4.13.1/lodash.min.js"></script> <script> var watchExampleVM = new Vue({ el: '#watch-example', data: { question: '', answer: 'I cannot give you an answer until you ask a question!' }, watch: { // 若是 question 發生改變,這個函數就會運行 question: function (newQuestion) { this.answer = 'Waiting for you to stop typing...' this.getAnswer() } }, methods: { // _.debounce 是一個經過 lodash 限制操做頻率的函數。 // 在這個例子中,咱們但願限制訪問yesno.wtf/api的頻率 // ajax請求直到用戶輸入完畢纔會發出 // 學習更多關於 _.debounce function (and its cousin // _.throttle), 參考: https://lodash.com/docs#debounce getAnswer: _.debounce( function () { var vm = this if (this.question.indexOf('?') === -1) { vm.answer = 'Questions usually contain a question mark. ;-)' return } vm.answer = 'Thinking...' axios.get('https://yesno.wtf/api') .then(function (response) { vm.answer = _.capitalize(response.data.answer) }) .catch(function (error) { vm.answer = 'Error! Could not reach the API. ' + error }) }, // 這是咱們爲用戶中止輸入等待的毫秒數 500 ) } }) </script> |
結果:
Ask a yes/no question:
I cannot give you an answer until you ask a question!
在這個示例中,使用 watch
選項容許咱們執行異步操做(訪問一個 API),限制咱們執行該操做的頻率,並在咱們獲得最終結果前,設置中間狀態。這是計算屬性沒法作到的。
除了 watch
選項以外,您還可使用 vm.$watch API 命令。
三、v-bind、v-if、v-for、v-on、v-html、v-show:
1.v-bind 綁定屬性
eg : 1. 綁定class:
對象語法
咱們能夠傳給 v-bind:class
一個對象,以動態地切換 class 。
<div v-bind:class="{ active: isActive }"></div> |
上面的語法表示 classactive
的更新將取決於數據屬性 isActive
是否爲真值 。
咱們也能夠在對象中傳入更多屬性用來動態切換多個 class 。此外, v-bind:class
指令能夠與普通的 class 屬性共存。以下模板:
<div class="static" v-bind:class="{ active: isActive, 'text-danger': hasError }"> </div> |
以下 data:
data: { isActive: true, hasError: false } |
渲染爲:
<div class="static active"></div> |
當 isActive
或者 hasError
變化時,class 列表將相應地更新。例如,若是 hasError
的值爲 true
, class列表將變爲 "static active text-danger"
。
你也能夠直接綁定數據裏的一個對象:
<div v-bind:class="classObject"></div> |
data: { classObject: { active: true, 'text-danger': false } } |
渲染的結果和上面同樣。咱們也能夠在這裏綁定返回對象的計算屬性。這是一個經常使用且強大的模式:
<div v-bind:class="classObject"></div> |
data: { isActive: true, error: null }, computed: { classObject: function () { return { active: this.isActive && !this.error, 'text-danger': this.error && this.error.type === 'fatal', } } } |
數組語法
咱們能夠把一個數組傳給 v-bind:class
,以應用一個 class 列表:
<div v-bind:class="[activeClass, errorClass]"> |
data: { activeClass: 'active', errorClass: 'text-danger' } |
渲染爲:
<div class="active text-danger"></div> |
若是你也想根據條件切換列表中的 class ,能夠用三元表達式:
<div v-bind:class="[isActive ? activeClass : '', errorClass]"> |
此例始終添加 errorClass
,可是隻有在 isActive
是 true 時添加 activeClass
。
不過,當有多個條件 class 時這樣寫有些繁瑣。能夠在數組語法中使用對象語法:
<div v-bind:class="[{ active: isActive }, errorClass]"> |
2. 綁定style:
綁定內聯樣式
對象語法
v-bind:style
的對象語法十分直觀——看着很是像 CSS ,其實它是一個 JavaScript 對象。 CSS 屬性名能夠用駝峯式(camelCase)或短橫分隔命名(kebab-case):
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div> |
data: { activeColor: 'red', fontSize: 30 } |
直接綁定到一個樣式對象一般更好,讓模板更清晰:
<div v-bind:style="styleObject"></div> |
data: { styleObject: { color: 'red', fontSize: '13px' } } |
一樣的,對象語法經常結合返回對象的計算屬性使用。
數組語法
v-bind:style
的數組語法能夠將多個樣式對象應用到一個元素上:
<div v-bind:style="[baseStyles, overridingStyles]"> |
自動添加前綴
當 v-bind:style
使用須要特定前綴的 CSS 屬性時,如 transform
,Vue.js 會自動偵測並添加相應的前綴。