URL:Introduction - Vue.jshtml
所演示的示例,都是在JS中將Vue實例綁定至HTML中的指定元素,而後再經過Vue實例中data
內的屬性或者methods
中的方法,來對所綁定元素的子元素進行操做的,而不是對指定ID元素自己進行操做。前端
<div id="app"> {{ message }} </div>
有時候代碼正常,可是Vue會報以下的錯誤,多是由於在HTML頁面中,JS腳本的載入在HTML頁面的渲染以前執行了,解決方法就是把相關的script
標籤移動至body
標籤內最後的部分。vue
[Vue warn]: Cannot find element: #element-id
在HTML的元素內寫上{{ message }}
,而後在JS中爲data
內的message
屬性指定值,便可顯示所指定的文本,這是最基礎的顯示文本的方式。數組
在JS中,el用於定位HTML元素,Vue實例中的message屬性與HTML中的字段同名,其值則會被渲染在最終的HTML頁面中。安全
若是在控制檯中手動更改app1.message
的值,則可以看到HTML頁面中顯示的文本也會即時更新。app
<div id="app1"> {{ message }} </div>
var app1 = new Vue({ el: '#app1', data: { message: 'Hello Vue!' } })
在HTML中,經過v-bind
這個指令來綁定至元素的指定屬性,如v-bind:title
就會將Vue實例綁定至HTML元素的title
屬性上。ide
帶v-
前綴的指令用於對所渲染的DOM執行響應式操做。函數
下面的代碼實現的效果是:當鼠標懸浮至span
元素所顯示的文本上時,就會顯示JS中message
的值,即:ui
'You loaded this page on ' + new Date()
this
<div id="app2"> <span v-bind:title="message"> Hover your mouse over me for a few seconds to see my dynamically bound title! </span> </div>
var app2 = new Vue({ el: '#app2', data: { message: 'You loaded this page on ' + new Date() } })
若是用下面第一行的寫法,那麼最終渲染出來的HTML源代碼則爲第二行中的樣子,而不是指望中的:將innerHTML
屬性綁定至message
字段便可顯示指定的文本。
<div v-bind:innerHTML="message"></div> // original code <div innerHTML="Hello Vue"></div> // rendered content
Vue不只能夠將數據綁定至屬性,還可以綁定到DOM的結構上。
經過設置Vue實例中任意屬性值爲true
或者false
,能夠生成或刪除該元素。
查看最終的HTML源代碼可知,Vue刪除元素並非更改其display
屬性,而是直接將整個HTML元素替換爲<!---->
這段字符串,這樣更安全,用戶將沒法經過查看源代碼的方式來拿到元素本來的內容。
<div id="app3"> <p v-if="seen">Now you see me :)</p> </div>
var app3 = new Vue({ el: '#app3', data: { seen: true } })
v-for
指令用於循環遍歷數組中的元素。
在下面的示例中,Vue實例的todos
屬性包含三個元素,元素字段名爲text
,字段值爲字符串。
而在HTML頁面中,在ol
以內的li
元素只需寫一個。經過v-for
指令,可以根據Vue實例中對應屬性裏的元素個數,直接生成指定個li
元素,其中不包含HTML原始代碼裏的那個li
元素。
對於每一個生成的li
元素,設置其文本爲所綁定todos
屬性中所對應的text
字段的值。即第一個li
元素的值,爲todos
屬性中第一個text
字段的值,第二個li
元素的值爲第二個text
字段的值,以此類推。
<div id="app-4"> <ol> <li v-for="todo in todos"> {{ todo.text }} </li> </ol> </div>
var app4 = new Vue({ el: '#app-4', data: { todos: [ { text: 'Learn JavaScript' }, { text: 'Learn Vue' }, { text: 'Build something awesome' } ] } })
app4.todos.push({ text: 'You made it!'})
語句會在app4
這個Vue實例的todos
屬性的最後再添加一個text
字段。
v-on
指令用於綁定事件監聽至指定的HTML元素上,這樣能夠調用所關聯的Vue實例中的方法。
在下面的示例中,經過Vue實例中的reverseMessage
方法,來將message
屬性中的文本逆序排列。
<div id="app-5"> <p>{{ message }}</p> <button v-on:click="reverseMessage">Reverse Message</button> </div>
var app5 = new Vue({ el: '#app-5', data: { message: 'Hello Vue!' }, methods: { reverseMessage: function () { this.message = this.message.split('').reverse().join('') } } })
v-model
實現雙向數據綁定的效果。
在下面的示例中,v-model="message"
實現對message
的雙向綁定。
在input
控件中輸入的內容會同步更新至p
元素。
可是!p
元素的內容被更改以後,input
控件中的內容並不會同步更新。(那應該如何理解這個雙向數據綁定呢?)
<div id="app-6"> <p>{{ message }}</p> <input type="text" v-model="message"> </div>
var app6 = new Vue({ el: '#app-6', data: { message: 'Hello Vue!' } })
在Vue中,組件 - Component,是一個很是重要的概念。
編寫大型應用時,不少地方是通用的,能夠劃分爲若干個體積小的、自包含的(啥意思?)、可重用的組件。好比以列表形式展現內容的模塊,就能夠編寫爲一個大組件,而列表中的每一個內容,又是一個小組件。
本質上,Vue中的組件就是一個帶預約義設置的Vue實例。下面的代碼示範瞭如何註冊一個Vue組件:
Vue.component('todo-item', { template: '<li>This is a todo</li>' })
註冊完組件以後,在HTML中,就能夠用下面的方式建立一個組件的實例:
<ol> <todo-item></todo-item> </ol>
可是以上面的方式來簡單地定義一個組件的話,若是建立多個組件的實例,生成的文本都是相同的。爲了讓各個組件有不一樣的內容,能夠經過props
屬性,來將父級域的值,傳遞給子組件。
Vue.component('todo-item', { props: ['todo'], template: '<li>{{ todo.text }}</li>' })
而後就能夠經過v-bind
指令,在HTML中將父元素的值傳遞給各個子組件。
下面的代碼,在HTML中遍歷Vue實例中groceryList
屬性裏的每一項item
,並將每一個item
與todo
綁定。
而在定義組件的JS代碼中,接收傳入的todo
,並在li
元素中顯示todo
中的字符串。
// 定義Vue組件todo-item // 組件中經過名爲todo的props屬性 // 來從父級域向子組件中傳遞數據 // 下面的代碼便是將傳遞給todo屬性的text字段渲染至'li'元素中 Vue.component('todo-item', { props: ['todo'], template: '<li>{{ todo.text }}</li>' } // Vue實例中定義屬性數組groceryList new Vue({ ... data: { groceryList: [ { text: '...' }, { text: '...' }, { text: '...' } ] } }) // HTML中建立todo-item組件 // 遍歷屬性數組groceryList中的每一項item // 並將其與todo綁定 // 如此即可將每一個todo中的數據傳至各個組件中 <todo-item v-for="item in groceryList" v-bind:todo="item">
再總結一下上面的例子:
在Vue實例中定義屬性數組,數組中的元素用於在前端頁面上以有序列表形式顯示;
定義Vue組件,設置好所綁定的props屬性的名稱,以及Vue實例中屬性數組元素的顯示格式;
在前端HTML頁面中,寫一個組件,用v-for
遍歷屬性數組,並用v-bind
將實例中的數據傳遞給前臺。