国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
關(guān)鍵要點(diǎn)
其他庫的靈感
組件,組件,組件
設(shè)置項(xiàng)目
編寫我們的第一個(gè) Vue.js 應(yīng)用程序
Vue Devtools
構(gòu)建應(yīng)用程序
初始設(shè)置
Vue.js 中的表單
跟蹤表單輸入
顯示來自 GitHub 的結(jié)果
條件渲染
從 GitHub 獲取數(shù)據(jù)
在視圖中顯示一些統(tǒng)計(jì)信息
重構(gòu)
結(jié)論
關(guān)於 Vue.js 2.0 的常見問題
Vue.js 1.0 和 Vue.js 2.0 的主要區(qū)別是什麼?
如何在 Vue.js 2.0 中使用觀察者?
Vue.js 中的急切加載是什麼,我該如何使用它?
如何在 Vue.js 2.0 中使用計(jì)算屬性?
如何在 Vue.js 2.0 中處理事件?
如何將 Vue.js 2.0 與 Laravel 一起使用?
如何將 Vue.js 2.0 與 Webpack 一起使用?
如何將 Vue.js 2.0 與 TypeScript 一起使用?
如何將 Vue.js 2.0 與 Vuex 一起使用?
如何將 Vue.js 2.0 與 Vue Router 一起使用?
首頁 web前端 js教程 使用vue.js 2.0框架啟動(dòng)並運(yùn)行

使用vue.js 2.0框架啟動(dòng)並運(yùn)行

Feb 14, 2025 am 10:16 AM

Getting up and Running with the Vue.js 2.0 Framework

想從零開始學(xué)習(xí) Vue.js? SitePoint Premium 提供涵蓋基礎(chǔ)知識(shí)、項(xiàng)目、技巧和工具以及更多內(nèi)容的完整 Vue 書籍合集。立即加入,每月只需 14.99 美元。

本文已更新,主要更新了工具部分。

自從流行的 JavaScript 框架 Vue.js 發(fā)布 v2 版本後,我就迫不及待地想嘗試一下,看看它用起來是什麼感覺。作為對 Angular 和 React 非常熟悉的人,我期待著看看它們之間以及 Vue 之間的異同。

Vue 2 擁有出色的性能指標(biāo),相對較小的負(fù)載(捆綁的Vue 運(yùn)行時(shí)版本在縮小和gzip 壓縮後重約30KB),以及對配套庫(如vue-router 和Vuex,Vue 的狀態(tài)管理庫)的更新。僅在一篇文章中涵蓋所有內(nèi)容實(shí)在太多了,但請關(guān)注後續(xù)文章,我們將更仔細(xì)地研究與核心框架完美結(jié)合的各種庫。

關(guān)鍵要點(diǎn)

  • Vue.js 2.0 引入了受 React 啟發(fā)的虛擬 DOM,用於高效渲染,並集成了改進(jìn)的庫,如 vue-router 和 Vuex,用於狀態(tài)管理。
  • 組件是 Vue.js 2.0 的基礎(chǔ),其中應(yīng)用程序被構(gòu)建為一系列嵌套組件,並推薦使用單文件組件(.vue)以更好地組織代碼。
  • 從頭開始設(shè)置 Vue 項(xiàng)目需要使用 webpack 和 vue-loader 來處理 .vue 文件,以及 Babel 來使用現(xiàn)代 JavaScript 功能,從而增強(qiáng)開發(fā)工作流程。
  • Vue Devtools 對於調(diào)試至關(guān)重要,它可以深入了解應(yīng)用程序的狀態(tài)以及數(shù)據(jù)在組件中的流動(dòng)。
  • Vue.js 2.0 通過利用 v-model 進(jìn)行雙向數(shù)據(jù)綁定以及使用 v-on 進(jìn)行自定義事件處理來促進(jìn)交互式表單的構(gòu)建,從而使組件之間的狀態(tài)管理無縫銜接。
  • 本文演示了構(gòu)建一個(gè) GitHub 用戶統(tǒng)計(jì)數(shù)據(jù)獲取應(yīng)用程序,它使用 Vue 的反應(yīng)式系統(tǒng)和生命週期鉤子來有效地管理和顯示數(shù)據(jù),說明了 Vue.js 在實(shí)際場景中的實(shí)際用法。

其他庫的靈感

在學(xué)習(xí)本教程的過程中,您會(huì)看到 Vue 擁有許多明顯受到其他框架啟發(fā)的功能。這是一件好事;看到新的框架借鑒其他庫的一些想法並改進(jìn)它們,真是太好了。特別是,您會(huì)看到 Vue 的模板非常接近 Angular 的模板,但其組件和組件生命週期方法更接近 React 的(以及 Angular 的)。

一個(gè)這樣的例子是,與 React 和當(dāng)今 JavaScript 領(lǐng)域幾乎所有框架一樣,Vue 使用虛擬 DOM 的概念來保持渲染效率。 Vue 使用 snabbdom 的一個(gè)分支,這是更流行的虛擬 DOM 庫之一。 Vue 網(wǎng)站包含關(guān)於其虛擬DOM 渲染的文檔,但作為用戶,您只需要知道Vue 非常擅長保持渲染速度(實(shí)際上,在許多情況下,它的性能優(yōu)於React),這意味著您可以放心,您正在構(gòu)建一個(gè)可靠的平臺(tái)。

組件,組件,組件

與當(dāng)今的其他框架一樣,Vue 的核心構(gòu)建塊是組件。您的應(yīng)用程序應(yīng)該是一系列組件,這些組件相互構(gòu)建以生成最終的應(yīng)用程序。 Vue.js 更進(jìn)一步,建議(儘管沒有強(qiáng)制)您在一個(gè) .vue 文件中定義組件,然後構(gòu)建工具(我們很快就會(huì)介紹)可以解析這些文件。鑑於本文的目的是全面探索 Vue 及其使用感受,我將為此應(yīng)用程序使用此約定。

