Vue.js 教程:構建一個特斯拉汽車餘電計算器

2020-12-05 InfoQ技術實驗室

本文最初發布於 DEV 網站,經原作者授權由 InfoQ 中文站翻譯並分享。

這篇教程關注的是全新的汽車駕駛體驗。電動汽車已經是公認的未來趨勢。但很多人都關心的一個問題是,電車充滿電後究竟可以跑多遠?行駛速度、氣溫和輪轂尺寸會對續航裡程有什麼影響?在本教程中,我們會使用 Vue.js 這個容易理解的 JavaScript 框架製作一個儀錶盤,通過它可以計算特斯拉電動汽車在不同情況下的行駛距離。

作為本教程的起點,請克隆這個 Github 存儲庫:

https://github.com/petereijgermans11/workshop-reactjs-vuejs

然後轉至 vuejs-app 目錄。

cdworkshop-reactjs-vuejs/vuejs-app閱讀 README.md,了解我們要執行的任務。上圖是我們將要構建的應用程式的示例。我們先從一個有問題的應用程式開始入手,需要修復它的問題並做進一步的開發。在開始之前,首先解釋一下這個應用程式的結構。

要求

要開始學習本教程,你需要安裝以下內容:

Node 8.9 穩定版或更高版本:https://nodejs.org/en/download/Yarn:https://yarnpkg.com項目結構

這個項目的結構如下圖所示,圖上還展示了構成應用程式的各個組件。main.js 是應用程式的入口點。App.vue 是應用程式的入口組件。圖下方是 App.vue 組件。

列表 1

項目入口點

Vue 應用程式在 main.js 中啟動。在 main.js 中,你首先需要創建一個新的「root Vue 實例」。如下所示:

1. 導入 Vue:從「vue」導入 Vue。從 Vue 模塊導入 vue。

2. 導入條目組件 App.vue:

import App from "./App. vue "3. 創建一個「根 Vue 實例」:

new Vue ({....})4. 從這個「根 Vue 實例」,渲染導入的 App.vue 組件(入口組件):

render: h => h (App)5. 這個根 Vue 實例已掛載完畢,應用程式就在這裡啟動。它會指向帶有標識#app的 HTML 元素,該元素在 App.vue 組件的 template 中定義。(參閱以下代碼段。)

列表 2

App.vue 組件

列表 3

這個 App.vue 是應用程式的入口組件,由以下部分組成。

腳本(script):這是這個組件的 JavaScript 部分。在此示例中,name property 指示組件的名稱(名稱為「app」)。該組件使用的子組件在 components-property 中定義。在本例中,TeslaBattery 是 App.vue 組件的子組件。要使用 TeslaBattery 組件,必須首先導入它(import Tesla-Battery from 「…」)。

在 data()-function 中,你可以定義和初始化狀態變量,例如導入的 logo 和 greeting 屬性。要渲染徽標和問候語,必須在模板中定義它們。最後你得導出整個組件(export default{ }),以便將其再次導入其他組件和 main.js。

模板(template):負責定義組件生成的輸出。Vue.js 使用基於 HTML 的模板語法。來自 data()-function 的數據可以通過數據綁定輕鬆渲染。數據綁定的最簡單形式是使用 Mustache 語法(雙括號)的文本插值:{{greeting}}

在上面的示例中,{{greeting}}替換為來自 data()-function 的值 Hello Tesla !!!。在這條問候語上方,還通過 img-tag 來渲染徽標。要將徽標分配給 img src-attribute,請使用屬性綁定。為此,可以使用v-bind、<img :src="logo">或<img v-bind:src="logo">。這個應用程式中會經常使用屬性綁定。

最後,使用<teslabattery>-tag實例化並渲染 TeslaBattery 組件。對於此標誌(也稱為「自定義元素」),必須使用 Kebab case。稍後將討論此組件的運行機制。

樣式(style):在 Vue 中,我們使用一個 SCSS 文件對整個應用程式進行樣式設置。

分解 UI

幾乎所有 Vue 應用程式都由一系列組件組成。這個應用程式由一個條目應用組件組成,下面還有 TeslaBattery 這個子組件。TeslaBattery 組件包含以下子組件:

