一、双向绑定原理

  Vue2采用的是观察者-发布订阅模式,利用Object.defineProperty实现对数据已定义属性的监控(定义观察者模式),

  编译DOM时解析v-model等属性以及对input框等注册事件实现UI和JS的交互(也就是注册发布订阅这模式);

  详细的是主要是定义一个Observe类实现对象的监控,通过Compile方法来解析DOM中的指令和替换DOM,每当遇到一个v-、{{}}等属性

  则生成一个Watcher,同时将Watcher添加到Dep中,当有属性变化时则轮循Dep中所有的Watcher进行UI更新等操作

二、框架的优缺点

  优点:1. 轻量级、提供了响应式编程概念,组件化思想

     2. 采用虚拟DOM,渲染效率高

     3. 生态完整

  缺点:1. 由于页面内容都是基于JS,所以SEO方面不是很友好

三、虚拟DOM和Diff算法

  虚拟DOM:web项目中比较消耗性能的就包含DOM的重排、重绘以及不断的读取DOM,但是JS的计算性能要比DOM的好很多,所以基于这个原因,Vue通过

        生成虚拟DOM,记录DOM节点名称、类型、属性以及事件等各种属性,当数据有变化时,通过DIF算法对比新旧虚拟DOM,以最小的性能代价找到DOM变化点,

        然后只更新变化的DOM即可。

  Diff算法简述:1. 为了提升性能,Diff算法对比节点是只对比同一级节点,不做跨级对比

          2. 对比节点,如果节点类型不同,则替换节点、类型相同则替换属性或者文本、节点不存在则删除、节点新增则增加

          3. 如果存在子节点,设置头尾指针,从节点两端同时进行对比,同时移动指针下标值,如果endIndex>startIndex则终止循环

四、生命周期及其作用

  1. beforeCreate: 初始化Vue实例,同时初始化周期事件,但是并没有解析出$el以及没有绑定data

  2. created: 此时数据已经绑定,未解析出$el,但是$data已经绑定到vue中,这之后,beforeMount之前会判断是否含有el元素,

        没有则生命周期结束(当执行$mount(el)时,继续后续功能,因为此时已有$el),如果有则继续判断是否有template,

        有temp,则编译生成render函数,否则编译outerHtml,如果要在created阶段中进行dom操作,就要将操作都放在 Vue.nextTick() 的回调函数中

  3. beforeMount: 完成data和el数据初始化,但是页面中还是用vue占位符

  4. mounted: 载入后html已经渲染(ajax请求可以放在这个函数中),把vue实例中的data里的message挂载到BOM节点中去

  5. beforeUpdate: 重新渲染之前触发,然后vue的虚拟dom机制会重新构建虚拟dom与上一次的虚拟dom树利用diff算法进行对比之后重新渲染

  6. updated: 数据更新完成,dom也重新render完成

  7. beforeDestory: 销毁前执行($destroy方法被调用的时候就会执行),一般在这里善后:清除计时器、清除非指令绑定的事件等等…’)

  8. destoryed: 销毁后 (Dom元素存在,只是不再受vue控制),卸载watcher、事件监听、子组件等

五、组件间通信方式

  1. 父传子:采用v-model与props的方式进行通信,但是是单向的,子组件该值的改变并不会影响父组件;还可以采用Vuex

  2. 子传父:采用@emit事件由子组件向父组件冒泡数据或者采用$on的方式调用子组件的方式回调传递数据,同样也是单向的;还可以采用Vuex

  3. 兄弟组件:创建eventBus事件总线通讯,简单方便不受兄弟组件的层级关系限制;子1上报给父,父下发给子2,数据传递逻辑较乱,不能适用于多层级的兄弟关系;还可以采用Vuex

  4. 父子组件的值同步修改:父组件中绑定v-model:example,子组件设置emits: ['update:example'], 当子修改后,采用$emit('update:example')就可以将父组件的值同步改变

六、Vuex的使用

  组件之间经常会有数据之间相互通信,但是多层嵌套传值复杂度就会增加。因此vuex就是把常用的变量抽取出来组成一个全局单例模式进行管理,
  将共享的数据放到vuex,任何组件都可以使用,一旦数据修改,所有引用数据的组件的值都会同步修改,通过commit('***')进行修改,通过mapState把全局的state和getters映射到组件中,

  总共有五个属性:

  state: 存放一些状态(简单说就是变量),状态被修改后,所有引用的地方都会修改

  getters: 有时候需要从state中派生出一些状态,比如对状态根据某个条件进行过滤

  mutations:定义如何修改state中的状态,更新state值的唯一方法就是提交mutation,比如:store.commit('****')

  action:专门用来解决mutations只有同步无异步的问题,使用commit赋值

  modules:项目特别复杂的时候,可以让每一个模块拥有自己的state、mutation、action、getters,使得结构非常清晰,方便管理

七、路由的使用

  1. 全局路由:beforeEach、afterEach方法当导航触发时会被顺序执行,可以进行添加token以及做跳转拦截等

  2. 单个路由:beforeEnter

  3. 组件间路由:beforeRouteEnter beforeRouteUpdate  beforeRouteLeave

八、需要注意的知识点

  1. v-model和v-bind的差别:

    v-bind是单向绑定或者叫属性绑定,支持修改属性值,可简写为:attr
    v-model是双向绑定,可用在输入标签中
    v-bind和v-model同时使用时 model优先级更高

  2. 为什么数组的值变化了不能同步更新到UI:

    Vue2对数据的监听主要是通过defineProperty方法实现的,通过试验可以得知该方法可以监控已有属性的变化,但是Vue2依旧没有实现这个能力

    原因主要是考虑到性能问题:一个对象的属性个数一般是有限的,所以对属性进行监控消耗性能不大,但是数组可能会有成千上万,

    对每个属性监控性能消耗太大,付出和用户体验不成正比,故而没有实现

  3. computed和watch的使用和区别:  

    都是以vue的依赖追踪机制为基础,都是为了当某一个数据发生变化时,所有依赖这个数据的数据发生变化
    watch: 一个数据影响多个数据
    computed:一个数据受多个数据影响,支持set、get方法(默认是get),有缓存效果

