Vue 3.0 介紹

2022-03-08 11:45 更新

提示

已經了解 Vue 2,只想了解 Vue 3 的新功能可以參閱遷移指南!

#Vue.js 是什么

Vue (讀音 /vju?/,類似于 view) 是一套用于構建用戶界面的漸進式框架。與其它大型框架不同的是,Vue 被設計為可以自底向上逐層應用。Vue 的核心庫只關注視圖層,不僅易于上手,還便于與第三方庫或既有項目整合。另一方面,當與現(xiàn)代化的工具鏈以及各種支持類庫結合使用時,Vue 也完全能夠為復雜的單頁應用提供驅動。

如果你想在深入學習 Vue 之前對它有更多了解,我們制作了一個視頻,帶你了解其核心概念和一個示例工程。

如果你已經是有經驗的前端開發(fā)者,想知道 Vue 與其它庫/框架有哪些區(qū)別,請查看對比其它框架。

#起步

安裝

TIP

官方指南假設你已了解關于 HTML、CSS 和 JavaScript 的中級知識。如果你剛開始學習前端開發(fā),將框架作為你的第一步可能不是最好的主意——掌握好基礎知識再來吧!之前有其它框架的使用經驗會有幫助,但這不是必需的

嘗試 Vue.js 最簡單的方法是使用 Hello World 例子,你可以在瀏覽器新標簽頁中打開它,跟著例子學習一些基礎用法。

安裝教程給出了更多安裝 Vue 的方式。請注意我們不推薦新手直接使用 vue-cli,尤其是在你還不熟悉基于 Node.js 的構建工具時。

#聲明式渲染

Vue.js 的核心是一個允許采用簡潔的模板語法來聲明式地將數(shù)據(jù)渲染進 DOM 的系統(tǒng):

  1. <div id="counter">
  2. Counter: {{ counter }}
  3. </div>

  1. const Counter = {
  2. data() {
  3. return {
  4. counter: 0
  5. }
  6. }
  7. }
  8. Vue.createApp(Counter).mount('#counter')

我們已經成功創(chuàng)建了第一個 Vue 應用!看起來這跟渲染一個字符串模板非常類似,但是 Vue 在背后做了大量工作。現(xiàn)在數(shù)據(jù)和 DOM 已經被建立了關聯(lián),所有東西都是響應式的。我們要怎么確認呢?請看下面的示例,其中 counter property 每秒遞增,你將看到渲染的 DOM 是如何變化的:

  1. const CounterApp = {
  2. data() {
  3. return {
  4. counter: 0
  5. }
  6. },
  7. mounted() {
  8. setInterval(() => {
  9. this.counter++
  10. }, 1000)
  11. }
  12. }

Counter: 36

Stop timer

除了文本插值,我們還可以像這樣綁定元素的 attribute:

  1. <div id="bind-attribute">
  2. <span v-bind:title="message">
  3. 鼠標懸停幾秒鐘查看此處動態(tài)綁定的提示信息!
  4. </span>
  5. </div>

  1. const AttributeBinding = {
  2. data() {
  3. return {
  4. message: 'You loaded this page on ' + new Date().toLocaleString()
  5. }
  6. }
  7. }
  8. Vue.createApp(AttributeBinding).mount('#bind-attribute')

點擊此處實現(xiàn)

這里我們遇到了一點新東西。你看到的 v-bind attribute 被稱為指令。指令帶有前綴 v-,以表示它們是 Vue 提供的特殊 attribute??赡苣阋呀洸碌搅耍鼈儠阡秩镜?DOM 上應用特殊的響應式行為。在這里,該指令的意思是:“將這個元素節(jié)點的 title attribute 和當前活躍實例的 message property 保持一致”。

#處理用戶輸入

為了讓用戶和應用進行交互,我們可以用 v-on 指令添加一個事件監(jiān)聽器,通過它調用在實例中定義的方法:

  1. <div id="event-handling">
  2. <p>{{ message }}</p>
  3. <button v-on:click="reverseMessage">反轉 Message</button>
  4. </div>

  1. const EventHandling = {
  2. data() {
  3. return {
  4. message: 'Hello Vue.js!'
  5. }
  6. },
  7. methods: {
  8. reverseMessage() {
  9. this.message = this.message
  10. .split('')
  11. .reverse()
  12. .join('')
  13. }
  14. }
  15. }
  16. Vue.createApp(EventHandling).mount('#event-handling')

