Vue 成长之路(一)

算法织梦
• 阅读 2092

一、什么是 Vue ?

  首先,Vue 是一个 MVVM 框架,M -- 模型,就是用来定义驱动的数据,V -- 视图,是经过数据改变后的 html,VM -- 框架视图,就是用来实现双向绑定的中间桥梁。Vue.js 是采用数据劫持结合发布者-订阅者模式的方法,通过 Object.definePropety() 来劫持各个属性的 setter、getter,在数据变动时发布消息给订阅者,触发相应的监听回调。

二、Vue 的生命周期

创建前:beforeCreate
创建后:created
载入前:beforeMounte
载入后:mounted
更新前:beforeUpdate
更新后:updated
销毁前:beforeDestory
销毁后:destroyed

三、Vue 双向数据绑定原理

  1. 对需要 Observer 的数据对象进行递归遍历,包括子属性对象的属性,都加上 setter 和
    getter。这样的话,给这个对象的某个值赋值,就会触发 setter,那么就能监听到数据变化。

    说明:

     * Observer 的数据对象:写在 data() 里面用 return 包裹的数据。
     * data() 里面的数据使用 return 包裹,因为使用 return 包裹后数据中变量只在当前的组建生效,不会影响其他组件;不使用 return包裹的数据会在项目的全局可见,会造成全局污染。
     * 如果 data 中的数据为对象,则使用 walk 遍历 data 上每个 key,对每个 key 调用 defineRective 来获取该 key 的 set/get 控制权。[defineRective: 设置对象的 key 属性,由watcher 的实例对象进行 get 操作,此时 watcher 的实例对象将被自动添加到 Dep 实例的依赖数组中。在外部操作出发set 时,将通过 Dep 实例的 notify 来通知所有依赖的 watcher 进行更新。]
     * 如果 data 中的数据是数组,就使用 ObserverArray 遍历 data,对 data 中的每一个元素调用 Observer 分别进行观察。
     
  2. compile 解析模板指令,将模板中的变量替换成数据,然后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者一旦数据有变动,收到通知,更新视图。
    Vue 成长之路(一)
  3. Watcher订阅者是Observer和Compile之间通信的桥梁,主要做的事情是:

    • 在自身实例化时往属性订阅器(dep)里面添加自己
    • 自身必须有一个update()方法
    • 待属性变动dep.notice()通知时,能调用自身的update()方法,并触发Compile中绑定的回调,则功成身退。
  4. MVVM作为数据绑定的入口,整合Observer、Compile和Watcher三者,通过Observer来监听自己的model数据变化,通过Compile来解析编译模板指令,最终利用Watcher搭起Observer和Compile之间的通信桥梁,达到数据变化
    -> 视图更新;视图交互变化(input) -> 数据model变更的双向绑定效果

四、Vue 初始化工作

1.初始化各方法执行顺序

initLifeCycle(vm) -> initEvents(vm) -> callHook(vm, 'beforeCreated') -> initProps(vm) -> initMethods(vm) -> initData(vm) -> initComputed(vm) -> initWatch(vm) -> callHook(vm, 'created') -> initRender(vm)

2.vue生成实例的过程

  • new Vue,执行初始化
  • 挂载 $mount 方法,通过自定义 Render,template,el 等生成 Render 函数
  • 通过 watcher 监听数据变化
  • 当数据发生变化,执行 Render 函数,返回 VNode 对象
  • 通过 patch 方法,对比新旧 VNode 对象, 通过 DOM Diff 算法,增加、修改、删除真正的 DOM 元素。

五、Vue 自定义指令

1.格式

全局:
    Vue.directive('directiveName', {
        inserted: function(el) {
            ...
        },
        ...
    })
    
局部:
    directives: {
        inserted: function(el) {
            ...
        }, 
        ...
    }

2.自定义指令对象的钩子函数(均为可选)

  • bind: 指令第一次绑定到元素是调用,只调用一次
  • inserted: 被绑定元素插入父节点时调用(仅保证父节点存在,但不一定已被插入文档中)
  • update: 所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前,指令的值可能发生了改变,也可能没有
  • componentUpdated: 指令所在组件的 VNode 及其子 VNode 全部更新后调用
  • unbind: 指令与元素解绑时调用,只调用一次