Vue 文件如下所示:

<template>
  <p>This is my HTML for my component</p>
</template>

<??>

<style scoped>
  /* CSS here
   * by including `scoped`, we ensure that all CSS
   * is scoped to this component!
   */
</style>

或者,如果您不喜歡將組件的所有部分都放在一個(gè)文件中,您可以為每個(gè)元素提供一個(gè) src 屬性,並分別指向單獨(dú)的 HTML、JS 或 CSS 文件。

設(shè)置項(xiàng)目

雖然優(yōu)秀的 Vue CLI 可以輕鬆設(shè)置完整的項(xiàng)目,但在開始使用新庫時(shí),我喜歡從頭開始,以便更多地了解這些工具。

如今,webpack 是我首選的構(gòu)建工具,我們可以將其與 vue-loader 插件結(jié)合使用,以支持我之前提到的 Vue.js 組件格式。我們還需要 Babel 和 env 預(yù)設(shè),以便我們可以使用現(xiàn)代 JavaScript 語法編寫所有代碼,以及 webpack-dev-server,它會(huì)在檢測到文件更改時(shí)更新瀏覽器。

讓我們初始化一個(gè)項(xiàng)目並安裝依賴項(xiàng):

mkdir vue2-demo-project
cd vue2-demo-project
npm init -y
npm i vue
npm i webpack webpack-cli @babel/core @babel/preset-env babel-loader vue-loader vue-template-compiler webpack-dev-server html-webpack-plugin --save-dev

然後創(chuàng)建初始文件夾和文件:

mkdir src
touch webpack.config.js src/index.html src/index.js

項(xiàng)目結(jié)構(gòu)應(yīng)如下所示:

<code>.
├── package.json
├── package-lock.json
├── src
│   ├── index.html
│   └── index.js
└── webpack.config.js</code>

現(xiàn)在讓我們設(shè)置 webpack 配置。這歸結(jié)為以下幾點(diǎn):

  • 告訴 webpack 對任何 .vue 文件使用 vue-loader
  • 告訴 webpack 對任何 .js 文件使用 Babel 和 env 預(yù)設(shè)
  • 告訴 webpack 使用 src/index.html 作為模板生成一個(gè) HTML 文件供 dev-server 提供服務(wù):
//webpack.config.js
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const HtmlWebPackPlugin = require("html-webpack-plugin")

module.exports = {
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader',
      },
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env']
          }
        }
      }
    ]
  },
  plugins: [
    new VueLoaderPlugin(),
    new HtmlWebPackPlugin({
      template: "./src/index.html"
    })
  ]
}

最後,我們將向 HTML 文件添加一些內(nèi)容,然後我們就可以開始了!

<!DOCTYPE html>
<html>
  <head>
    <title>My Vue App</title>
  </head>
  <body>
    <div id="app"></div>
  </body>
</html>

我們創(chuàng)建了一個(gè) ID 為 app 的空 div,因?yàn)檫@是我們將放置 Vue 應(yīng)用程序的元素。我總是更喜歡使用 div,而不是 body 元素,因?yàn)檫@讓我可以控制頁面的其餘部分。

編寫我們的第一個(gè) Vue.js 應(yīng)用程序

我們將忠於以往的每個(gè)編程教程,編寫一個(gè) Vue 應(yīng)用程序,在深入研究更複雜的內(nèi)容之前,先將“Hello, World!”放到屏幕上。

每個(gè) Vue 應(yīng)用程序都是通過導(dǎo)入庫然後實(shí)例化一個(gè)新的 Vue 實(shí)例來創(chuàng)建的:

<template>
  <p>This is my HTML for my component</p>
</template>

<??>

<style scoped>
  /* CSS here
   * by including `scoped`, we ensure that all CSS
   * is scoped to this component!
   */
</style>

我們?yōu)?Vue 提供一個(gè)要渲染到頁面上的元素,這樣我們就創(chuàng)建了一個(gè) Vue 應(yīng)用程序!我們傳遞一個(gè)選擇器,用於選擇我們希望 Vue 用我們的應(yīng)用程序替換的元素。這意味著當(dāng) Vue 運(yùn)行時(shí),它將獲取我們創(chuàng)建的 div#app 並將其替換為我們的應(yīng)用程序。

我們使用變量名 vm 的原因是因?yàn)樗怼耙晥D模型”。雖然與“模型視圖視圖模型”(MVVM)模式?jīng)]有嚴(yán)格關(guān)聯(lián),但 Vue 部分受到它的啟發(fā),並且使用變量名 vm 來表示 Vue 應(yīng)用程序的約定一直沿用至今。當(dāng)然,您可以隨意命名變量!

到目前為止,我們的應(yīng)用程序什麼也沒做,所以讓我們創(chuàng)建我們的第一個(gè)組件 App.vue,它實(shí)際上會(huì)將某些內(nèi)容渲染到頁面上。

Vue 沒有規(guī)定應(yīng)用程序的結(jié)構(gòu),所以這取決於您。我最終為每個(gè)組件創(chuàng)建了一個(gè)文件夾,在本例中為 App(我喜歡大寫字母,表示一個(gè)組件),其中包含三個(gè)文件:

  • index.vue
  • script.js
  • style.css
mkdir vue2-demo-project
cd vue2-demo-project
npm init -y
npm i vue
npm i webpack webpack-cli @babel/core @babel/preset-env babel-loader vue-loader vue-template-compiler webpack-dev-server html-webpack-plugin --save-dev

文件結(jié)構(gòu)現(xiàn)在應(yīng)該如下所示:

