2

上节回顾

昨天我把Vue.js学习中介绍篇大致看了一遍,当时其实没有上传成功,莫名其妙的草稿也保存失败了,变成了半张的残缺稿,然后到早上到公司随意点了一下还是没有成功,也没太在意,然后...然后莫名其妙就传上去了???

本篇目标

今天准备把Vue实例篇走一边
我知道我并不强大,但我想努力变强大。

创建一个Vue实例

一个 Vue 应用由一个通过 new Vue 创建的根 Vue 实例,以及可选的嵌套的、可复用的组件树组成。

好,我来重复一遍:一个Vue应用应该是一个new Vue根实例(树根)一堆乱七八糟的组件(树杈子)组成。

创建Vue实例的基础格式:连我都觉得太简单所以不写了

var data = {
    班级名称 : '狠一班',
    班级学生 :
    [
     {姓名 : '我老猛' , 性别 : '女'},
     {姓名 : '我老萌' , 性别 : '男'}   
    ],
    班主任 : '词穷'
}

var vm = new Vue({
    data : data
})

由此可见data应该就是一个属性的集合而且各种类型的属性一锅炖,嗯...,逗号分割。

至于下面说的修改数据值,还是实际试一下比较好。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
    <div id="app">
        {{message}}
        <br />
        <span v-bind:title="message">
            鼠标悬停几秒据说有看头?
        </span>
        <br />
        <p v-if="seen">Now you see me - 我伦</p>
        <ol>
            <li v-for="todo in todos">
                {{todo.text}}
            </li>
        </ol>
        <button v-on:click="reverseMessage">啥叫逆转消息???</button>
        <br />
        <input type="text" v-model="message" />
        <ol>
            <todo-item v-for="item in items"
                       v-bind:todo="item"
                       v-bind:key="item.id">
            </todo-item>
        </ol>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        Vue.component('todo-item', {
            props: ['todo'],
            template: '<li>{{todo.text}}</li>'
        })

        var data = {
            message: 'Hello Vue!' + new Date().toLocaleString(),
            seen: true,
            todos: [
                { text: '第一个' },
                { text: '第2个' },
                { text: '第三个' }
            ],
            items: [
                { id: 0, text: '青椒' },
                { id: 1, text: '茄子' },
                { id: 2, text: '西红柿' }
            ]
        }

        var app = new Vue({
            el: '#app',
            data: data,
            methods: {
                reverseMessage: function () {
                    this.message = this.message.split('').reverse().join('')
                }
            }
        })
    </script>
</body>
</html>

我伦做测试吧,F12 - Console - data.seen - app.seen=false - data.seen - data.seen=true - app.seen
可以看到结果,两个对象无论修改哪一个,都会影响另外一个,同时改变了页面上我伦的显示隐藏。

只有当实例被创建时data中存在的属性才是响应式

这里我现在还不知道怎么在运行时向data中追加属性对象,所以没有办法提供代码验证了...(短时间内没查出来)不过我记住这个点了。

Object.freeze()

var data = {
    msg : 'you have a new message.',
    num : 3,
    seen : true
}

Object.freeze(data)

var app = new Vue({
    el : '#app',
    data : data
})

字面意思 - 冻结 ,貌似无法单独冻结data下的指定属性,比如:Object.freeze(data.msg),虽然不抱错,但是还是可以改值的,所以只能以data为单位冻。

data冻结后的结果:F12 - app.msg = 'some other.'会报错,错误挺容易理解的,大概是这属性是只读的,然而我们还可以用data.msg = 'some other.',可以看到这里不会报错,不过当输入data.msg打印值时发现并没有修改其值。

Vue官方有提供一下内置实例属性与方法,他们都是$开头,不过都是通过Vue实例.出来的

Vue的生命周期

那图有些看不懂,先大致记一下生命周期的钩子的执行顺序吧:

从前到后依次是:

beforeCreate -> created -> beforeMount -> mounted -> beforeUpdate -> updated -> beforeDestroy -> destroyed
创建前 -> 创建后 -> 装载前 -> 装载后 -> 更新前 -> 更新后 -> 销毁前 -> 销毁后

小节

不知不觉又12点了,每天都感觉时间很少,总是不够用。
今天并没有些什么实质性的代码,几乎只是一些理论,而且并不多。
加油吧~


youbei
318 声望70 粉丝