點擊此處實現(xiàn)

注意在這個方法中,我們更新了應用的狀態(tài),但沒有觸碰 DOM——所有的 DOM 操作都由 Vue 來處理,你編寫的代碼只需要關注邏輯層面即可。

Vue 還提供了 v-model 指令,它能輕松實現(xiàn)表單輸入和應用狀態(tài)之間的雙向綁定。

  1. <div id="two-way-binding">
  2. <p>{{ message }}</p>
  3. <input v-model="message" />
  4. </div>

  1. const TwoWayBinding = {
  2. data() {
  3. return {
  4. message: 'Hello Vue!'
  5. }
  6. }
  7. }
  8. Vue.createApp(TwoWayBinding).mount('#two-way-binding')

點擊此處實現(xiàn)

#條件與循環(huán)

控制切換一個元素是否顯示也相當簡單:

  1. <div id="conditional-rendering">
  2. <span v-if="seen">現(xiàn)在你看到我了</span>
  3. </div>

  1. const ConditionalRendering = {
  2. data() {
  3. return {
  4. seen: true
  5. }
  6. }
  7. }
  8. Vue.createApp(ConditionalRendering).mount('#conditional-rendering')

這個例子演示了我們不僅可以把數(shù)據(jù)綁定到 DOM 文本或 attribute,還可以綁定到 DOM 的結構。此外,Vue 也提供一個強大的過渡效果系統(tǒng),可以在 Vue 插入/更新/移除元素時自動應用過渡效果

你可以在下面的沙盒中將 seentrue 更改為 false,以檢查效果: 點擊此處實現(xiàn)

還有其它很多指令,每個都有特殊的功能。例如,v-for 指令可以綁定數(shù)組的數(shù)據(jù)來渲染一個項目列表:

  1. <div id="list-rendering">
  2. <ol>
  3. <li v-for="todo in todos">
  4. {{ todo.text }}
  5. </li>
  6. </ol>
  7. </div>

  1. const ListRendering = {
  2. data() {
  3. return {
  4. todos: [
  5. { text: 'Learn JavaScript' },
  6. { text: 'Learn Vue' },
  7. { text: 'Build something awesome' }
  8. ]
  9. }
  10. }
  11. }
  12. Vue.createApp(ListRendering).mount('#list-rendering')

點擊此處實現(xiàn)

#組件化應用構建

組件系統(tǒng)是 Vue 的另一個重要概念,因為它是一種抽象,允許我們使用小型、獨立和通??蓮陀玫慕M件構建大型應用。

在 Vue 中,組件本質上是一個具有預定義選項的實例。在 Vue 中注冊組件很簡單:如對 App 對象所做的那樣創(chuàng)建一個組件對象,并將其定義在父級組件的 components 選項中:

  1. // 創(chuàng)建 Vue 應用
  2. const app = Vue.createApp(...)
  3. // 定義名為 todo-item 的新組件
  4. app.component('todo-item', {
  5. template: `<li>This is a todo</li>`
  6. })
  7. // 掛載 Vue 應用
  8. app.mount(...)

現(xiàn)在,你可以將其放到到另一個組件的模板中:

  1. <ol>
  2. <!-- 創(chuàng)建一個 todo-item 組件實例 -->
  3. <todo-item></todo-item>
  4. </ol>

  • [ ] 但是這樣會為每個待辦項渲染同樣的文本,這看起來并不炫酷。我們應該能將數(shù)據(jù)從父組件傳入子組件才對。讓我們來修改一下組件的定義,使之能夠接受一個 prop:

  1. app.component('todo-item', {
  2. props: ['todo'],
  3. template: `<li>{{ todo.text }}</li>`
  4. })