TeslaCar:使用車輪動畫渲染 TeslaCar 圖像。TeslaStats:用於渲染 各個 Tesla 模型的最大電池續航裡程。它包含以下型號:60、60D、75、75D、90D 和 P100D。TeslaCounter:用於手動控制速度和外部溫度。TeslaClimate:當外部溫度超過 20 度時,它會將供暖加熱改為空調製冷。TeslaWheels:用於手動將車輪尺寸從 19 英寸調整為 20 英寸,反之亦然。

用戶界面由組件樹表示,如下所示。

以下代碼塊顯示「Tesla Battery 組件」是一個容器組件。其基礎子組件是 Presentation 組件。在開發 Vue 應用程式時這個模式很好用。將組件分為兩類可以讓它們更容易重用。

列表 4

容器組件具有以下特徵:

它們可以同時包含表示和容器組件。它們負責通過「props」創建數據並將數據傳輸到子組件。它們根據傳入事件執行邏輯。它們負責管理狀態,並知道何時需要再次渲染組件。它們通常是有狀態的,因為它們傾向於充當數據源。表示組件(presentation component)的特徵如下:

它們也稱為「啞組件」(dumb component)。其重點是用戶界面。幾乎所有基本的 UI 組件都必須視為啞組件,例如按鈕、輸入、模態等。TeslaCar 也是一個啞組件,可確保渲染 TeslaCar 圖像。它們通過「props」接收數據,並通過事件將數據返回給父組件。它們通常是無狀態的,並且不依賴應用程式的其他部分。

這個方法有以下優點:

可重用性。啞組件更易測試,因為它們僅接收「props」,發出事件並返回一部分 UI。可讀性更好:你擁有的代碼越少且組織得越好,就越容易理解和調整。它提供一致性並防止代碼重複。TeslaBattery 服務

我們使用的數據是硬編碼的,存儲在 tesla-battery.service.js 中。這個服務具有用於檢索模型數據的 getModel-Data() 方法。在下面的代碼塊中查看這個模型的數據結構。

列表 5

各個 Tesla 模型的最大電池續航裡程是根據以下參數確定的:

特斯拉模型(60、60D……)車輪尺寸(19/20 英寸)氣候(開 / 關)速度溫度(-10.0……)。TeslaBattery 組件該組件負責定義、創建數據並通過「props」將數據傳遞給子組件。它還負責管理應用程式的狀態。

完全摺疊時,我們可以看到這個組件由以下屬性組成。

列表 6

components 屬性包含此組件使用的所有子組件。

computed 屬性包含已緩存的函數。也就是說,僅當一個函數依賴於特定的數據屬性,並且此屬性的狀態改變時,才執行該函數。在下面的 TeslaBattery 組件的完整版本中,stats()-function 是一個 computed 函數的示例。

此函數從模型數據中過濾每個特斯拉模型的最大電池續航裡程。下面的代碼塊是 stats()-function 的輸出示例。最大電池續航裡程基於用戶輸入,例如選定的車輪尺寸、氣候、速度和溫度。並且僅在用戶輸入更改時才執行 stats()-function。用戶輸入記錄在 tesla 對象(狀態對象)中,該對象在 data()-function 中定義。

每個型號的最大電池續航裡程:

[ {"model":"60","miles":267}, {"model":"60D","miles":271}, {"model":"75","miles":323}, {"model":"75D","miles":332}, {"model":"90D","miles":365}, {"model":"P100D","miles":409}]methods 屬性 包含所有未緩存的函數。在這裡定義 changeClimate() 函數是因為此函數由 onClick-event 觸發(並且不基於 data/state 屬性)。

列表 7

這個 TeslaBattery 組件的模板具有與列表 4 相同的結構:

列表 8

通過 props 將數據傳遞給子組件

在下圖中,stats-data(源自 stats()-function)從 TeslaBattery 組件傳遞到 TeslaStats 組件。

要將數據傳遞給子組件,必須在 TeslaBattery 組件模板中使用v-bind或:

列表 9

<template> <form> ... <tesla-stats :stats="stats" /> ... </form> </template>在 TeslaStats 組件中接收數據

該組件在腳本部分包含一個 props-property,用於接收 stats-data。這些統計信息的類型為 Array。在模板中,我們使用 Vue.js 中的 v-for 指令來遍歷統計信息。:key(在 v-for 指令中)指示此列表必須以特定順序渲染。