mkdir src
touch webpack.config.js src/index.html src/index.js

App/index.vue 定義了模板,然後導(dǎo)入其他文件。這符合 Vue 文檔中“關(guān)於關(guān)注點(diǎn)分離”部分中推薦的結(jié)構(gòu)。

<code>.
├── package.json
├── package-lock.json
├── src
│   ├── index.html
│   └── index.js
└── webpack.config.js</code>

我喜歡將其命名為 index.vue,但您可能也希望將其命名為 app.vue,以便更容易搜索。我更喜歡在我的代碼中導(dǎo)入 App/index.vue 而不是 App/app.vue,但同樣,您可能不同意,因此請隨意選擇您和您的團(tuán)隊(duì)最喜歡的任何名稱。

目前,我們的模板只是

Hello, World!

,我將 CSS 文件留空。主要工作是在 script.js 中進(jìn)行,它如下所示:

//webpack.config.js
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const HtmlWebPackPlugin = require("html-webpack-plugin")

module.exports = {
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader',
      },
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env']
          }
        }
      }
    ]
  },
  plugins: [
    new VueLoaderPlugin(),
    new HtmlWebPackPlugin({
      template: "./src/index.html"
    })
  ]
}

這樣做會(huì)創(chuàng)建一個(gè)組件,我們將為其命名為 App,主要用於調(diào)試目的,我稍後會(huì)介紹,然後定義該組件擁有並負(fù)責(zé)的數(shù)據(jù)。目前,我們沒有任何數(shù)據(jù),因此我們可以通過返回一個(gè)空對象來告訴 Vue 這點(diǎn)。稍後,我們將看到一個(gè)使用數(shù)據(jù)的組件示例。

現(xiàn)在我們可以回到 src/index.js 並告訴 Vue 實(shí)例渲染我們的 App 組件:

<!DOCTYPE html>
<html>
  <head>
    <title>My Vue App</title>
  </head>
  <body>
    <div id="app"></div>
  </body>
</html>

首先,我們導(dǎo)入組件,相信 webpack 和 vue-loader 會(huì)負(fù)責(zé)解析它。然後我們聲明組件。這是一個(gè)重要的步驟:默認(rèn)情況下,Vue 組件不是全局可用的。每個(gè)組件都必須有一個(gè)它們將要使用的所有組件的列表,以及它將被映射到的標(biāo)籤。在本例中,因?yàn)槲覀兿襁@樣註冊我們的組件:

import Vue from 'vue'

const vm = new Vue({
  el: '#app',
})

這意味著在我們的模板中,我們將能夠使用 app 元素來引用我們的組件。

最後,我們定義 render 函數(shù)。此函數(shù)使用一個(gè)助手(通常稱為 h)調(diào)用,該助手能夠創(chuàng)建元素。它與 React 使用的 React.createElement 函數(shù)不太相似。在本例中,我們?yōu)槠涮峁┳址?'app',因?yàn)槲覀円秩镜慕M件註冊為具有標(biāo)籤 app。

大多數(shù)情況下(以及在本教程的其餘部分),我們不會(huì)在其他組件上使用 render 函數(shù),因?yàn)槲覀儗⒍x HTML 模板。但是,如果您想了解更多信息,則值得閱讀 Vue.js 關(guān)於 render 函數(shù)的指南。

完成之後,最後一步是在 package.json 中創(chuàng)建一個(gè) npm 腳本:

<template>
  <p>This is my HTML for my component</p>
</template>

<??>

<style scoped>
  /* CSS here
   * by including `scoped`, we ensure that all CSS
   * is scoped to this component!
   */
</style>

現(xiàn)在,運(yùn)行 npm run start。您的默認(rèn)瀏覽器應(yīng)該在 http://miracleart.cn/link/03b0db8c971432a5e8d163897176a7cc 打開,您應(yīng)該在屏幕上看到“Hello, World!”。

嘗試編輯 src/index.vue 將消息更改為其他內(nèi)容。如果一切順利,webpack-dev-server 應(yīng)該刷新頁面以反映您的更改。

太好了!我們正在使用 Vue.js 運(yùn)行。

Vue Devtools

在我們深入研究一個(gè)稍微複雜一點(diǎn)的 Vue 應(yīng)用程序之前,現(xiàn)在是時(shí)候提到您絕對應(yīng)該安裝 Vue devtools 了。這些位於 Chrome 開發(fā)者工具中,為您提供了一種查看應(yīng)用程序以及所有傳遞的屬性、每個(gè)組件擁有的狀態(tài)等等的好方法。

Getting up and Running with the Vue.js 2.0 Framework

構(gòu)建應(yīng)用程序

作為一個(gè)示例應(yīng)用程序,我們將使用 GitHub API 來構(gòu)建一個(gè)應(yīng)用程序,讓我們輸入用戶名並查看該用戶的某些 GitHub 統(tǒng)計(jì)信息。我在這裡選擇 GitHub API 是因?yàn)樗鼘Υ蠖鄶?shù)人都很熟悉,無需身份驗(yàn)證即可使用,並且為我們提供了大量信息。

在開始應(yīng)用程序之前,我喜歡快速思考一下我們需要哪些組件,我認(rèn)為我們的App 組件將渲染另外兩個(gè)組件:GithubInput,用於接收用戶的輸入,以及GithubOutput,它將顯示用戶的屏幕上的信息。我們將從輸入開始。

注意:您可以在 GitHub 上找到所有代碼,甚至可以查看在線運(yùn)行的應(yīng)用程序。

初始設(shè)置

在 src 目錄中為 GithubOutput 和 GithubInput 組件創(chuàng)建文件夾:

mkdir vue2-demo-project
cd vue2-demo-project
npm init -y
npm i vue
npm i webpack webpack-cli @babel/core @babel/preset-env babel-loader vue-loader vue-template-compiler webpack-dev-server html-webpack-plugin --save-dev

