ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

vue学习总结(二)

2021-07-04 21:32:28  阅读:123  来源: 互联网

标签:总结 vue 对象 vm Vue 学习 实例 data 属性


可以挑粗体的字看

vue实例

每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的:

var vm = new Vue({
  // 选项
})

一般Vue应用都是只有一个Vue实例的,当创建一个 Vue 实例时需要传入一个选项对象(这个对象的一些属性后面会说,当然你也可以去看官方的API文档

官方:
一个 Vue 应用由一个通过 new Vue 创建的根 Vue 实例,以及可选的嵌套的、可复用的组件树组成。举个例子,一个 todo 应用的组件树可以是这样的:
根实例
在这里插入图片描述
组件树的概念在总结(一)有提及,这里的意思就是一个Vue应用中所有的组件都是在实例的范围内的,Vue实例的范围可以用选项对象中的el属性指定,类型是字符类型,类似这样’#app’,指定范围为id='app’的元素内

官方:我们会在稍后的组件系统章节具体展开。不过现在,你只需要明白所有的 Vue 组件都是 Vue 实例,并且接受相同的选项对象 (一些根实例特有的选项除外)。
这里的意思就是Vue组件也是Vue实例,创建Vue组件也要传入选项对象,它和Vue实例的选项对象大致相同。

Vue实例上的一些属性

官方:
当一个 Vue 实例被创建时,它将 data 对象中的所有的 property 加入到 Vue 的响应式系统中。当这些 property 的值发生改变时,视图将会产生“响应”,即匹配更新为新的值。

// 我们的数据对象
var data = { a: 1 }

// 该对象被加入到一个 Vue 实例中
var vm = new Vue({
  data: data
})

// 获得这个实例上的 property
// 返回源数据中对应的字段
vm.a == data.a // => true

// 设置 property 也会影响到原始数据
vm.a = 2
data.a // => 2

// ……反之亦然
data.a = 3
vm.a // => 3

上面这块可能有些人会有疑惑,比如我,首先Vue实例中为啥会有data中的属性,其次是如何实现data的属性和vm对应的属性是绑定的。

第一种猜想应该是Vue构造函数中遍历了选项对象中的data对象中的属性并赋值给了Vue实例,编写代码验证一下。

    function Vue(obj) {
        for(let key in obj.data) {
            this[key] = obj.data[key];
        }
    }
 	let data = { a: 1 }
    let vm = new Vue({
        data: data
    });
    console.log(vm.a == data.a)
    vm.a = 2
    console.log(data.a);
    data.a = 3
    console.log(vm.a);

运行结果
在这里插入图片描述
发现修改vm中与data对象对应的属性并没有改变data中的属性,反之也没有改变,所以这个猜想是错的。
猜想二:把data对象赋值给vm实例,我们知道赋值如果是一个对象的话,是复制对象的地址,其实是同一个对象。这样就能实现data的属性和vm属性是绑定的,但vm实例对象除了有data中的属性还有其他别的属性和data对象并非是同一个对象,所以这个猜想也是错的。
之后如果我弄懂了我会写一篇文章告诉大家。

回归正题上面这么多其实就是选项对象中的data对象中的属性,Vue实例也有且他们是绑定的。
在这里插入图片描述

官方:
当这些数据改变时,视图会进行重渲染。值得注意的是只有当实例被创建时就已经存在于 data 中的 property 才是响应式的。也就是说如果你添加一个新的 property,比如:

vm.b = 'hi'

那么对 b 的改动将不会触发任何视图的更新。如果你知道你会在晚些时候需要一个 property,但是一开始它为空或不存在,那么你仅需要设置一些初始值。比如:

data: {
  newTodoText: '',
  visitCount: 0,
  hideCompletedTodos: false,
  todos: [],
  error: null
}

上面说的就是选项对象中的data属性改变,视图会重新渲染,只有创建Vue实例时传入的data对象才是响应式的,创建完之后再往data对象添加属性就不是响应式的了,所以如果将来有数据要加入,要提前在创建Vue实例时在data设置字段,并以一个初始值定义。需要注意是使用 Object.freeze(),这会阻止修改现有的 property如果你这样:

let data= {
  foo: 'bar'
}

Object.freeze(data)
data.foo = 'zds'//修改了data中的属性

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

运行结果:
在这里插入图片描述

这样会使得data对象的属性不在是响应式的了,即你修改data中的值视图也不会重新渲染了。

Vue实例除了有data对象中的属性,还有一些以 $开头的属性,以便与用户定义的 property 区分开来,这些属性对应选项对象(除个别属性,比如el)中的属性,比如说:

var data = { a: 1 }
var vm = new Vue({
  el: '#example',
  data: data
})

vm.$data === data // => true
vm.$el === document.getElementById('example') // => true

// $watch 是一个实例方法
vm.$watch('a', function (newValue, oldValue) {
  // 这个回调将在 `vm.a` 改变后调用
})

实例生命周期钩子

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

比如 created 钩子可以用来在一个实例被创建之后执行代码,生命周期钩子的 this 上下文指向调用它的 Vue 实例

new Vue({
  data: {
    a: 1
  },
  created: function () {
    // `this` 指向 vm 实例
    console.log('a is: ' + this.a)
  }
})
// => "a is: 1"

注意:不要在选项 property 或回调上使用箭头函数,比如 created: () => console.log(this.a) 或 vm.$watch(‘a’, newValue => this.myMethod())。因为箭头函数并没有 this,this 会作为变量一直向上级词法作用域查找,直至找到为止,经常导致 Uncaught TypeError: Cannot read property of undefined 或 Uncaught TypeError: this.myMethod is not a function 之类的错误。

生命周期图示
建议看这篇文章
在这里插入图片描述

标签:总结,vue,对象,vm,Vue,学习,实例,data,属性
来源: https://blog.csdn.net/zdshhh/article/details/118459638

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有