2024Vue面试题,大厂面试必备!,作为字节跳动面试官,flutter面试题

‘sort’,

‘reverse’

]

methodsToPatch.forEach(function (method) {

// cache original method

const original = arrayProto[method]

def(arrayMethods, method, function mutator (…args) {

const result = original.apply(this, args)

const ob = this.ob

let inserted

switch (method) {

case ‘push’:

case ‘unshift’:

inserted = args

break

case ‘splice’:

inserted = args.slice(2)

break

}

if (inserted) ob.observeArray(inserted) // 新增的数据需要进行观测

// notify change

ob.dep.notify()

return result

})

})

3.Vue中如何进行依赖收集?


  • 每个属性都拥有自己的dep属性,存放他所依赖的watcher,当属性变化后会通知自己对应的watcher去更新

  • 默认在初始化时会调用render函数,此时会触发属性依赖收集 dep.depend

  • 当属性发生修改时会触发watcher更新 dep.notify()

4.如何理解Vue中模板编译原理


问题核心:如何将template转换成render函数 ?

  • 1.将template模板转换成ast语法树 - parserHTML

  • 2.对静态语法做静态标记 - markUp diff来做优化的 静态节点跳过diff操作

3.重新生成代码 - codeGen

src/compiler/index.js:11

export const createCompiler = createCompilerCreator(function baseCompile (

template: string,

options: CompilerOptions

): CompiledResult {

const ast = parse(template.trim(), options) // 1.解析ast语法树

if (options.optimize !== false) {

optimize(ast, options) // 2.对ast树进行标记,标记静态节点

}

const code = generate(ast, options) // 3.生成代码

return {

ast,

render: code.render,

staticRenderFns: code.staticRenderFns

}

})

5.Vue生命周期钩子是如何实现的


  • Vue的生命周期钩子就是回调函数而已,当创建组件实例的过程中会调用对应的钩子方法。

  • 内部会对钩子函数进行处理,将钩子函数维护成数组的形式

src/core/instance/init.js:38 初始化合并

src/core/util/options.js:388 合并选项

function mergeHook (

parentVal: ?Array,

childVal: ?Function | ?Array

): ?Array {

const res = childVal // 儿子有

? parentVal

? parentVal.concat(childVal) // 父亲也有,那就是合并

Array.isArray(childVal) // 儿子是数组

? childVal

[childVal] // 不是数组包装成数组

parentVal

return res

? dedupeHooks(res)
res

}

6.Vue的生命周期方法有哪些?一般在哪一步发送请求及原因


  • beforeCreate 在实例初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用。

  • created 实例已经创建完成之后被调用。在这一步,实例已完成以下的配置:数据观测(data observer),属性和方法的运算, watch/event 事件回调。这里没有$el

  • beforeMount 在挂载开始之前被调用:相关的 render 函数首次被调用。

  • mounted el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。

  • beforeUpdate 数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。

  • updated 由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。

  • beforeDestroy 实例销毁之前调用。在这一步,实例仍然完全可用。

  • destroyed Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。 该钩子在服务器端渲染期间不被调用。

  • keep-alive (activated 和 deactivated)

在哪发送请求都可以,主要看具体你要做什么事

7.Vue.mixin的使用场景和原理


  • Vue.mixin的作用就是抽离公共的业务逻辑,原理类似“对象的继承”,当组件初始化时会调用mergeOptions方法进行合并,采用策略模式针对不同的属性进行合并。如果混入的数据和本身组件中的数据冲突,会采用“就近原则”以组件的数据为准。

  • mixin中有很多缺陷 “命名冲突问题”、“依赖问题”、“数据来源问题”

src/core/global-api/mixin.js

8.Vue组件data为什么必须是个函数?


  • 每次使用组件时都会对组件进行实例化操作,并且调用data函数返回一个对象作为组件的数据源。这样可以保证多个组件间数据互不影响

function Vue() {}

function Sub() { // 会将data存起来

this.data = this.constructor.options.data;

}

Vue.extend = function(options) {

Sub.options = options;

return Sub;

}

let Child = Vue.extend({

data: { name: ‘zf’ }

});

// 两个组件就是两个实例, 希望数据互不干扰

let child1 = new Child();

let child2 = new Child();

console.log(child1.data.name);

child1.data.name = ‘jw’;

console.log(child2.data.name);

src/core/util/options.js:121 data的合并策略

strats.data = function (

parentVal: any,

childVal: any,

vm?: Component

): ?Function {

if (!vm) { // 组件在合并时并没有产生实例,所以会校验类型

if (childVal && typeof childVal !== ‘function’) {

process.env.NODE_ENV !== ‘production’ && warn(

'The “data” option should be a function ’ +

'that returns a per-instance value in component ’ +

‘definitions.’,

vm

)

return parentVal

}

return mergeDataOrFn(parentVal, childVal)

}

return mergeDataOrFn(parentVal, childVal, vm)

}

function mergedInstanceDataFn () {

// instance merge

const instanceData = typeof childVal === ‘function’

? childVal.call(vm, vm)
childVal

const defaultData = typeof parentVal === ‘function’

? parentVal.call(vm, vm)
parentVal

if (instanceData) {

return mergeData(instanceData, defaultData) // 合并两个对象

} else {

return defaultData

}

}

9.nextTick在哪里使用?原理是?


  • nextTick中的回调是在下次 DOM 更新循环结束之后执行的延迟回调。

  • 可用于获取更新后的 DOM。

  • Vue中数据更新是异步的,使用nextTick方法可以保证用户定义的逻辑在更新之后执行。

src/core/util/nextTick.js:89

10.computed和watch区别


小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

最后

编程基础的初级开发者,计算机科学专业的学生,以及平时没怎么利用过数据结构与算法的开发人员希望复习这些概念为下次技术面试做准备。或者想学习一些计算机科学的基本概念,以优化代码,提高编程技能。这份笔记都是可以作为参考的。

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

名不虚传!字节技术官甩出的"保姆级"数据结构与算法笔记太香了

记、源码讲义、实战项目、讲解视频**

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
[外链图片转存中…(img-TCPF4gy9-1710748949837)]

最后

编程基础的初级开发者,计算机科学专业的学生,以及平时没怎么利用过数据结构与算法的开发人员希望复习这些概念为下次技术面试做准备。或者想学习一些计算机科学的基本概念,以优化代码,提高编程技能。这份笔记都是可以作为参考的。

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

名不虚传!字节技术官甩出的"保姆级"数据结构与算法笔记太香了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值