今天的内容书接上回,同样是vue的核心基础部分,今天偏向于理论性,特别是vue对于数据对象的监测那一块,刚开始琢磨了半天,这股劲一过,现在好理解多了

10.watch和computed对比

计算属性案例(watch来做)

在增加一条需求输入姓后要反应一秒后再响应

computed

区别 :

  • computed能完成的功能,watch都可以完成
  • watch可以完成的功能,computed不一定能完成,就比如watch这里可以异步操作,computed就不行,因为computed里面我们靠的就是那个返回值让他的getter返回值就会等于fullname这个计算属性,所以如果返回值给了定时器,那么我的fullname就没有得到返回值,但是watch不一样,watch是对值做操作,在定时器里面就已经完成了赋值的操作,不需要你返回给我

注意 :

  • 前面都说被vue所管理的函数最好别写箭头函数,但是这里的定时器必须写为箭头函数,因为如果是普通函数那么他的this就为window,定时器的this本身就是为window,但是如果这里是箭头函数,都知道,箭头函数的this是定义它位置的地方的this,所以就是监视这个属性里面的this就是vm实例
  • 被vue所管理的函数最好写成普通函数,不被vue所管理的函数(定时器、ajax回调、promise的回调)最好写成箭头函数

11.绑定class样式

  • 字符串写法,适用于:样式类名不确定,需要动态指定

    注意一下这里的生成随机整数是怎么的写法

  • 数组写法:适用于:个数不确定,类名也不确定的时候,个数我以后 可能有一百个可能有几个,名字可能叫这个可能叫那个

  • 对象写法:适用于个数确定,类名也确定,我只有这两个,也只叫这个名字

  • 绑定style样式(了解)这是对象写法,同样也有数组写法,就是fontsize写在这个对象,background写在那个对象,数组写法就是将两个对象结合起来【obj1,obj2】

12.条件渲染

控制元素的隐藏显示

全新指令语法:v-show、v-if他们两个都可以实现显示隐藏,v-show底层实现是display:none,v-if直接把元素都删没了,所以当我们需要频繁切换显示隐藏的时候建议v-show

案例:

v-else-if跟v-if是一组的判断,如果前面达成条件后面就不再做判断

v-else 注意v-else后面就不跟条件了直接写上v-else,出了条件外的都显示他

注意v-if判断是一个整体,包括else if、else,中间不能写其他的来打断

v-if与template配合使用

我要完成这么一个界面当点击达到1的时候显示出来

这种做法是不是有点冗余,每个都要去判断一下,所以就有一个标签template,只能配合v-if使用,它最大的好处就是不会影响页面标签布局

13.列表渲染

全新指令语法v-for

  • 遍历数组

首先用了v-for我们有多少数据,就自动会遍历出多少li,然后v-for每个li是必须配置一个:key的动态属性的,我们的遍历可以写多个参数,写多少个的时候前面表示这个对象,后面表示这个对象在数组里面的索引号,而我们的key就可以配置为p.id或者是index这个索引号

  • 遍历对象

    遍历对象要注意,遍历的值和我们的数据是反的,前面是我们的数据,后面变成了值,而且遍历对象,key就为这个属性名,

    v-for除了可以用in 用 of也是一样的效果

  • 遍历字符串

    字符串就是可以把每一个字符遍历出来,前面是值,后面是下标

  • 遍历指定次数(不常用)

13.1 key作用与原理(面试)

首先要知道我们动态生成的key并不是拿在页面上来呈现的,可以看到最终生成的真实DOM是没有这个属性的,它是用来vue拿来用的

当我们用index作为key的值会出现的问题:

有一个需求当我们点击按钮会在上面新增条数据老六

是不是就出现问题了,分析一下下面这个图就知道问题在哪了

