vue學習筆記1:vue基礎知識(組件以前)

一、初始化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 會自動偵測並添加相應的前綴。

相關文章
相關標籤/搜索