2024年说说Vue,带你全面解析前端框架体系架构view篇

Vue

  • 什么是MVVM?

  • mvvm和mvc区别?它和其它框架(jquery)的区别是什么?哪些场景适合?

  • 组件之间的传值?

  • Vue 双向绑定原理

  • 描述下 vue 从初始化页面–修改数据–刷新页面 UI 的过程?

  • 虚拟 DOM 实现原理

  • Vue 中 key 值的作用?

  • Vue 的生命周期

  • Vue 组件间通信有哪些方式?

  • vue 中怎么重置 data?

  • 组件中写 name 选项有什么作用?

  • Vue 的 nextTick 的原理是什么?

  • Vuex 有哪几种属性?

    开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】


简单来说,Vue 在修改数据后,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图更新。

知乎上的例子

//改变数据

vm.message = ‘changed’

//想要立即使用更新后的DOM。这样不行,因为设置message后DOM还没有更新

console.log(vm.$el.textContent) // 并不会得到’changed’

//这样可以,nextTick里面的代码会在DOM更新后执行

Vue.nextTick(function(){

console.log(vm.$el.textContent) //可以得到’changed’

})

图解:

在这里插入图片描述

事件循环:

第一个 tick(图例中第一个步骤,即’本次更新循环’):

  1. 首先修改数据,这是同步任务。同一事件循环的所有的同步任务都在主线程上执行,形成一个执行栈,此时还未涉及 DOM 。

  2. Vue 开启一个异步队列,并缓冲在此事件循环中发生的所有数据改变。如果同一个 watcher 被多次触发,只会被推入到队列中一次。

第二个 tick(图例中第二个步骤,即’下次更新循环’):

同步任务执行完毕,开始执行异步 watcher 队列的任务,更新 DOM 。Vue 在内部尝试对异步队列使用原生的 Promise.then 和 MessageChannel 方法,如果执行环境不支持,会采用 setTimeout(fn, 0) 代替。

第三个 tick(图例中第三个步骤):

此时就是文档所说的

下次 DOM 更新循环结束之后

此时通过 Vue.nextTick 获取到改变后的 DOM 。通过 setTimeout(fn, 0) 也可以同样获取到。

简单总结事件循环:

同步代码执行 -> 查找异步队列,推入执行栈,执行Vue.nextTick[事件循环1] ->查找异步队列,推入执行栈,执行Vue.nextTick[事件循环2]…

总之,异步是单独的一个tick,不会和同步在一个 tick 里发生,也是 DOM 不会马上改变的原因。

对于事件循环,可以在这里查看更详细的内容: 浏览器进程线程、Web Workers、Event Loop 图解

🌈用途

===================================================================

应用场景:需要在视图更新之后,基于新的视图进行操作。

created、mounted


需要注意的是,在 created 和 mounted 阶段,如果需要操作渲染后的试图,也要使用 nextTick 方法。

官方文档说明:

注意 mounted 不会承诺所有的子组件也都一起被挂载。如果你希望等到整个视图都渲染完毕,可以用 vm.$nextTick 替换掉 mounted

mounted: function () {

this.$nextTick(function () {

// Code that will run only after the

// entire view has been rendered

})

}

其他应用场景


其他应用场景如下三例:

例子1:

点击按钮显示原本以 v-show = false 隐藏起来的输入框,并获取焦点。

showsou(){

this.showit = true //修改 v-show

document.getElementById(“keywords”).focus() //在第一个 tick 里,获取不到输入框,自然也获取不到焦点

}

修改为:

showsou(){

this.showit = true

this.$nextTick(function () {

// DOM 更新了

document.getElementById(“keywords”).focus()

})

}

例子2:

点击获取元素宽度。

{{ message }}

<button @click=“getMyWidth”>获取p元素宽度

getMyWidth() {

this.showMe = true;

//this.message = this.$refs.myWidth.offsetWidth;

//报错 TypeError: this.$refs.myWidth is undefined

this.$nextTick(()=>{

//dom元素更新后执行,此时能拿到p元素的属性

this.message = this.$refs.myWidth.offsetWidth;

})

}

例子3:

使用 swiper 插件通过 ajax 请求图片后的滑动问题。

实例理解 nextTick 应用


下面的例子来自 vue nextTick深入理解, 稍有改动。各位可以复制运行一遍,加深理解。

    • {{item}}
      • {{item}}
        1. {{item}}
          1. {{item}}
            1. {{item}}
            评论
            添加红包

            请填写红包祝福语或标题

            红包个数最小为10个

            红包金额最低5元

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

            抵扣说明:

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

            余额充值