你可以在 filters-property 中定義自定義過濾器。例如,過濾器「lowercase」,有一個以小寫形式渲染模型名稱的管道。這裡還定義了一個自定義過濾器,用於將英裡轉換為公裡。

列表 10

小結

看過這篇文章後,你就可以開始解決項目的錯誤並執行 README.md 中描述的任務。在這個 Github 項目中還添加了一個 ppt,詳細說明了通過 v-model 指令進行雙向數據綁定、使用 @click 將 onClick 事件分配給按鈕以及創建其他組件之類的問題。

英文原文

Build a Tesla battery range calculator yourself

關注我並轉發此篇文章,私信我「領取資料」,即可免費獲得InfoQ價值4999元迷你書!

相關焦點

  • 什麼是VUE?VUE與JS的對比
    1.1. vue的引入先看下面這樣一個簡單的例子,實現了這樣一個功能數據的雙向綁定:也就是數據的同步修改我們需要讓所有綁定的對象和元素都能感知到變化1.1.1. vue與js的對比1.1.1.1. js的實現(了解)<!
  • 如何寫一個vue組件專題及常見問題 - CSDN
    如何使用vue寫一個組件庫新建vue項目使用vue-cli初始化一個項目:vue init webpack VueComponentcd VueComponentnpm installnpm run dev以上就新建好了一個vue項目項目目錄首先,定義好目錄,經過觀察大多數的組件庫,基本是這樣的目錄
  • Angular、React 當前,Vue.js 優劣幾何?
    2019 更是熱度不減,而作為近年來尤為熱門的前端框架,Vue.js 自是積累了大量關注。那麼,Vue.js 是適合你的框架嗎?作者 |Tim Han譯者 | 蘇本如責編 | 仲培藝以下為譯文:對於大多數人來說,現在要構建一個新的前端應用,對框架/庫的選擇在很大程度上都是在 Angular 和 React 中二選一。
  • 4種可用於組織大型Vue.js項目的最佳實踐
    2.建立並共享獨立的組件AddyOsmani:「有效構建『大型'事物的秘訣通常是避免從一開始就抱著直接構建大型事物的想法。相反,可以用更小、更集中的作品來構成大型事物。這樣一來,就更容易看到小的事物是如何組成大的事物的了。」你可以遵循F.I.R.S.T原則,將自己的組件構建為:專注的、獨立的、可重複使用的以及小型且可測試的。
  • vue高級進階系列——用typescript玩轉vue和vuex
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫用過vue的朋友大概對vuex也不陌生,vuex的官方解釋是專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。
  • a標籤 href vue專題及常見問題 - CSDN
    vue.js 實現a標籤href裡添加參數原始碼列表可以正常顯示,但是連接沒有實現對items.orderNo的值轉化,最中解決方法
  • vue3.0手機聊天室|Vue3+Vant3仿微信界面
    項目簡介Vue3Chat是基於vue3.x+vuex4+vue-router4全家桶技術和vant3.x構建開發的一款mobile仿微信界面聊天實例。實現了發送圖文消息、圖片|視頻預覽、位置查看、紅包|朋友圈等功能。
  • Vue.js深入學習
    vue.jsv-cloak:解決網速慢閃爍問題 ,不會替換掉標籤裡面的內容v-text:會替換掉標籤裡面的內容:原樣輸出v-html:會解析標籤v-bind:綁定屬性的指令,縮寫);鍵盤修飾符:@keyup.enter="add"@keyup.113="add"自定義鍵盤碼: Vue.config.keyCodes.f2=113;全局指令:1.Vue中所有的指令都以v-開頭2.參數1,指令的名稱,定義的時候,指令的前面不需要加V-前綴,用的時候才加3.參數2,是一個對象
  • Vue全家桶之什麼是Vuex
    Vuex 是一個專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。Vuex 是幹什麼的?試想一下,如果在一個項目開發中頻繁的使用組件傳參的方式來同步data中的值,一旦項目變得很龐大,管理和維護這些值將是相當棘手的工作。
  • Vue 3 的最新進展
    Vue.js 作者尤雨溪近日介紹了 Vue 3 的最新進展。尤雨溪表示,由於在 Vue 3 上花費的大部分時間都投入到了設計和構建穩定的內核上,不過要讓整個框架處於"ready"狀態,不僅僅是內核的問題,還需要有兼容版本的支持庫 (Vue Router, Vuex, test utils)、工具(CLI、eslint 插件、瀏覽器開發工具擴展、IDE 擴展)和文檔(包括針對新用戶和用於遷移的文檔)。
  • 5分鐘帶你入門vuex(vue狀態管理)
    如果你之前使用過vue.js,你一定知道在vue中各個組件之間傳值的痛苦,在vue中我們可以使用vuex來保存我們需要管理的狀態值,值一旦被修改,所有引用該值的地方就會自動更新,那麼接下來我們就來學習一下vuex是如何修改狀態值的:我們新建一個vue項目(這裡由於我們是講解vuex,所以對於vue項目的創建我們不會講解太詳細);在命令行輸入 vue init
  • vue-element-admin 4.0.0 正式版發布
    重大改變 基於 vue-cli@3進行構建 調整了項目的目錄結構 mock 文件移至根目錄下 layout 從 views 文件夾下移至 src 下 使用了最新的 eslint-plugin-vue
  • ref vue 獲取文本專題及常見問題 - CSDN
    ref的官網介紹https://cn.vuejs.org/v2/api/#ref需求在普通的js操作中,一般都是直接操作dom元素,但是對於Vue.js框架來說,一般是不允許直接操作dom元素的。那麼其實Vue.js框架提供了ref獲取dom元素,以及組件引用。
  • slot vue 具名專題及常見問題 - CSDN
    vue的slot1、什麼是slotslot是插槽,插即是可以插入,槽就是坑,即是可以再代碼中插入如果子組件模板中不包含插口,那麼父組件的內容將會被丟棄。當子組件模板中有一個麼有屬性的插槽時,父組件傳入的整個內容片段,將插入到插槽所在的dom的位置,並替換掉插槽標籤本身。
  • Vue+Axios+Vuex+Vux+Vue-Router全家桶搭建前端框架
    等等,太多了,那我們如何在這繁雜的框架中選擇一個合適的呢?其實也不難,秉承效率第一的原則,首先我們必須選擇一個能提高我們工作效率的,所以此時就要對他們有一個簡單的了解,簡單說一下:一、Angular依託於老大哥Google,應用很廣泛,而且相對來說比較成熟穩定一些,然而他有一些比較晦澀難懂的語法,雙向綁定不是容易理解;而且學習成本相對來說比較大,入手不容易,況且很難與現有項目無縫融合,開發成本也就高了;二、再來看看React,出身名門
  • template標籤 vue 作用專題及常見問題 - CSDN
    template slot="footer"> <p>底部信息信息1</p> <p>底部信息信息2</p> </template> </base-layout> </div> <script type="text/javascript" src="js
  • 在vue項目中使用vuex實現狀態管理的案例
    並不需要使用vuex。vuex的使用與否在實際開發中應該視項目情況而定。準備工作:a.在vue項目中安裝vuex: npm install vuex -S。b.了解下vuex的五個屬性。vuex個屬性五個屬性的作用:state:用來存儲vuex的基本數據。
  • vue 具名插槽詳解專題及常見問題 - CSDN
    插槽含義:就是引入子組件後,在插入子組件元素中添加信息或者標籤,使得子組件的指定位置插入信息或者標籤插槽有三種:默認插槽、具名插槽、作用域插槽,由於vue2.6.0後對插槽進行修改,但是兼容2.6.0前的版本,博文中只說明2.6.0後的插槽,vue3.0後面會去除2.60前的版本兼容  一、默認插槽<
  • 如何創建vue項目並使用element框架中的el-select
    1、在電腦硬碟上,找到一個位置,新建一個文件夾wmn;滑鼠右鍵選擇Git Bash Here,並在Git窗口輸入cnpm install --global vue-cli命令:cnpm install --global vue-cli
  • 什麼是MVVM,MVC和MVVM的區別,MVVM框架VUE實現原理
    比如vue,通過數據的雙向綁定,極大了提高了開發效率。3. MVVM框架:VUE的介紹Vue就是基於MVVM模式實現的一套框架,在vue中:Model:指的是js中的數據,如對象,數組等等。1.如果你已經有一個現成的服務端應用,你可以將vue 作為該應用的一部分嵌入其中,帶來更加豐富的交互體驗;2.如果你希望將更多業務邏輯放到前端來實現,那麼VUE的核心庫及其生態系統也可以滿足你的各式需求(core+vuex+vue-route)。