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>
    <!-- 生成的文件将被自动注入 -->
  </body>
</html>

因此,该文件 HTML 静态显示为空。此处不存在 HTML 代码。 显示是动态的:项目中的代码 jS 将生成 HTML,该代码将完全替换第 14 行中的 [<div id=’app’>] 标签。 由项目中的代码 jS 生成的代码 HTML,已插入第 14 行取代标签 [<div>],该代码源自组件 [vue.js] 组件中的 [template] 标签,这些文件的后缀为 [.vue]

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


// 导入
import Vue from 'vue'
import App from './App.vue'

// 配置
Vue.config.productionTip = false

// 项目实例化 [App]
new Vue({
  render: h => h(App),
}).$mount('#应用程序')

注释

  • 第 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])来构建网页。 该组件由文件 [HelloWorld.vue] 定义,该文件在关联脚本 jS 的第 9 行中定义;
  • 第 4 行:组件可接受参数。此处的参数即 [msg] 属性;
  • 第8-17行:片段(或组件)的脚本jS;
  • 第 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" />

组件 [HelloWorld] 是通过为参数(属性)[msg] 赋值来实例化的。如果追踪组件 [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] 中,改为 [clic droit]
  • 变为 [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),而该组件又包含组件 [HelloWorld] (4)。 点击 [4] 将显示组件 [HelloWorld] 和 [5] 的属性。

[4](右侧)中,可以看到指标 [$vm0]。 这是可以在 JavaScript [6] 控制台中用于指定对象 [HelloWorld] 的变量名称。让我们来操作一下:

Image

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

最后,让我们展示 [hot reload] 的功能,该功能由用于执行项目的命令 [serve] 调用:

  • [App.vue] 中,修改 [HelloWorld] 显示的消息:

Image

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

接下来我们将创建多个 [vuejs-xx] 项目,以说明 [Vue.js] 的要点。所谓“要点”,是指“我们将用于税务计算服务器客户端 [vue.js] 的内容”。 若某些“重要”内容未在客户端中使用,则将不予赘述。因此,本文并非对 [vue.js] 的全面介绍。