向每個(gè)文件夾添加必要的文件:

mkdir src
touch webpack.config.js src/index.html src/index.js

src 文件夾的結(jié)構(gòu)現(xiàn)在應(yīng)該如下所示:

<code>.
├── package.json
├── package-lock.json
├── src
│   ├── index.html
│   └── index.js
└── webpack.config.js</code>

Vue.js 中的表單

讓我們從 GithubInput 組件開始。與 App 組件一樣,index.vue 文件應(yīng)該包含模板,以及加載腳本和 CSS 文件。目前,模板只是包含

github input

。我們很快就會(huì)正確填寫它。我喜歡放入一些虛擬 HTML,以便在創(chuàng)建新組件時(shí)檢查我的模板是否已正確連接:

<template>
  <p>This is my HTML for my component</p>
</template>

<??>

<style scoped>
  /* CSS here
   * by including `scoped`, we ensure that all CSS
   * is scoped to this component!
   */
</style>

創(chuàng)建此組件時(shí),我們所做的不同之處在於創(chuàng)建與組件關(guān)聯(lián)的數(shù)據(jù)片段。這與 React 的狀態(tài)概念非常相似:

mkdir vue2-demo-project
cd vue2-demo-project
npm init -y
npm i vue
npm i webpack webpack-cli @babel/core @babel/preset-env babel-loader vue-loader vue-template-compiler webpack-dev-server html-webpack-plugin --save-dev

這表示此組件擁有一段它擁有並負(fù)責(zé)的數(shù)據(jù),即 username。我們很快將根據(jù)用戶的輸入更新它。

最後,為了將此組件放到屏幕上,我需要使用 App 組件註冊它,因?yàn)?App 組件將渲染它。

為此,我更新 src/App/script.js 並告訴它 GithubInput:

mkdir src
touch webpack.config.js src/index.html src/index.js

然後我可以更新 App 組件的模板:

<code>.
├── package.json
├── package-lock.json
├── src
│   ├── index.html
│   └── index.js
└── webpack.config.js</code>

Vue 組件的一個(gè)限制(Angular 和React 中也是如此)是每個(gè)組件必須有一個(gè)根節(jié)點(diǎn),因此當(dāng)組件必須渲染多個(gè)元素時(shí),務(wù)必記住將它們?nèi)堪b在某些東西中,最常見的是div。

跟蹤表單輸入

我們的 GithubInput 組件需要做兩件事:

  • 跟蹤輸入的當(dāng)前值
  • 傳達(dá)該值已更改,以便其他組件可以知道並因此更新其狀態(tài)。

我們可以通過創(chuàng)建一個(gè)包含輸入元素的表單來完成第一個(gè)版本。我們可以使用 Vue 的內(nèi)置指令來跟蹤表單值。 GithubInput 的模板如下所示:

//webpack.config.js
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const HtmlWebPackPlugin = require("html-webpack-plugin")

module.exports = {
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader',
      },
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env']
          }
        }
      }
    ]
  },
  plugins: [
    new VueLoaderPlugin(),
    new HtmlWebPackPlugin({
      template: "./src/index.html"
    })
  ]
}

您會(huì)注意到有兩個(gè)重要的屬性:v-on 和 v-model。

v-on 是我們在 Vue 中綁定到 DOM 事件並調(diào)用函數(shù)的方式。例如,

Click me!

每當(dāng)單擊段落時(shí),都會(huì)調(diào)用組件的 foo 方法。如果您想更詳細(xì)地了解事件處理,我強(qiáng)烈推薦 Vue 關(guān)於事件處理的文檔。 v-model 在表單輸入和數(shù)據(jù)之間創(chuàng)建雙向數(shù)據(jù)綁定。在幕後,v-model 實(shí)際上是在偵聽表單輸入上的更改事件並更新 Vue 組件中的數(shù)據(jù)以匹配。

考慮到我們上面的模板,以下是我們?nèi)绾问褂?v-on 和 v-model 來處理表單中的數(shù)據(jù):

  • v-on:submit.prevent="onSubmit" 將方法 onSubmit 綁定到表單提交時(shí)運(yùn)行。通過添加 .prevent,這意味著 Vue 將自動(dòng)阻止默認(rèn)操作發(fā)生。 (如果 Vue 沒有這樣做,我們可以在代碼中調(diào)用 event.preventDefault(),但我們不妨利用 Vue 的功能。)
  • v-model:username 將輸入的值綁定到代碼中的值 username。對於那些熟悉 Angular 的人來說,您可能會(huì)認(rèn)識(shí)到這與 ng-model 非常相似。當(dāng)我們創(chuàng)建 GithubInput 時(shí),我們聲明它擁有一段數(shù)據(jù) username,在這裡我們將該數(shù)據(jù)綁定到輸入字段。兩者將自動(dòng)保持同步。

現(xiàn)在,回到我們組件的 JavaScript 中,我們可以聲明 onSubmit 方法。請注意,此處的名稱完全是任意的——您可以隨意選擇任何名稱——但我喜歡堅(jiān)持使用根據(jù)將觸發(fā)事件命名的函數(shù)的約定:

<template>
  <p>This is my HTML for my component</p>
</template>

<??>

<style scoped>
  /* CSS here
   * by including `scoped`, we ensure that all CSS
   * is scoped to this component!
   */
</style>

我們可以直接引用 this 上的數(shù)據(jù),因此 this.username 將提供文本框的最新值。如果它不為空,我們希望讓其他組件知道數(shù)據(jù)已更改。為此,我們將使用消息總線。這些是組件可以發(fā)出事件並用於偵聽其他事件的對象。當(dāng)您的應(yīng)用程序變得更大時(shí),您可能需要考慮更結(jié)構(gòu)化的方法,例如 Vuex。目前,消息總線可以完成這項(xiàng)工作。

