Skip to content

3. 项目 [vuejs-01]:基础篇

为阐明 [vuejs-00] 中执行的代码我们将在 [vuejs-01] 中对其进行简化。我们将 [vuejs-00] 文件夹复制到 [vuejs-01] 中:

Image

[vuejs-01] 项目主要由四个文件组成:

  • [main.js] [2] 是项目的入口点;
  • [App.vue, HelloWorld.vue] [3-4] [Vue.js] 组件,可选地包含以下元素:
    • [<template>...</template>]: HTML 代码;
    • [<script>...</script>]:与 HTML 代码关联的 JavaScript 代码;
    • [<style>...</style>]: 与 HTML 代码关联的 CSS 样式;
  • [public/index.html] [5]:由 [npm run serve] 命令显示的 HTML 文档;

项目运行时显示的 [public/index.html] 文件是这个:


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title>vuejs</title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but vuejs doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>

因此,此 HTML 文件不会静态显示任何内容。这里没有 HTML 代码。 显示内容是动态生成的:项目的 JavaScript 代码将生成 HTML,并完全替换第 14 行中的 [<div id=’app’>] 标签。由项目 JavaScript 生成并插入到第 14 行 [<div>] 标签位置的 HTML 代码,来源于 [vue.js] 组件的 [template] 标签,即那些带有 [.vue] 后缀的文件。

以下 [vuejs-01/main.js] 脚本会在第 14 行动态插入 HTML 代码:


// imports
import Vue from 'vue'
import App from './App.vue'
 
// configuration
Vue.config.productionTip = false
 
// instanciation projet [App]
new Vue({
  render: h => h(App),
}).$mount('#app')

评论

  • 第 2 行:[Vue] 对象由 [vue.js] 框架提供;
  • 第 3 行:[App] 对象由 [vuejs-01/App.vue] 文件提供;
  • 第 6 行:[Vue] 对象的配置;
  • 第 9–11 行:这些行负责:
    • 生成应用程序的 HTML 代码。第 10 行:由 [App.vue] 文件生成;
    • 将第 10 行生成的 HTML 代码加载到 [public/index.html] 文件的 [<div id='app'></div>] 部分中;

任何 [Vue.js] 项目均可保留 [index.html] 文件的原始状态。

初始 [vuejs-00] 项目中的 [App.vue] 文件在 [vuejs-01] 项目中简化如下:


<template>
  <div id="myApp">
    <img alt="Vue logo" src="./assets/logo.png" />
    <HelloWorld msg="Notre première application Vue.js" />
  </div>
</template>
 
<script>
import HelloWorld from "./components/HelloWorld.vue";
 
export default {
  name: "app",
  components: {
    HelloWorld
  }
};
</script>

评论

  • 一个 [.vue] 片段最多由三个部分组成:
    • [<template>...</template>] : HTML 代码;
    • [<script>...</script>] : 与 HTML 代码相关的 JavaScript 代码;
    • [<style>...</style>]:与 HTML 代码相关的 CSS 样式;

这里没有 [style] 部分。

  • 第 1–6 行:片段(页面、组件、视图等)的 HTML 代码;
  • 第 2–5 行:[template] 部分只能包含一个元素。我们通常放置一个 [div] 部分,以包含片段的所有 HTML 内容。我们也可以放置一个 <template> 标签;
  • 第 3 行:一张图片;

Image

  • 第 4 行:一个名为 [HelloWorld] 的组件。[Vue.js] 的原理是使用在 [.vue] 文件(如这里的 [App.vue])中定义的片段来构建网页。该组件由关联 JavaScript 脚本第 9 行定义的 [HelloWorld.vue] 文件定义;
  • 第 4 行:组件可以接受参数。这里的参数是 [msg] 属性;
  • 第 8–17 行:片段(或组件)的 JavaScript 脚本;
  • 第 9 行:要在 [App] 组件内使用 [HelloWorld] 组件,必须将其定义导入到 [script] 部分;
  • 第 11–16 行:脚本定义了一个对象并将其导出,以便外部使用;
  • 第 12 行:[name] 属性定义了导出组件的名称;
  • 第 13–15 行:[components] 属性列出了 [App] 组件所使用的组件。这些组件将与其一同导出;

第 9 行:[HelloWorld] 组件的名称不必与定义它的文件名称相同。它可以被导入为 [X],并作为 [Bonjour] 组件导出:

Image

  • 第 14 行:[X] 组件以 [Bonjour] 这个名称导出。随后在第 4 行中,它便以该名称被调用;

第一种写法最为常见,因此我们将采用这种方式定义组件;


