vue监听hash_vue 原理

1、如何理解 MVVM

很久以前就有组件化(ASP JSP PHP 已经有组件化了、nodejs 中也有类似的组件化):传统组件,只是静态渲染,更新还依赖操作dom;

数据驱动视图(MVVM,setState):vue MVVM (model-view-viewmodel)、react setState

25a95e230a0ceffa10a840c73bb33b0e.png

2、vue 响应式

组件 data 的数据一旦变化,立刻触发视图更新

实现数据驱动视图的第一步

核心API:Object.defineProperty

(vue 3.0 使用 proxy,proxy有兼容性问题,且无法polyfill )

Object.defineProperty 实现响应式: 监听对象,监听数组

27e43d315eeac90eb0609d2bf1bca50b.png

Object.defineProperty 的缺点:

深度监听,需要递归到底,一次性计算量大

无法监听新增属性/删除属性(Vue.set Vue.delete)

无法原生监听数组,需要特殊处理

3、vue 如何监听数组变化

dc78e99674a098518bdf73d77e3d6fa1.png

4、虚拟dom (vdom)

dom操作非常耗费性能

以前用jquery,可以自行控制dom操作时机,手动调整

vue 和 react 是数据驱动视图,如何有效控制dom操作?

解决方案-vdom:

用js模拟dom结构(vnode)

新旧vnode对比,得出最小的更新范围,最后更新dom

数据驱动视图模式,有效控制dom操作

5、diff算法

diff即对比,是一个比较广泛的概念,如Linux diff命令、git diff等

两个js对象也可以做diff

树diff 的时间复杂度o(n^3)

第一,遍历tree1;第二,遍历tree2;第三,排序;如果节点树过大,算法不可用

优化时间复杂度到 o(n):

只比较同一层级,不跨级比较

tag不相同,则直接删掉重建,不再深度比较

tag 和 key ,两者相同,则认为是相同节点,不再深度比较

patchVnode、addVnode、removeVnode、updateChildren

6、模板编译

模板是vue开发中最常用的部分,即与使用相关联的原理

模板不是html,有指令、插值、js表达式,能判断、循环,因此,模板一定是转换为某种js代码,即编译模板

vue template compiler 将模板编译为 render 函数

模板编译为render函数,执行render函数 返回vnode

基于vnode 再执行 patch 和 diff

使用webpack vue-loader, 会在开发环境下编译模板

7、with语法

36e531d943743ff15080a4a8c541074d.png

8、组件 渲染/更新过程

f39ef8f35ea5122cd128d5265c6fe69a.png

响应式:监听data属性 getter setter

模板编译: 模板到render函数,再到vnode

vdom: patch(elem, vnode) 和 patch(vnode, newVnode)

初次渲染过程:

解析模板为render 函数(或在开发环境已完成,vue-loader)

触发响应式,监听data属性 getter setter

执行render函数,生成 vnode, patch(elem, vnode)

更新过程:

修改data,触发setter(此前在getter中已被监听)

重新执行render 函数,生成newVnode

patch(vnode,newVnode)

9、前端路由原理

hash 的特点:

hash 变化会触发网页跳转,即浏览器前进和后退

hash变化不会刷新页面

hash永远不会提交到server端

window.onhashchange

h5 history:

用URL规范的路由,但跳转时不刷新页面

history.pushState

window.onpopstate

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值