好消息是我們可以使用空的 Vue 實(shí)例作為消息總線。為此,我們將創(chuàng)建 src/bus.js,它只是創(chuàng)建一個(gè) Vue 實(shí)例並導(dǎo)出它:

mkdir vue2-demo-project
cd vue2-demo-project
npm init -y
npm i vue
npm i webpack webpack-cli @babel/core @babel/preset-env babel-loader vue-loader vue-template-compiler webpack-dev-server html-webpack-plugin --save-dev

在 GithubInput 組件中,我們可以導(dǎo)入該模塊並通過在用戶名更改時(shí)發(fā)出事件來使用它:

mkdir src
touch webpack.config.js src/index.html src/index.js

這樣,我們的表單就完成了,我們可以開始對生成的數(shù)據(jù)做一些事情了。

顯示來自 GitHub 的結(jié)果

GithubOutput 組件與我們的其他兩個(gè)組件具有相同的結(jié)構(gòu)。在 GithubOutput/script.js 中,我們還導(dǎo)入 bus 模塊,因?yàn)槲覀冃枰鼇碇烙脩裘螘r(shí)更改。此組件將負(fù)責(zé)的數(shù)據(jù)將是一個(gè)對象,該對象將 GitHub 用戶名映射到我們從 GitHub API 獲取的數(shù)據(jù)。這意味著我們不必每次都向 API 發(fā)出請求;如果我們之前已經(jīng)獲取了數(shù)據(jù),我們可以簡單地重複使用它。我們還將存儲(chǔ)我們收到的最後一個(gè)用戶名,以便我們知道在屏幕上顯示什麼數(shù)據(jù):

<code>.
├── package.json
├── package-lock.json
├── src
│   ├── index.html
│   └── index.js
└── webpack.config.js</code>

創(chuàng)建組件時(shí),我們要偵聽在消息總線上發(fā)出的任何 new-username 事件。值得慶幸的是,Vue 支持許多生命週期鉤子,包括 created。因?yàn)槲覀兪秦?fù)責(zé)任的開發(fā)人員,所以我們還將在組件銷毀時(shí)使用 destroyed 事件停止偵聽事件:

//webpack.config.js
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const HtmlWebPackPlugin = require("html-webpack-plugin")

module.exports = {
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader',
      },
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env']
          }
        }
      }
    ]
  },
  plugins: [
    new VueLoaderPlugin(),
    new HtmlWebPackPlugin({
      template: "./src/index.html"
    })
  ]
}

然後我們定義 onUsernameChange 方法,該方法將被調(diào)用並設(shè)置 currentUsername 屬性:

<!DOCTYPE html>
<html>
  <head>
    <title>My Vue App</title>
  </head>
  <body>
    <div id="app"></div>
  </body>
</html>

請注意,我們不必將 onUsernameChange 方法顯式綁定到當(dāng)前範(fàn)圍。當(dāng)您在 Vue 組件上定義方法時(shí),Vue 會(huì)自動(dòng)對其調(diào)用 myMethod.bind(this),因此它們始終綁定到組件。這就是為什麼您需要在 methods 對像上定義組件的方法的原因之一,這樣 Vue 就可以完全了解它們並相應(yīng)地設(shè)置它們。

條件渲染

如果我們沒有用戶名——在組件首次創(chuàng)建時(shí)我們不會(huì)有——我們想向用戶顯示一條消息。 Vue 有許多條件渲染技術(shù),但最簡單的是 v-if 指令,它接受一個(gè)條件,並且只有在條件存在時(shí)才會(huì)渲染元素。它還可以與 v-else 配合使用:

import Vue from 'vue'

const vm = new Vue({
  el: '#app',
})

同樣,這對於任何 Angular 開發(fā)人員來說都非常熟悉。我們在這裡使用雙等號(hào)而不是三等號(hào),因?yàn)槲覀兿M麠l件不僅在 currentUsername 為 null 時(shí)為真,而且在 currentUsername 為 undefined 時(shí)也為真,並且 null == undefined 為真。

從 GitHub 獲取數(shù)據(jù)

Vue.js 沒有自帶 HTTP 庫,這是有充分理由的。如今,fetch API 本地包含在許多瀏覽器中(儘管在撰寫本文時(shí),IE11、Safari 或 iOS Safari 除外)。為了本教程的緣故,我不會(huì)使用 polyfill,但如果您需要,可以在瀏覽器中輕鬆地為 API 添加 polyfill。如果您不喜歡 fetch API,則有很多用於 HTTP 的第三方庫,Vue 文檔中提到的一個(gè)庫是 Axios。

我非常支持像 Vue 這樣的框架不包含 HTTP 庫。它可以減小框架的捆綁包大小,並讓開發(fā)人員選擇最適合他們的庫,並根據(jù)需要輕鬆自定義請求以與他們的 API 通信。我將在本文中堅(jiān)持使用 fetch API,但您可以隨意將其替換為您喜歡的任何庫。

如果您需要了解 fetch API,請查看 SitePoint 上 Ludovico Fischer 的帖子,這將使您快速上手。

為了發(fā)出 HTTP 請求,我們將為組件提供另一個(gè)方法 fetchGithubData,該方法向 GitHub API 發(fā)出請求並存儲(chǔ)結(jié)果。它還將首先檢查我們是否已經(jīng)擁有此用戶的數(shù)據(jù),如果沒有,則不會(huì)發(fā)出請求:

<template>
  <p>This is my HTML for my component</p>
</template>

<??>

<style scoped>
  /* CSS here
   * by including `scoped`, we ensure that all CSS
   * is scoped to this component!
   */
