关于vue面试官常问的问题1

1、当我们点击按钮的时候动态给 data 增加的成员是否是响应式数据,如果不是的话,如果把新增成员设置成响应式数据,它的内部原理是什么。

let vm = new Vue({
    el: '#el'
    data: {
    o: 'object',
    dog: {}
    },
    method: {
        clickHandler () {
            // 该 name 属性是否是响应式的
            this.dog.name = 'Trump'
        }
    }
})

首先该 name 属性不是响应式数据的。

1、因为vue2.x内部是使用Object.defineProperty()的getter和setter方法来进行数据监听,然而新增的属性name并没有getter 和setter方法,所以数据不是响应式
要想设置成响应式也比较容易

方法1:预留一个坑位类似于以下代码:

let vm = new Vue({
    el: '#el'
    data: {
    o: 'object',
    dog: {
        name:''
    }
    },
    method: {
        clickHandler () {
            // 该 name 属性是否是响应式的
            this.dog.name = 'Trump'
        }
    }
})

原因:初始化的时候已经存在的属性,vue中会使用Object.defineProperty()方法对其进行监听,所以该属性有getter 和setter方法,所以数据就是响应式的

方法2:
vue官网给出一种解决的思路调用Vue.set()就可以实现数据的响应式
调用方法:Vue.set( target, key, value )

  • target:要更改的数据源(可以是对象或者数组)
  • key:要更改的具体数据
  • value :重新赋的值
let vm = new Vue({
        el: '#app',
        data: {
            msg: 'object',
            dog: {}
        },
        method: {
            clickHandler() {
                // 该 name 属性是否是响应式的
                this.$set(this.data.dog, name, 'Trump')
            }
        }
    })

2、请简述 Diff 算法的执行过程

  • diff的过程就是调用名为patch的函数,比较新旧节点,一边比较一边给真实的DOM打补丁。

  • 在采取diff算法比较新旧节点的时候,比较只会在同层级进行, 不会跨层级比较。

  • 数据发生改变时,set方法会让调用Dep.notify通知所有订阅者Watcher,订阅者就会调用patch给真实的DOM打补丁

说明:

patch 函数接收两个参数 oldVnode 和 Vnode,它们分别代表新的节点和之前的旧节点。这个patch函数会比较 oldVnode 和 vnode 是否是相同的, 即函数 sameVnode(oldVnode, vnode), 根据这个函数的返回结果分如下两种情况

  • true:执行 patchVnode
  • false:用 vnode 替换 oldVnode
patchVnode 函数做的工作

1.找到对应的真实 dom,称为 el

2.判断 vnode 和 oldVnode 是否指向同一个对象。
如果是,那么直接 return(结束)。

3.判断他们都有文本节点并且不相等,那么将 el 的文本节点设置为 vnode 的文本节点。

4.判断 oldVnode 有子节点而 vnode 没有,则删除 el 的子节点。

5.判断 oldVnode 没有子节点而 vnode 有,则将 vnode 的子节点真实化之后添加到 el

6.判断两者都有子节点,则执行 updateChildren 函数比较子节点。

vue-router 中常用的 hash 和 history 路由模式实现原理

  1. hash:路由的哈希(锚点)模式其实是利用了window可以监听onhashchange事件,也就是说你的url中的哈希值(#后面的值)如果有变化,前端是可以做到监听并做一些响应(做点事情),这么一来,即使前端并没有发起http请求也能够找到对应页面的代码块进行按需加载
  • hash可以通过window.location.hash读取
  1. history模式:是利用pushState||replaceState(+服务端)以及popState事件的监听到状态变更
  • pushState:浏览器不会向服务端请求数据,直接改变url地址,可以类似的理解为变相版的hash;但不像hash一样,浏览器会记录pushState的历史记录,可以使用浏览器的前进、后退功能作用

  • replaceState:不同于pushState,replaceState仅仅是修改了对应的历史记录

说明:history模式需要服务端做配合将不存在路径重定向到指定页面,不然会出现404(找不到该页面)pushState方法不会触发页面刷新,只是导致history对象发生变化,地址栏会有反应
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些常见的Vue面试问题及其答案: 1. 什么是Vue.js? Vue.js是一个用于构建用户界面的渐进式JavaScript框架。 2. Vue.js的主要特点是什么? Vue.js的主要特点包括: - 双向数据绑定 - 组件化开发 - 虚拟DOM - 模板语法 - 生命周期 - 插件系统 3. Vue.js与React的区别是什么? Vue.js与React的区别包括: - Vue.js有更简单的模板语法,React则使用JSX语法 - Vue.js有更好的文档和教程 - Vue.js的学习曲线更平滑 - Vue.js的性能比React更好 4. 什么是Vue.js的双向数据绑定? 双向数据绑定是指当数据发生变化时,视图也会随之更新;反之,当视图发生变化时,数据也会随之更新。Vue.js使用v-model指令实现双向数据绑定。 5. 什么是Vue.js的组件化开发? 组件化开发是指将页面拆分成多个组件进行开发,每个组件都有自己的状态和行为,可以独立地进行开发和测试。Vue.js使用组件化开发可以提高代码复用性和可维护性。 6. 什么是Vue.js的虚拟DOM? 虚拟DOM是指在内存中创建一个虚拟的DOM树,当数据发生变化时,Vue.js会先通过diff算法计算出需要更新的部分,然后只更新这些部分,从而提高性能。 7. Vue.js的生命周期是什么? Vue.js的生命周期包括: - beforeCreate - created - beforeMount - mounted - beforeUpdate - updated - beforeDestroy - destroyed 8. 什么是Vue.js的插件系统? 插件系统是指可以通过编写插件来扩展Vue.js的功能。插件可以添加全局方法或者组件、混入等。Vue.js的插件系统使用Vue.use方法来安装插件。 以上是一些常见的Vue面试问题及其答案,希望能对您有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值