<template>
  <div id="myApp">
    <img alt="Vue logo" src="./assets/logo.png" />
    <HelloWorld msg="Notre première application Vue.js" />
  </div>
</template>
 
<script>
import HelloWorld from "./components/HelloWorld.vue";
 
export default {
  name: "app",
  components: {
    HelloWorld
  }
};
</script>

第 14 行是代码 [HelloWorld : HelloWorld] 的简写形式:[HelloWorld] 组件(位于右侧,在第 9 行导入)以 [HelloWorld](位于左侧)为名进行导出。

Image

我们将 [HelloWorld.vue] 组件简化如下:


<template>
  <div>
    <h1>{{ msg }}</h1>
  </div>
</template>
 
<script>
export default {
  name: "HelloWorld",
  props: {
    msg: String
  }
};
</script>

评论

  • [HelloWorld] 组件的文件结构与主 [App] 组件相同;
  • 第 3 行:此处评估一个 JavaScript 表达式,本例中为表达式 [msg]
  • 第 10–12 行:定义组件的属性,更具体地说,是其参数。当 [App] 组件实例化 [HelloWorld] 组件时,它使用了以下语法:

<HelloWorld msg="Notre première application Vue.js" />

通过为参数(属性)[msg] 赋值来实例化 [HelloWorld] 组件。如果查看 [HelloWorld] 组件的 [template],其内容如下:


<div>
    <h1>Notre première application Vue.js</h1>
</div>
  • 第 7–14 行:组件的属性定义为一个对象并被导出;
    • 第 9 行:组件以 [HelloWorld] 为名导出;
    • 第 10–12 行:其参数由 [props] 属性定义;

最终,如果将所使用的两个组件 [App] 和 [HelloWorld] 的模板组合起来,显示的 [index.html] 文件将如下所示:


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <link rel="icon" href="<%= BASE_URL %>favicon.ico">
  <title>vuejs</title>
</head>
<body>
  <noscript>
    <strong>We're sorry but vuejs doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
  </noscript>
  <div id="myApp">
    <img alt="Vue logo" src="./assets/logo.png" />
    <div>
      <h1>Notre première application Vue.js</h1>
    </div>
  </div></body>
</html>

我们通过修改 [package.json] 文件中的 [serve] [1] 命令来启动应用程序:

Image

随后显示的页面是 [2]

现在让我们看看该页面的代码:

Image

  • [1]右键单击
  • [2]处,即页面的源代码。我们可以看到,这是最初[index.html]文件中的代码,但这并非实际显示的内容。确实,最初加载的是[index.html]页面。随后,JavaScript代码动态修改了该页面,但我们并未看到这一过程;

当页面由 JavaScript 动态生成时,选项 [2] 便无用武之地。您必须进入浏览器开发者工具(Firefox 中按 F12)才能查看当前显示页面的代码:

Image

  • [1] 中,是显示文档的 DOM(文档对象模型)检查器;
  • [2] 显示该 DOM 实际包含的内容;
  • [3-4],我们将用于查看 [Vue.js] 框架所用 JavaScript 对象的工具;
  • [4] 是一个用于调试 [Vue.js] 应用程序的扩展程序(此处为 Firefox 版):
    • 适用于 Firefox:[https://addons.mozilla.org/fr/firefox/addon/vue-js-devtools/]
    • 适用于 Chrome:[https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd]

让我们来看看 [Vue] 选项卡 [4]

Image

[1-4] 视图展示了文档的 [Vue.js] 结构:文档根目录 [2](index.html)包含 [App] 组件(3),而 [App] 组件又包含 [HelloWorld] 组件(4)。点击 [4] 可显示 [HelloWorld] 组件的属性 [5]

[4](右侧)处,我们可以看到 [$vm0] 标记。这是我们在 JavaScript 控制台 [6] 中用于引用 [HelloWorld] 对象的变量名。让我们试一试:

Image

  • [2] 中,我们求值表达式 [$vm0],从而显示其结构。通常情况下,我们无需直接使用该结构;

最后,让我们演示一下用于运行项目的 [serve] 命令的 [热重载] 功能:

  • [App.vue] 中,将显示的消息更改为 [HelloWorld]

Image

  • [1] 中,我们修改了显示的消息;
  • [2-3] 中,页面会自动更新,无需我们进行任何操作;

接下来,我们将创建多个 [vuejs-xx] 项目,以演示 [Vue.js] 的关键特性。这里所说的“关键”,指的是“我们在税务计算服务器的 [Vue.js] 客户端中会用到的特性”。如果某些“关键”特性在客户端中未被使用,我们将予以省略。因此,本文并非旨在全面介绍 [Vue.js]