</style>

然後我們只需要在用戶名更改時(shí)觸發(fā)此方法:

mkdir vue2-demo-project
cd vue2-demo-project
npm init -y
npm i vue
npm i webpack webpack-cli @babel/core @babel/preset-env babel-loader vue-loader vue-template-compiler webpack-dev-server html-webpack-plugin --save-dev

還有一件事需要注意,由於 Vue 跟蹤您正在使用的數(shù)據(jù)的方式,因此它知道何時(shí)更新視圖。有一份很棒的反應(yīng)式指南詳細(xì)解釋了它,但本質(zhì)上,Vue 無法神奇地知道您何時(shí)從對像中添加或刪除了屬性,因此如果我們這樣做:

mkdir src
touch webpack.config.js src/index.html src/index.js

Vue 將無法識(shí)別這一點(diǎn),也不會(huì)更新我們的視圖。相反,我們可以使用特殊的 Vue.set 方法,它明確地告訴 Vue 我們添加了一個(gè)鍵。上面的代碼將如下所示:

<code>.
├── package.json
├── package-lock.json
├── src
│   ├── index.html
│   └── index.js
└── webpack.config.js</code>

此代碼將修改 this.githubData,添加我們傳遞給它的鍵和值。它還會(huì)通知 Vue 更改,以便它可以重新渲染。

現(xiàn)在我們的代碼如下所示:

//webpack.config.js
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const HtmlWebPackPlugin = require("html-webpack-plugin")

module.exports = {
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader',
      },
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env']
          }
        }
      }
    ]
  },
  plugins: [
    new VueLoaderPlugin(),
    new HtmlWebPackPlugin({
      template: "./src/index.html"
    })
  ]
}

最後,我們需要使用 App 組件註冊 GitHubOutput 組件:

<!DOCTYPE html>
<html>
  <head>
    <title>My Vue App</title>
  </head>
  <body>
    <div id="app"></div>
  </body>
</html>

並將其包含在模板中:

import Vue from 'vue'

const vm = new Vue({
  el: '#app',
})

儘管我們尚未編寫將獲取的數(shù)據(jù)顯示在屏幕上的視圖代碼,但您應(yīng)該能夠使用您的用戶名填寫表單,然後檢查 Vue devtools 以查看從 GitHub 請求的數(shù)據(jù)。這顯示了這些 devtools 的實(shí)用性和強(qiáng)大之處;您可以檢查任何組件的本地狀態(tài),並準(zhǔn)確查看發(fā)生了什麼。

在視圖中顯示一些統(tǒng)計(jì)信息

我們現(xiàn)在可以更新模板以顯示一些數(shù)據(jù)。讓我們將此代碼包裝在另一個(gè) v-if 指令中,以便只有在請求完成後我們才會(huì)渲染數(shù)據(jù):

mkdir src/App
touch src/App/{index.vue,script.js,style.css}

這樣,我們現(xiàn)在可以將 GitHub 詳情渲染到屏幕上,我們的應(yīng)用程序就完成了!

重構(gòu)

我們肯定可以做一些改進(jìn)。上面渲染 GitHub 數(shù)據(jù)的 HTML 代碼只需要一小部分——當(dāng)前用戶的數(shù)據(jù)。這是另一個(gè)組件的完美案例,我們可以為其提供用戶數(shù)據(jù),它可以渲染它。

讓我們創(chuàng)建一個(gè) GithubUserData 組件,其結(jié)構(gòu)與我們的其他組件相同:

<template>
  <p>This is my HTML for my component</p>
</template>

<??>

<style scoped>
  /* CSS here
   * by including `scoped`, we ensure that all CSS
   * is scoped to this component!
   */
</style>

此組件只有一個(gè)很小的區(qū)別:它將獲取一個(gè)屬性 data,這將是用戶的數(shù)據(jù)。屬性(或“props”)是組件將由其父組件傳遞的數(shù)據(jù)位,它們在 Vue 中的行為與在 React 中的行為非常相似。在 Vue 中,您必須顯式聲明組件需要的每個(gè)屬性,因此在這裡我將說我們的組件將獲取一個(gè)屬性 data:

mkdir vue2-demo-project
cd vue2-demo-project
npm init -y
npm i vue
npm i webpack webpack-cli @babel/core @babel/preset-env babel-loader vue-loader vue-template-compiler webpack-dev-server html-webpack-plugin --save-dev

我非常喜歡 Vue 的一點(diǎn)是您必須非常明確;組件將使用的所有屬性、數(shù)據(jù)和組件都已明確聲明。這使得代碼更容易使用,而且我相信隨著項(xiàng)目越來越大越來越複雜,也更容易維護(hù)。

在新模板中,我們擁有與之前完全相同的 HTML,儘管我們可以引用 data 而不是 githubData[currentUsername]:

mkdir src
touch webpack.config.js src/index.html src/index.js

為了使用此組件,我們需要更新 GithubOutput 組件。首先,我們導(dǎo)入並註冊 GithubUserData:

<code>.
├── package.json
├── package-lock.json
├── src
│   ├── index.html
│   └── index.js
└── webpack.config.js</code>

在聲明組件時(shí),您可以使用任何名稱,因此在我放置 github-user-data 的位置,您可以放置任何您想要的名稱。建議您堅(jiān)持使用包含破折號(hào)的組件。 Vue 沒有強(qiáng)制執(zhí)行此操作,但 W3C 關(guān)於自定義元素的規(guī)範(fàn)指出,它們必須包含破折號(hào)以防止與將來版本的 HTML 中添加的元素發(fā)生命名衝突。

聲明組件後,我們可以在模板中使用它:

//webpack.config.js
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const HtmlWebPackPlugin = require("html-webpack-plugin")