这个就是我们前面所说的vue的一大优点,虚拟DOM加Diff算法,就在这里体现了。首先我们初始化的数据,打开网页vue会先在内存生成虚拟DOM,同时key是我们的index,然后正常将虚拟DOM转为真实DOM,转到页面上来了,我们正常在input框输入内容,这个时候我们去点击新增老六这个按钮,相当于让数据变成了我们的新数据样式,然后又会在内存生成虚拟DOM,这个时候由于是第二次生成了,所以Diff算法就来了,vue会拿我们新的虚拟dom和旧的虚拟dom进行比较,而比较的依据就是key,当我们比较第一条数据的时候,key对上了之后,先去比较文本发现文本不一样,那么就不能复用,就会以新的虚拟dom为准,接着回去比较input标签,注意这个时候比较input标签会发现是一样的,为什么,因为都是input标签,都是text格式,我们在里面输入的内容实在真实dom输入的跟虚拟dom没有关系,所以比较出来是一样的,既然一样我就可以去key=0,以前已经生成过真实dom了吧,那我就直接去拿来复用了,所以最终形成的结果就是,新增的文本就上我们旧的input,以此类推,所以就导致了我们最终呈现的效果有问题

这是用index作为key的问题一,还有一个问题就是效率变低了,为什么,因为我们原来本来可以复用的数据,他给我重新生成了真实dom肯定效率低了

当我们用id作为key时

首先比较key=004发现没有,没有那就直接新增,后面的都发现有,而且数据也对的上那就直接复用

开发中如何选择key

  • 最好是用每条数据的唯一标识(id、手机号、身份证号、学号等)
  • 如果不存在对数据的逆序添加、逆序删除等破坏顺序的操作,或者渲染列表仅用于展示(没有新增删除),使用index作为key还是没问题的,顺序添加删除使用它还是可以的

13.2 列表过滤

也就是模糊搜索,先完成能过滤的功能(注意数组和字符串的方法)

这么做的话就会损坏原数据,我们的原数据是不能动的,因为要确保,不搜索了还能回去

定义一个新数组,让新数组去接收搜索出来的值,同时原数组也没有改动所以可以一直搜索,不会像原来一样越搜数据越少的情况,同时要把遍历的v-for修改为新数组,但是现在就有一个问题新数组为空,那我们刚开始的时候就看不到列表了

这里有一个很重要的概念,字符串的indexOf方法对于空字符串的查找是找得到的,意思就是任何字符串.indexOf('')都不会返回-1,都是有值的

所以只需要开启初始化就监视一下即可,这个时候keyword为空字符串,那么数据里面的每条数据都有空字符串,那就会把全部数据输出出来

计算属性实现

计算属性能实现的,watch肯定能实现,watch能实现的只要不涉及到异步任务,计算属性一般也能实现

就这一段代码即可实现,为什么直接就能渲染,以为watch默认是要先搜索再去执行handler,这里一来就会执行,一来就是空字符串,为什么不用自定义一个新的数组,因为计算属性就相当于一个新的数组了

13.3 列表排序

关键点在于利用计算属性里面的任何一个依赖数据发生变动都会重新运算计算节点

  • 数组排序参数是谁
  • 排序和过滤是密不可分的,我还需要在过滤出来的基础上排序,不是一点排序就回到了原数据列表
  • 之所以点击原顺序可以回去,关键点就在于计算属性里面每一个依赖数据发生变动,都会重新计算重新渲染,所以一点击原顺序sortType就变动了,重新根据关键字去过滤数组,得出来的满足不了排序的if就直接输出arr了

13.4 vue监测数据改变的原理

先看到一个数据更新时的问题

点击后没反应,vue管理工具也没有数据更新

13.4.1 vue对象监测原理

先看一张图,这里有点绕,有点难以理解,我在那里捋了四五十分钟接近一个小时,vue的一个对象检测原理就是,我们说过我们的data数据最终会呈现在vm实例的_data上,vue对于对象数据的检测就是定义了一个构造函数,这个构造函数会把我们的数据的属性名全部拿过来然后做一个遍历,在遍历里面,是最重要的逻辑,用对象定义属性的方法,**对象为this,这里的this指的就是这个构造函数的实例,同时给他上面定义属性,当访问到这个构造函数实例的这个属性的时候就把obj对应的属性的值给到他(也就是data上面对应的值),其实这里就是做了一个数据代理,我们读取和写入虽然是在这个实例上面我就说_data上面吧,插值语法之所以能够直接写name是因为后面又给vm做了一个数据代理,其实vue的读写都是基于这个_data的,读通过_data来读,修改虽然是修改的_data但是会把val给到data数据本身。总结就是:vue对于对象数据的监测就是通过一个构造函数,目的是加工data来给_data赋值,真正的逻辑在于里面的defineProperty这个方法,真正的监测原理就是通过这里面的getter和setter来读和写我们的data,然后再setter作进一步的逻辑,既然是setter那就是值变化了,就回去重新解析模板,diff比较虚拟DOM看哪些能复用,再把我们修改的值渲染上去 **