Vue2知识点简要的更多相关文章

  1. Maven知识点简要

      1.依赖管理 <dependencies> <dependency> <groupId>net.sf.json-lib</groupId> < ...

  2. HTML+CSS基础知识点简要汇总(思维导图)

  3. 易混乱javascript知识点简要记录

    一.== vs === ==在做判断时,如果对比双方的类型不一样的话,就会进行类型转换 假如我们需要对比 x 和 y 是否相同,就会进行如下判断流程: 首先会判断两者类型是否相同.相同的话就是比大小了 ...

  4. Spring总结 1.装配bean

    本随笔内容要点如下: 依赖注入 Spring装配bean的方式 条件化装配 一.依赖注入 我理解的依赖注入是这样的:所谓的依赖,就是对象所依赖的其他对象.Spring提供了一个bean容器,它负责创建 ...

  5. Python与Golang协程异同

    背景知识 这里先给出一些常用的知识点简要说明,以便理解后面的文章内容. 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定 ...

  6. 高软期末考试 B2C模式

    一.软件工程知识点 简要总结 1.软件基础知识 瀑布模型: 我感觉整个<软件工程>书的布局就是按照瀑布模型来的,上面右图少个运维. 2.UML图 2.1 用例图 UseCase Diagr ...

  7. linux-gcc简要知识点 **

    目录 交叉编译 简要知识点 ** 一些概念 GCC编译器 GCC简要使用 GCC编译过程 ** 常用的编译选项 编译多个文件 制作.使用动态库 制作.使用静态库 很有用的选项 参考 交叉编译 使用不同 ...

  8. java之集合类框架的简要知识点:泛型的类型擦除

    这里想说一下在集合框架前需要理解的小知识点,也是个人的肤浅理解,不知道理解的正不正确,请大家多多指教.这里必须谈一下java的泛型,因为它们联系紧密,我们先看一下这几行代码: Class c1 = n ...

  9. 前端 高级 (二十五)vue2.0项目实战一 配置简要说明、代码简要说明、Import/Export、轮播和列表例子

    一.启动服务自动打开浏览器运行 二.配置简要说明 1.node_modules 安装好的依赖文件,中间件等,所在位置 2.package.jason 配置当前项目要安装的中间件和依赖文件 { &quo ...

  10. vue2.0:(八)、外卖App弹窗部分知识点总结

    本篇文章是对外卖App弹窗部分知识点的总结. 知识点一:如何从接口取出不同的图片. 答: 1.header.vue: 代码: <ul v-if="seller.supports&quo ...

随机推荐

  1. 吉特日化MES配料工艺参数标准版-第二版

    作者:情缘 出处:http://www.cnblogs.com/qingyuan/ 关于作者:从事仓库,生产软件方面的开发,在项目管理以及企业经营方面寻求发展之路 版权声明:本文版权归作者和博客园共有 ...

  2. stackoverflow怎么解决

    stackoverflow怎么解决 栈溢出的可能原因: 函数递归调用层次过深 ,每调用一次,函数的参数.局部变量等信息就压一次栈,并且没有及时出栈. 局部变量体积太大 分析:每一个 JVM 线程都拥有 ...

  3. 聊一聊 C# 的线程本地存储TLS到底是什么

    一:背景 1. 讲故事 有朋友在后台留言让我说一下C#的 ThreadStatic 线程本地存储是怎么玩的?这么说吧,C#的ThreadStatic是假的,因为C#完全是由CLR(C++)承载的,言外 ...

  4. MySQL运维实战(1.1)安装部署:使用RPM进行安装部署

    作者:俊达 我们在生产环境部署mysql时,一般很少使用RedHat Package Manager(RedHat软件包管理工具).用rpm或或者其他包管理器安装mysql有其好处,例如安装简单,并且 ...

  5. Pikachu漏洞靶场 敏感信息泄露

    敏感信息泄露 概述 由于后台人员的疏忽或者不当的设计,导致不应该被前端用户看到的数据被轻易的访问到. 比如: 通过访问url下的目录,可以直接列出目录下的文件列表; 输入错误的url参数后报错信息里面 ...

  6. PHP中的反序列化漏洞理解

    序列化serialize() 序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象: class S{ public $test="pikachu"; } $s=n ...

  7. libGDX游戏开发之打包游戏(十二)

    libGDX游戏开发之打包游戏(十二) libGDX系列,游戏开发有unity3D巴拉巴拉的,为啥还用java开发?因为我是Java程序员emm-国内用libgdx比较少,多数情况需要去官网和goog ...

  8. Angular 实现分页器组件

    很感谢 angular实现简单的pagination分页组件 - Amor丶Diamond - 博客园 (cnblogs.com) , 我根据这位博主代码做了修改, 增加了跳转和每页行数功能. 先看图 ...

  9. 文心一言 VS 讯飞星火 VS chatgpt (49)-- 算法导论6.2 1题

    一.参照图6-2的方法,说明 MAX-HEAPIFY(A,3)在数组 A=(27,17,3,16,13,10,1,5,7,12,4,8,9,0)上的操作过程. 文心一言: 下面是 MAX-HEAPIF ...

  10. LeetCode141环形链表I、II

    141. 环形链表 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. ...