module.exports = {
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader',
      },
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env']
          }
        }
      }
    ]
  },
  plugins: [
    new VueLoaderPlugin(),
    new HtmlWebPackPlugin({
      template: "./src/index.html"
    })
  ]
}

這里至關(guān)重要的一點(diǎn)是我如何將 data 屬性傳遞給組件:

<!DOCTYPE html>
<html>
  <head>
    <title>My Vue App</title>
  </head>
  <body>
    <div id="app"></div>
  </body>
</html>

此屬性開頭的冒號(hào)至關(guān)重要;它告訴 Vue 我們傳遞的屬性是動(dòng)態(tài)的,並且每次數(shù)據(jù)更改時(shí)都應(yīng)更新組件。 Vue 將評(píng)估 githubData[currentUsername] 的值,並確保 GithubUserData 組件隨著數(shù)據(jù)更改而保持最新。

如果您覺得 :data 有點(diǎn)簡短且神奇,您還可以使用更長的 v-bind 語法:

import Vue from 'vue'

const vm = new Vue({
  el: '#app',
})

兩者是等效的,因此請使用您喜歡的任何一種。

結(jié)論

這樣,我們的 GitHub 應(yīng)用程序就處於相當(dāng)不錯(cuò)的狀態(tài)!您可以在 GitHub 上找到所有代碼,甚至可以查看在線運(yùn)行的應(yīng)用程序。

當(dāng)我開始使用 Vue 時(shí),我對它寄予厚望,因?yàn)槲衣犝f過很多好話,我很高興地說它確實(shí)達(dá)到了我的預(yù)期。使用 Vue 的感覺就像採用 React 的最佳部分並將它們與 Angular 的最佳部分合併一樣。一些指令(如v-if、v-else、v-model 等等)非常易於上手(並且比在React 的JSX 語法中進(jìn)行條件判斷更容易立即理解),但Vue 的組件系統(tǒng)感覺與React 的非常相似。

您應(yīng)該將系統(tǒng)分解成小的組件,總的來說,我發(fā)現(xiàn)這是一個(gè)非常無縫的體驗(yàn)。我還不能對 Vue 團(tuán)隊(duì)的文檔給予足夠的讚揚(yáng):它絕對很棒。指南非常出色,API 參考也很全面,並且易於導(dǎo)航,可以找到您想要的確切內(nèi)容。

如果您喜歡這篇文章並想了解更多信息,最好的起點(diǎn)絕對是官方的 Vue.js 網(wǎng)站。

關(guān)於 Vue.js 2.0 的常見問題

Vue.js 1.0 和 Vue.js 2.0 的主要區(qū)別是什麼?

Vue.js 2.0 比其前身有了幾項(xiàng)改進(jìn)。最重要的變化是引入了虛擬 DOM,它通過減少對實(shí)際 DOM 的直接操作來提高性能。 Vue.js 2.0 還引入了簡化的基於組件的開發(fā)語法,使構(gòu)建複雜的用戶界面更容易。此外,Vue.js 2.0 支持服務(wù)器端渲染,這可以提高應(yīng)用程序的性能並使其更易於 SEO 優(yōu)化。

如何在 Vue.js 2.0 中使用觀察者?

Vue.js 2.0 中的觀察者允許您在數(shù)據(jù)屬性更改時(shí)執(zhí)行自定義邏輯。要使用觀察者,您需要定義一個(gè)與要觀察的數(shù)據(jù)屬性同名的函數(shù),然後將其添加到 Vue 實(shí)例中的“watch”對像中。每當(dāng)數(shù)據(jù)屬性更改時(shí),都會(huì)調(diào)用此方法,並將其新值和舊值作為參數(shù)。

Vue.js 中的急切加載是什麼,我該如何使用它?

急切加載是 Vue.js 中的一個(gè)概念,它允許您在需要之前從服務(wù)器加載數(shù)據(jù),從而提高應(yīng)用程序的性能。要在 Vue.js 中使用急切加載,您可以使用“created”生命週期鉤子在創(chuàng)建組件時(shí)從服務(wù)器獲取數(shù)據(jù)。然後,此數(shù)據(jù)將在組件渲染後立即可用。

如何在 Vue.js 2.0 中使用計(jì)算屬性?

Vue.js 2.0 中的計(jì)算屬性允許您定義基於您的數(shù)據(jù)計(jì)算的可重用屬性。要使用計(jì)算屬性,您需要定義一個(gè)返回計(jì)算值的方法,然後將其添加到 Vue 實(shí)例中的“computed”對像中。每當(dāng)它所依賴的任何數(shù)據(jù)屬性更改時(shí),都會(huì)調(diào)用此方法,並且其返回值將被緩存,直到依賴項(xiàng)再次更改。

如何在 Vue.js 2.0 中處理事件?

Vue.js 2.0 提供了一個(gè)強(qiáng)大的事件處理系統(tǒng),允許您偵聽 DOM 事件並在事件發(fā)生時(shí)運(yùn)行自定義邏輯。要處理事件,您需要在模板中使用“v-on”指令,後跟要偵聽的事件的名稱以及事件發(fā)生時(shí)要運(yùn)行的方法。此方法將使用事件對像作為其參數(shù)調(diào)用。

如何將 Vue.js 2.0 與 Laravel 一起使用?

Vue.js 2.0 可以輕鬆地與 Laravel(一個(gè)流行的 PHP 框架)集成。 Laravel 自帶 Vue.js 支持,因此您可以立即開始構(gòu)建 Vue.js 組件。要在 Laravel 項(xiàng)目中使用 Vue.js,您需要在 HTML 中包含 Vue.js 腳本,然後在單獨(dú)的 JavaScript 文件中定義 Vue 組件。

如何將 Vue.js 2.0 與 Webpack 一起使用?