一句话总结:vue监测原理就靠这个setter

13.4.2 vue.set()的使用

这个案例首先要注意一点,在vue里面如果值为undefined,并不会报错,只是没有文字显示出来而已,这里的age没有赋值,所以undefined,在页面上并不会报错,只是一片空白没有数据

一个需求,我如果想通过将它直接赋值让页面出现他的性别:

可以看到页面并没有显示,而且我们的数据也有,但是是写死的并不是响应式的,我们之前研究过vue的监测原理靠的就是那个setter,这里没有给她做setter所以自然也不会映射到页面上来

  • Vue.set()vue提供的的api,可以让我们在后面添加的数据,也能够完成响应式数据,也有属于自己的getter和setter

    三个参数:第一个参数往哪里添加这个属性,第二个参数属性名,第三个参数值

  • 第二种写法:vm.$set(参数跟上面一样三个)

  • 局限性

    该方法不能直接给data和vm添加属性

13.4.3 vue数组监测原理

vue里面不能直接以数组索引去修改值

可以看到我们数组的值都变了,但是vue监测不到,所以页面不会变,不能直接通过数组索引去修改值

在vue里面数组能被监测到的只能是可以修改数组本身的七种方法

所以现在就可以对我们13.4那里的案例做出回应了

问题:为什么vue知道我们使用了这些方法

因为vue对这些方法做出了包装,不是Array原来的那七个方法了,实现逻辑肯定还是原来那种只是添加了一些逻辑(方法完成后会去重新解析模板,重新diff虚拟DOM)

让数组被监测到方法二:

Vue.set这个api也可以

13.4.4 总结vue数据监测

看下总结案例(如何实现性别在未添加之前为隐藏、修改数组里面的对象不需要数组的方法)

  • vue会监视data中所有层次的数据

  • 对象中通过setter实现监视,且要在定义data时就传入数据,如果是在之后添加的数据,需要Vue.set或者是vm.$set来实现监视

  • 数组中的数据通过包裹数组的七种方法实现

  • vue数组中修改元素大多数要通过七种方法或者set两个api

    七种方法为变更方法,但是也有非变更方法如(filter、concat、slice这些会返回新数组的方法,可以让返回的新数组替换掉旧数组,同样可以受到监视,页面同样会被更改)

  • 最后注意一下set两个api不能给vm和data跟数据对象添加属性

  • 数据劫持:就是前面说的对象监测原理,把一个完好的data数据变成了setter的方式,我如果要修改student的值,瞬间就被setter劫持到了,去做了其他解析模板等操作,这就叫数据劫持

