Vue App

  • 每个Vue会应用通过new Vue()方法创建一个根Vue实例,创建Vue实例时可传入一个选项对象。
  • Vue虽然并未完全遵循MVVM模型,但Vue设计也受它启发。
  • Vue应用通过new Vue()创建的根Vue实例,以及可选的嵌套的、可复用的组件树组成。
  • 所有Vue组件都是Vue实例,并接受相同的选项对象。
import Vue from "vue";
const vm = new Vue(options={});

选项对象options

选项对象的属性涉及到的参数可划分为五类,分别是数据、DOM、生命周期钩子、资源、组合、其它。

数据

数据 描述
data Vue实例的数据对象
props 用于接收来自父组件的数据
propsData 创建Vue实例时传递给props的参数,方便测试。
computed 计算属性,会被混入到Vue实例中。
methods 方法,将被混入到Vue实例中。
watch 对象,键是需要观察的表达式,值是对应的回调函数。

data

当Vue实例被创建时,它向Vue的响应式系统中加入了data对象中能找到的所有属性。当属性发生改变时,视图产生响应,即匹配更新为新值。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
    <div id="app">
    </div>
    <script>
        //数据对象
        var user = {username:'alice'};
        //将数据对象添加到Vue实例中
        var vm = new Vue({
            data:user
        });
        console.log(vm.username === user.username);

        //设置属性会影响到原始数据,反之亦然。
        vm.username = 'ben';
        console.log(user.username);
    </script>
</body>
</html>

当数据改变时,视图重渲染。只有当实例被创建时data中存在的属性才是响应式的。即若添加新属性则它的改动不会触发任何视图的更新。

若你之后需某属性,之前定义时设置初始值即可。

var vm = new Vue({
    data:{
        error:null,
        list:[],
        count:0,
    }
});

唯一的例外是使用Object.freeze(),会阻止修改现有属性,也意味着响应系统无法再追踪变化。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
    <div id="app">
        <p>{{data.message}}</p>
        <button @click="data.message='world'">change</button>
    </div>
    <script>
        var data = {message:'hello'};
        var vm = new Vue({
            el:'#app',
            data(){
                return {data};
            }
        });
    </script>
</body>
</html>

除了数据属性,Vue实例还暴露了一些有用的实例属性和方法。它们都有前缀$,以便与用户自定义的属性区分。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
    <div id="app">
        <p>{{data.message}}</p>
        <input type="text" v-model="data.message">
    </div>
    <script>
        var data = {message:'hello'};
        var vm = new Vue({
            el:'#app',
            data:data
        });
        //Vue实例实例属性
        console.log(vm.$el===document.getElementById('app'));//output:true
        console.log(vm.$data===data);//output:true
        //Vue实例方法
        vm.$watch('message', function(newVal, oldVal){
            console.log('message change');//回调将在vm.message改变后调用
        });
    </script>
</body>
</html>

DOM

DOM 描述
el 已存在的页面DOM元素的CSS选择器或HTMLElement实例,作为Vue实力的挂载目标。
render 字符串模板代替方案

el

如果在Vue实例化时存在el选项,Vue实例将立即进入编译过程。否则需要显示调用vm.$mount()方法手动开启编译。

const vm = new Vue({
  el:"#app"
});
const vm = new Vue();
vm.$mount("#app");

Vue实例对象vm提供了$muont生命周期方法,如果vm对象在实例化时没有收到el选项,则会处于“未挂载”的状态,即没有关联的DOM元素。此时可使用vm.$mount(elementOrSelector)方法手动挂载一个尚未挂载的实例。若没有提供elementOrSelector参数,模板将被渲染为文档之外的元素。

例如:入口文件main.js

import Vue from 'vue';
import Axios  from "axios";

import App from './App.vue';
import router from "./router.js";

Vue.config.productionTip = false;
Vue.prototype.axios = Axios;

//创建vue应用实例并挂在到#index元素上
const vm = new Vue({render:h=>h(App), router:router});//未挂载状态
//手工挂载vm实例
vm.$mount('#index');

$mount方法会返回vm实力自身,因此可链式调用其他实例方法。

render

render作为字符串模板的替代方案,render渲染函数接收一个createElement方法作为第一个参数用来创建VNode节点。若组件是一个函数组件则render渲染函数还会接收一个额外的context上下文参数,为没有实例的函数组件提供上下文信息。

生命周期钩子

每个Vue实例在被创建时都要经过一系列初始化过程--例如,需设置数据监听、编译、模板、将实例挂载到DOM并在数据变化时更新DOM等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给用户在不同阶段添加自己的代码的机会。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
    <div id="app">
        <p>{{data.message}}</p>
        <input type="text" v-model="data.message">
    </div>
    <script>
        var data = {message:'hello'};
        var vm = new Vue({
            el:'#app',
            data:data,
            created:function(){
                console.log('created', this.message);
            },
            mounted:function(){
                console.log('mounted', this.message);
            },
            updated:function(){
                console.log('updated', this.message);
            },
            destroyed:function(){
                console.log('destroyed', this.message);
            }
        });
    </script>
</body>
</html>

created钩子可用来在实例被创建后执行代码,其他钩子在实例生命周期不同阶段被调用,如mountedupdateddestroyed。生命周期钩子的this上下文指向调用它的Vue实例。

不要在选项属性或回调上使用箭头函数,比如created:()=>console.log(this.message)。因为箭头函数是和父级上下文绑定在一起的,this不会是如你所期待的Vue实例,经常导致Uncaught TypeError: Cannot read property of undefinedUncaught TypeError: this.method is not a function之类的错误。

Vue实例生命周期
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,738评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,377评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,774评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,032评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,015评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,239评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,724评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,374评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,410评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,457评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,132评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,733评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,804评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,022评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,515评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,116评论 2 341

推荐阅读更多精彩内容

  • 最近一直在忙,近期一个月更加会马不停蹄,根本无时间经营自己的小博客,有很多简友留言和评论要资料,我也没时间发,等我...
    范小饭_阅读 4,038评论 4 20
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,044评论 0 29
  • Vue 框架的入口就是 Vue 实例,其实就是框架中的 view model ,它包含页面中的业务 处理逻辑、数据...
    云中一樵夫阅读 1,074评论 0 1
  • 我再也不想离开你,哪怕面对千军万马。 超视距的战斗屏幕上满目疮痍,经过AL的渲染,仿佛还能感觉到一艘母舰被摧毁...
    云幼阅读 288评论 0 0
  • 你知道吗?在这个世界上,有一个人,在偷偷喜欢着你。不是因为你有多么美丽,也不是因为你有多么优秀。对你的喜欢,日久生...
    黄天浩阅读 334评论 0 0