Webpack 是一個(gè)模塊捆綁器,可用於將 Vue.js 組件捆綁到單個(gè) JavaScript 文件中。要將 Vue.js 與 Webpack 一起使用,您需要安裝“vue-loader”包,它允許 Webpack 理解 Vue 組件。然後,您可以在 JavaScript 文件中導(dǎo)入 Vue 組件,並像平時(shí)一樣使用它們。

如何將 Vue.js 2.0 與 TypeScript 一起使用?

Vue.js 2.0 支持 TypeScript,TypeScript 是 JavaScript 的靜態(tài)類型超集。要將 Vue.js 與 TypeScript 一起使用,您需要安裝“vue-class-component”包,它允許您使用 TypeScript 類定義 Vue 組件。然後,您可以將 Vue 組件定義為 TypeScript 類,並使用 TypeScript 的靜態(tài)類型功能在編譯時(shí)捕獲錯(cuò)誤。

如何將 Vue.js 2.0 與 Vuex 一起使用?

Vuex 是 Vue.js 的狀態(tài)管理庫,它允許您在一個(gè)集中式存儲(chǔ)中管理應(yīng)用程序的狀態(tài)。要將 Vuex 與 Vue.js 一起使用,您需要安裝“vuex”包,然後在 Vuex 存儲(chǔ)中定義您的狀態(tài)、變異、操作和獲取器。然後,您可以使用“this.$store”屬性從 Vue 組件訪問您的狀態(tài)和調(diào)度操作。

如何將 Vue.js 2.0 與 Vue Router 一起使用?

Vue Router 是 Vue.js 的路由庫,它允許您為應(yīng)用程序定義路由。要將 Vue Router 與 Vue.js 一起使用,您需要安裝“vue-router”包,然後在 Vue Router 實(shí)例中定義您的路由。然後,您可以使用“router-link”組件在路由之間導(dǎo)航,並使用“router-view”組件顯示當(dāng)前路由的組件。

以上是使用vue.js 2.0框架啟動(dòng)並運(yùn)行的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

Java vs. JavaScript:清除混亂 Java vs. JavaScript:清除混亂 Jun 20, 2025 am 12:27 AM

Java和JavaScript是不同的編程語言,各自適用於不同的應(yīng)用場景。 Java用於大型企業(yè)和移動(dòng)應(yīng)用開發(fā),而JavaScript主要用於網(wǎng)頁開發(fā)。

JavaScript評(píng)論:簡短說明 JavaScript評(píng)論:簡短說明 Jun 19, 2025 am 12:40 AM

JavascriptconcommentsenceenceEncorenceEnterential gransimenting,reading and guidingCodeeXecution.1)單inecommentsareusedforquickexplanations.2)多l(xiāng)inecommentsexplaincomplexlogicorprovideDocumentation.3)

如何在JS中與日期和時(shí)間合作? 如何在JS中與日期和時(shí)間合作? Jul 01, 2025 am 01:27 AM

JavaScript中的日期和時(shí)間處理需注意以下幾點(diǎn):1.創(chuàng)建Date對像有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設(shè)置時(shí)間信息可用get和set方法,注意月份從0開始;3.手動(dòng)格式化日期需拼接字符串,也可使用第三方庫;4.處理時(shí)區(qū)問題建議使用支持時(shí)區(qū)的庫,如Luxon。掌握這些要點(diǎn)能有效避免常見錯(cuò)誤。

為什麼要將標(biāo)籤放在的底部? 為什麼要將標(biāo)籤放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScript與Java:開發(fā)人員的全面比較 JavaScript與Java:開發(fā)人員的全面比較 Jun 20, 2025 am 12:21 AM

JavaScriptIspreferredforredforwebdevelverment,而Javaisbetterforlarge-ScalebackendsystystemsandSandAndRoidApps.1)JavascriptexcelcelsincreatingInteractiveWebexperienceswebexperienceswithitswithitsdynamicnnamicnnamicnnamicnnamicnemicnemicnemicnemicnemicnemicnemicnemicnddommanipulation.2)

JavaScript:探索用於高效編碼的數(shù)據(jù)類型 JavaScript:探索用於高效編碼的數(shù)據(jù)類型 Jun 20, 2025 am 12:46 AM

javascripthassevenfundaMentalDatatypes:數(shù)字,弦,布爾值,未定義,null,object和symbol.1)numberSeadUble-eaduble-ecisionFormat,forwidevaluerangesbutbecautious.2)

什麼是在DOM中冒泡和捕獲的事件? 什麼是在DOM中冒泡和捕獲的事件? Jul 02, 2025 am 01:19 AM

事件捕獲和冒泡是DOM中事件傳播的兩個(gè)階段,捕獲是從頂層向下到目標(biāo)元素,冒泡是從目標(biāo)元素向上傳播到頂層。 1.事件捕獲通過addEventListener的useCapture參數(shù)設(shè)為true實(shí)現(xiàn);2.事件冒泡是默認(rèn)行為,useCapture設(shè)為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委託,提高動(dòng)態(tài)內(nèi)容處理效率;5.捕獲可用於提前攔截事件,如日誌記錄或錯(cuò)誤處理。了解這兩個(gè)階段有助於精確控制JavaScript響應(yīng)用戶操作的時(shí)機(jī)和方式。

Java和JavaScript有什麼區(qū)別? Java和JavaScript有什麼區(qū)別? Jun 17, 2025 am 09:17 AM

Java和JavaScript是不同的編程語言。 1.Java是靜態(tài)類型、編譯型語言,適用於企業(yè)應(yīng)用和大型系統(tǒng)。 2.JavaScript是動(dòng)態(tài)類型、解釋型語言,主要用於網(wǎng)頁交互和前端開發(fā)。

See all articles