現(xiàn)在,我們可以使用 v-bind 指令將待辦項傳到循環(huán)輸出的每個組件中:

  1. <div id="todo-list-app">
  2. <ol>
  3. <!--
  4. 現(xiàn)在我們?yōu)槊總€ todo-item 提供 todo 對象
  5. todo 對象是變量,即其內容可以是動態(tài)的。
  6. 我們也需要為每個組件提供一個“key”,稍后再
  7. 作詳細解釋。
  8. -->
  9. <todo-item
  10. v-for="item in groceryList"
  11. v-bind:todo="item"
  12. v-bind:key="item.id"
  13. ></todo-item>
  14. </ol>
  15. </div>

  1. const TodoList = {
  2. data() {
  3. return {
  4. groceryList: [
  5. { id: 0, text: 'Vegetables' },
  6. { id: 1, text: 'Cheese' },
  7. { id: 2, text: 'Whatever else humans are supposed to eat' }
  8. ]
  9. }
  10. }
  11. }
  12. const app = Vue.createApp(TodoList)
  13. app.component('todo-item', {
  14. props: ['todo'],
  15. template: `<li>{{ todo.text }}</li>`
  16. })
  17. app.mount('#todo-list-app')

點擊此處實現(xiàn)

盡管這只是一個刻意設計的例子,但是我們已經設法將應用分割成了兩個更小的單元。子單元通過 prop 接口與父單元進行了良好的解耦。我們現(xiàn)在可以進一步改進 <todo-item> 組件,提供更為復雜的模板和邏輯,而不會影響到父應用。

在一個大型應用中,有必要將整個應用程序劃分為多個組件,以使開發(fā)更易管理。在后續(xù)教程中我們將詳述組件,不過這里有一個 (假想的) 例子,以展示使用了組件的應用模板是什么樣的:

  1. <div id="app">
  2. <app-nav></app-nav>
  3. <app-view>
  4. <app-sidebar></app-sidebar>
  5. <app-content></app-content>
  6. </app-view>
  7. </div>

#與自定義元素的關系

你可能已經注意到 Vue 組件非常類似于自定義元素——它是 Web 組件規(guī)范的一部分,這是因為 Vue 的組件語法部分參考了該規(guī)范。例如 Vue 組件實現(xiàn)了 Slot API 與 is attribute。但是,還是有幾個關鍵差別:

  1. Web Components 規(guī)范已經完成并通過,但未被所有瀏覽器原生實現(xiàn)。目前 Safari 10.1+、Chrome 54+ 和 Firefox 63+ 原生支持 Web Components。相比之下,Vue 組件不需要任何 polyfill,并且在所有支持的瀏覽器 (IE11 及更高版本) 之下表現(xiàn)一致。必要時,Vue 組件也可以包裝于原生自定義元素之內。

  1. Vue 組件提供了純自定義元素所不具備的一些重要功能,最突出的是跨組件數(shù)據(jù)流、自定義事件通信以及構建工具集成。

雖然 Vue 內部沒有使用自定義元素,不過在應用使用自定義元素、或以自定義元素形式發(fā)布時,依然有很好的互操作性。Vue CLI 也支持將 Vue 組件構建成為原生的自定義元素。

#準備好了嗎?

我們剛才簡單介紹了 Vue 核心最基本的功能——本教程的其余部分將更加詳細地涵蓋這些功能以及其它高階功能,所以請務必讀完整個教程!Vue (讀音 /vju?/,類似于?view) 是一套用于構建用戶界面的漸進式框架。與其它大型框架不同的是,Vue 被設計為可以自底向上逐層應用。Vue 的核心庫只關注視圖層,不僅易于上手,還便于與第三方庫或既有項目整合。另一方面,當與現(xiàn)代化的工具鏈以及各種支持類庫結合使用時,Vue 也完全能夠為復雜的單頁應用提供驅動。 如果你想在深入學習 Vue 之前對它有更多了解,我們制作了一個視頻,帶你了解其核心概念和一個示例工程。 如果你已經是有經驗的前端開發(fā)者,想知道 Vue 與其它庫/框架有哪些區(qū)別,請查看對比其它框架。Vue (讀音 /vju?/,類似于?view) 是一套用于構建用戶界面的漸進式框架。與其它大型框架不同的是,Vue 被設計為可以自底向上逐層應用。Vue 的核心庫只關注視圖層,不僅易于上手,還便于與第三方庫或既有項目整合。另一方面,當與現(xiàn)代化的工具鏈以及各種支持類庫結合使用時,Vue 也完全能夠為復雜的單頁應用提供驅動。 如果你想在深入學習 Vue 之前對它有更多了解,我們制作了一個視頻,帶你了解其核心概念和一個示例工程。 如果你已經是有經驗的前端開發(fā)者,想知道 Vue 與其它庫/框架有哪些區(qū)別,請查看對比其它框架。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號