vue - vue基础/vue核心内容(2)的更多相关文章

  1. vue - vue基础/vue核心内容

    终于算是顺利进入vue了,确实也只有学了过后才知道,之前三过vue而不学,确实是对的,现在进来了一点都不后悔,ajax.node.js.promise.webpack.git等等确实是除了三大基础外还 ...

  2. vue - vue基础/vue核心内容(终结篇)

    今天是vue基础.vue核心内容第三天,也是最后一天,后面开始进入组件化学习,整个基础内容以生命周期的结束而结束,不得不说,张天禹把这节课讲活了,开始觉得vue是一个有生命的东西,包括前面所说的很多脏 ...

  3. Vue学习记录第一篇——Vue入门基础

    前面的话 Vue中文文档写得很好,界面清爽,内容翔实.但文档毕竟不是教程,文档一上来出现了大量的新概念,对于新手而言,并不友好.个人还是比较喜欢类似于<JS高级程序设计>的风格,从浅入深, ...

  4. Vue入门基础

    前面的话 Vue中文文档写得很好,界面清爽,内容翔实.但文档毕竟不是教程,文档一上来出现了大量的新概念,对于新手而言,并不友好.个人还是比较喜欢类似于<JS高级程序设计>的风格,从浅入深, ...

  5. Vue入门基础(火柴)

    前言 由于个人十分欣赏博友——小火柴的蓝色理想,他的博文我看了大多数,觉得十分的精彩,然而很多都是看后即忘.我想除了没有经常动手敲代码,更可能是在看的时候忽略了很多细节,因此打算把他的博文通通给“抄袭 ...

  6. 前端(五)-Vue简单基础

    1. Vue概述 Vue (读音/vju/, 类似于view)是一套用于构建用户界面的渐进式框架,发布于2014年2月. 与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用. Vue的核心库只 ...

  7. 一份不错的vue.js基础笔记!!!!

    第一章 Vue.js是什么? Vue(法语)同view(英语) Vue.js是一套构建用户界面(view)的MVVM框架.Vue.js的核心库只关注视图层,并且非常容易学习,非常容易与其他库或已有的项 ...

  8. Vue组件基础用法

    前面的话 组件(Component)是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.根据项目需求,抽象出一些组件,每个组件里包含了展现.功能和样式.每个页面,根据自己所需, ...

  9. 前端工程化基础-vue

    由浅入深支持更多功能 1.安装最新版本的node.js和NPM,并了解NPM基本用法. 2.创建一个目录demo.使用npm 初始化配置: npm init  ,执行后会有一系列选项,可按回车快速确认 ...

  10. vue的基础知识

    Vue.js是什么? Vue(法语)同view(英语) Vue.js是一套构建用户界面(view)的MVVM框架.Vue.js的核心库只关注视图层,并且非常容易学习,非常容易与其他库或已有的项目整合. ...

随机推荐

  1. 数据库MySql的学习(1)--基本操作

    转自 博客园-hoojo-http://www.cnblogs.com/hoojo/archive/2011/06/20/2085390.html 一.数据库简单介绍 1. 按照数据库的发展时间顺序, ...

  2. 模糊查询 like 语句该怎么写?

    第 1 种:在 Java 代码中添加 sql 通配符. string wildcardname = "%smi%"; list<name> names = mapper ...

  3. JDBC 能否处理 Blob 和 Clob?

    Blob 是指二进制大对象(Binary Large Object),而 Clob 是指大字符对象 (Character Large Objec),因此其中 Blob 是为存储大的二进制数据而设计的, ...

  4. windows服务器下frp实现内网穿透

    一.操作步骤 1.服务器:首先在服务器上解压到相应目录并配置frps.ini文件如下: 2.服务器:按下windows+R输入cmd进入命令窗口,进入到安装目录下运行frps.exe -c frps. ...

  5. 什么是多线程环境下的伪共享(false sharing)?

    伪共享是多线程系统(每个处理器有自己的局部缓存)中一个众所周知的性能问 题.伪共享发生在不同处理器的上的线程对变量的修改依赖于相同的缓存行,如 下图所示: 伪共享问题很难被发现,因为线程可能访问完全不 ...

  6. RabbitMQ踩坑记

    之前我们给我们的系统加了一个使用SpringAOP+RabbitMQ+WebSocket进行实时消息通知功能(https://www.cnblogs.com/little-sheep/p/993488 ...

  7. 学习MFS(三)

    1.MooseFS是什么 一个类MooseFS是一个具备冗余容错功能的分布式网络文件系统,它将数据分别存放在多个物理服务器或单独磁盘或分区上,确保一份数据有多个备份副本,然而对于访问MFS的客户端或者 ...

  8. 2018 百度web前端面试

    面试前 正式入职一年半左右,实习半年,勉强两年经验吧,然后很惊喜收到了百度的面试邀约,约得两点钟面试,然后本人一点钟就到了,通电话之后,面试官很热情,说正在吃饭吃完饭就去找我,让我去坐着等一会,然后一 ...

  9. web音频流转发之AudioNode

    前言 上一章地址: web音频流转发之音频源下一张地址:web音频流转发之音视频直播在这一章我说几个我们需要用到的音频处理模块也就3个吧,包括我们转发流是需要用到的核心模块.更多模块请看MDN,或者看 ...

  10. 认识 Function.prototype.bind()

    欢迎前端爱好者加入QQ群:112916679 答疑解惑,且可获取更多前端资料! bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个 ...