3.钩子函数的参数

  • el: 指令所绑定的元素,可以用来直接操作 DOM
  • binding: 一个对象,包含以下属性

       * name - 指令名,不含前缀 v-
       * value - 指令的绑定值
       * oldValue - 指令绑定的前一个值
       * expression - 字符串形式的指令表达式
       * arg - 传给指令的参数
       * modifiers - 一个包含修饰符的对象
  • VNode: 虚拟节点
  • oldVnode: 上一个虚拟节点

六、Vue 响应数据变化的几种方法
1.methods: 每次获取都会重新计算求值
2.computed(计算属性,有缓存): 基于数据依赖进行缓存,只有当数据变化时,才会重新求值。(计算属性只有 getter,可以在需要的时候自己设定 setter)。computed 擅长处理的情景:一个数据受多个数据影响。
3.watch: 当需要在数据变化时执行异步操作或者消耗较大的操作时,比较有效。watch 擅长处理的情景:一个数据影响多个数据。
4.v-model: 基于数据双向绑定(对于 v-for 循环列表中的项,需要使用键值)

eg(4):
   <div v-for="(item, index) in list" :key="index">
       <input v-model="list[index]" />
   </div>




点赞
收藏
评论区
推荐文章
02-Vue入门之数据绑定
02Vue入门之数据绑定02Vue入门之数据绑定2.1.什么是双向绑定?Vue框架很核心的功能就是双向的数据绑定。双向是指:HTML标签数据绑定到Vue对象,另外反方向数
九旬 九旬
4年前
前端培训-Vue专题之Vue基础
简介特点:MVVM框架,双向绑定,数据驱动,单页面,组件化。区别Vue和jQuery的区别:不直接操作DOM,而是操作数据。案例:HelloWorld你好,世界HTML代码:xml<h1msg</h1jQuery实现javascript$("h1").text("你好,世界");Vue实现javascriptthis.msg'你好,世界'
Easter79 Easter79
3年前
Vue 入门
Vue.js是构建用户界面的MVVM框架 ,只关注视图层Vue将DOM和数据绑定起来,一旦创建了绑定,DOM将和数据保持同步,每当变更了数据,DOM也会相应地更新。这样就减少了不必要的DOM操作提高渲染效率,让前端程序员只需要关心业务逻辑不再关心DOM是如何渲染的MVC和MVVM的区别:MVC是后端分层开发概念,MVVM是前端视图层
劳伦斯 劳伦斯
4年前
前端面试题自检 Vue 网络 浏览器 性能优化部分
框架VueMVVM是什么?ModelViewViewModel,Model表示数据模型层。view表示视图层,ViewModel是View和Model层的桥梁,数据绑定到viewModel层并自动渲染到页面中,视图变化通知viewModel层更新数据。Vue的生命周期
Python进阶者 Python进阶者
4年前
Vue的学习笔记(上篇)
一、什么是Vue.js?Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue也完全能够为复杂的单页应用提供驱动。二、什么是vmodel指令?vmode
Anthony555 Anthony555
4年前
前端面试系列——Vue面试题
Vue双向绑定原理mvvm双向绑定,采用数据劫持结合发布者订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter、getter,在数据变动时发布消息给订阅者,触发相应的监听回调。双
可莉 可莉
3年前
10+个很酷的VueJS组件,模板和实验示例
众所周知,Vue.js组件是Vue创建自定义元素的重要功能之一,同时,模板可帮助你避免从头开始创建网页设计。总之,这些工具对于希望其开发过程更快,更高效的任何Web开发人员都是必不可少的。此外,在过去的几年中,Vue.js变得非常流行,许多企业将其添加到他们的技术栈中。该框架的优点是它具有内置的数据绑定和MVC模型(模型、视图、控制器),
Easter79 Easter79
3年前
SwiftUI 跨组件数据传递
作者:Cyandev,iOS和MacOS开发者,目前就职于字节跳动0x00前言众所周知,SwiftUI的开发模式与React、Flutter非常相似,即都是声明式UI,由数据驱动(产生)视图,视图也会与数据自动保持同步,框架层会帮你处理“绑定”的问题。在声明式UI中不存在命令式地让一个视图变成xxx
Wesley13 Wesley13
3年前
unity工程师面试知识点之MVC架构+观察者模式
所谓设计模式通俗点理解就是解决固定问题的套路。而说起观察者模式又不得不提起客户端框架设计中最常用的实现逻辑:MVC架构观察者模式。MVC架构中的M、V、C分别是model、view、control的缩写。model:模型,处理数据逻辑部分view:界面,处理数据显示部分control:控制器,模型和界面的沟通桥梁,负责从视图读取数据,控制用