创建Vue实例对象,详解MVVM

本节正式进入 Vue.js 的讲解,首先需要安装 Vue.js,安装方式有两种,本节讲解第一种安装方式,即通过 CDN 安装,这种方式非常简单,只需要在文件中引入 CDN 网址,代码如下(另一种安装方式在后文中介绍)。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 安装 Vue.js -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</body>
</html>

上述代码中,script 的引用就是 Vue.js 的安装,有两个需要注意的事情。

  • Vue.js 的引用分为生产版本和开发版本,生产版本是最终上线的版本,代码会进行压缩,开发版本一般是供学习和测试使用。

  • 建议把 Vue.js 的引用位置放在 body 标签的最下方,不要放在 head 标签中。

引入 Vue.js 之后,内存中就多了 Vue 构造函数,此时就可以创建 Vue 实例了,并传入配置对象,代码如下。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        {{ msg }}
    </div>
    <!-- 安装 Vue.js -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                msg: 'Hello World'
            }
        });
    </script>
</body>
</html>

上述代码是一个完整的 Vue 实例,分析上述代码可发现,通过 new Vue({}) 声明的 vm 实例就是 MVVM 中的 VM 层,负责 M 层和 V 层的调度。

配置对象中的 el 属性表示声明出来的 Vue 实例要控制页面上的哪块区域。这个实例中 el 的属性值是 #app,表示控制的页面区域,如下所示。

<div id="app"></div>

而这里的 HTML 代码就是 MVVM 中的 V 层视图层。

data 的属性值是一个对象,用来存储 V 层所用到的数据,所以 data 就是 MVVM 中的 M 层数据层。

data 中存储 msg 属性,这里要做的是把 msg 中的 “Hello World” 渲染到以下代码所示的区域。

<div id="app"></div>

在使用 Vue 后,无须再操作 DOM 元素,直接以插值表达式的形式输出 {{msg}} 即可。

{{}} 又被叫作插值表达式,可直接渲染 data 中的属性。

通过以上实例可以发现,我们只需要注意 data 中的数据,不需要考虑数据具体是怎么渲染到页面中的,因为 Vue 已经帮我们实现了,这也是 Vue 的核心思想之一,即数据驱动视图。

分析 vm 实例对象。打开浏览器,按 F12 键,选择控制台,在控制台中打印 vm 实例,打印的结果如下。

{
  "$attrs": {},
  "$children": [],
  "$createElement": "function $createElement(a, b, c, d)",
  "$el": "<div id=\"main\">",
  "$listeners": {},
  "$options": {
    "components": {},
    "directives": {},
    "el": "#main"
  },
  "$parent": undefined,
  "$refs": {},
  "$root": {
    "_uid": 0,
    "_isVue": true,
    "$options": {}
  },
  "$scopedSlots": {},
  "$slots": {},
  "$vnode": undefined,
  "_c": "function _c(a, b, c, d)",
  "_data": {
    "msg": {
      "getter": "Getter",
      "setter": "Setter"
    }
  },
  "_directInactive": false,
  "_events": {},
  "_hasHookEvent": false,
  "_inactive": null,
  "_isBeingDestroyed": false,
  "_isDestroyed": false,
  "_isMounted": true,
  "_isVue": true,
  "_renderProxy": {
    "<target>": {},
    "<handler>": {}
  },
  "_self": {
    "_uid": 0,
    "_isVue": true,
    "$options": {}
  },
  "_staticTrees": null,
  "_uid": 0,
  "_vnode": {
    "tag": "div",
    "data": {},
    "children": [{}]
  },
  "_watcher": {
    "deep": false,
    "user": false,
    "lazy": false
  },
  "_watchers": [{}],
  "msg": "Getter & Setter"
}

vm 是通过 new Vue({}) 创建出来的实例对象,实例对象中的属性可以分为以下三大类。

  • 第一类以 “$” 符号开头,表示 Vue 中的公有属性。

  • 第二类以下画线开头,表示 Vue 中的私有属性。

  • 第三类是 Vue 中 data 里面的自定义属性。