最近想重新找工作,在苏州和上海面试了挺多公司,总结出一些面经,和大家分享一下。
现在面试,其实大部分还是以前的经典八股文,绝大部分都能用以前的老八股: (点击来看这篇文章)2023金九银十必看前端面试题!2w字精品!
还有一些比较新颖的面试题,和大家分享一下。
刚听到这个问题还是愣了一下的,最后回来🔍了学习,和大家总结分享一下。
父子组件的生命周期钩子是相互独立的,但是有一定的顺序,子组件的生命周期钩子一般会在父组件的生命周期钩子之前执行。
使用这些生命周期钩子可以控制父子组件间的行为,比如数据初始化、DOM 更新、销毁等操作。
当一个父组件渲染子组件时,子组件的生命周期钩子会比父组件的生命周期钩子早执行。下面是父子组件生命周期的顺序和相关的生命周期钩子:
beforeCreate
: 在父组件实例被创建之前。created
: 父组件实例已经创建完成,此时数据已经初始化,但未渲染 DOM。beforeMount
: 在父组件挂载到 DOM 之前被调用。mounted
: 父组件挂载完成,DOM 元素已可用。beforeCreate
: 子组件实例被创建前。created
: 子组件实例已经创建,数据已经初始化,尚未挂载到 DOM。beforeMount
: 子组件准备挂载前被调用。mounted
: 子组件挂载完成,DOM 元素已可用。beforeUpdate
: 父组件的响应式数据发生变化时调用。updated
: 当父组件的 DOM 更新后调用。beforeDestroy
/ beforeUnmount
(Vue 3 使用 beforeUnmount
):父组件即将被销毁前调用。destroyed
/ unmounted
(Vue 3 使用 unmounted
):父组件销毁后调用。beforeUnmount
: 子组件即将被销毁前调用。unmounted
: 子组件销毁后调用。beforeCreate
和 created
是在父组件实例创建过程中调用的。beforeCreate
阶段无法访问任何数据、计算属性、方法等,因为这些还没有初始化。created
阶段可以访问到父组件的响应式数据、计算属性和方法,但是尚未渲染 DOM。beforeCreate
和 created
也是子组件生命周期的初始阶段。beforeCreate
阶段子组件的响应式数据尚未被初始化,因此不能使用任何数据。created
阶段,子组件的数据、计算属性和方法已初始化,但尚未挂载到 DOM。beforeMount
和 mounted
发生在父组件挂载到 DOM 时。beforeMount
阶段,父组件尚未渲染和挂载 DOM。mounted
阶段,父组件的 DOM 渲染完成,已经可供操作。beforeMount
和 mounted
会先于父组件的 beforeMount
和 mounted
执行。beforeMount
阶段,子组件准备挂载到 DOM,但尚未挂载。mounted
阶段,子组件挂载完成,DOM 元素可用。beforeUpdate
会在组件更新之前调用,updated
会在 DOM 更新之后调用。beforeUpdate
阶段,父组件的响应式数据发生变化,但 DOM 还没有更新。updated
阶段,父组件的 DOM 已经更新,变化已反映到视图上。beforeUpdate
和 updated
也在父组件更新时被触发。beforeUpdate
阶段,子组件的响应式数据变化,但 DOM 尚未更新。updated
阶段,子组件的 DOM 已更新,视图已变化。beforeUnmount
和 unmounted
钩子在父组件销毁时调用。beforeUnmount
在父组件销毁前调用,通常用于清理定时器、事件监听等副作用。unmounted
在父组件销毁之后调用。beforeUnmount
和 unmounted
在子组件销毁时调用,顺序是子组件先销毁,再销毁父组件。beforeUnmount
在子组件销毁之前调用。unmounted
在子组件销毁之后调用。<!-- 父组件 Parent.vue -->
<template>
<div>
<p>父组件</p>
<Child />
</div>
</template>
<script>
import Child from './Child.vue';
export default {
components: {
Child
},
beforeCreate() {
console.log('父组件 beforeCreate');
},
created() {
console.log('父组件 created');
},
beforeMount() {
console.log('父组件 beforeMount');
},
mounted() {
console.log('父组件 mounted');
},
beforeUpdate() {
console.log('父组件 beforeUpdate');
},
updated() {
console.log('父组件 updated');
},
beforeUnmount() {
console.log('父组件 beforeUnmount');
},
unmounted() {
console.log('父组件 unmounted');
}
};
</script>
<!-- 子组件 Child.vue -->
<template>
<p>子组件</p>
</template>
<script>
export default {
beforeCreate() {
console.log('子组件 beforeCreate');
},
created() {
console.log('子组件 created');
},
beforeMount() {
console.log('子组件 beforeMount');
},
mounted() {
console.log('子组件 mounted');
},
beforeUpdate() {
console.log('子组件 beforeUpdate');
},
updated() {
console.log('子组件 updated');
},
beforeUnmount() {
console.log('子组件 beforeUnmount');
},
unmounted() {
console.log('子组件 unmounted');
}
};
</script>
当父子组件渲染时,控制台输出的生命周期钩子的顺序如下:
子组件 beforeCreate
子组件 created
子组件 beforeMount
子组件 mounted
父组件 beforeCreate
父组件 created
父组件 beforeMount
父组件 mounted
当父组件数据发生变化时,父子组件的生命周期钩子会继续执行:
父组件 beforeUpdate
子组件 beforeUpdate
父组件 updated
子组件 updated
在 JavaScript 中处理二叉树时,通常会使用类或对象来定义二叉树结构,并实现常见的树操作(如遍历、插入、删除等)。
在 Vue 中,可以通过组件的递归方式来展示树形结构,并通过 Vue 的响应式机制来实时更新数据或交互操作。
前序遍历(Pre-order Traversal)
function preOrder(node) {
if (node === null) return;
console.log(node.value); // 处理当前节点
preOrder(node.left); // 递归遍历左子树
preOrder(node.right); // 递归遍历右子树
}
preOrder(root); // 输出:1 2 4 5 3
中序遍历(In-order Traversal)
function inOrder(node) {
if (node === null) return;
inOrder(node.left); // 递归遍历左子树
console.log(node.value); // 处理当前节点
inOrder(node.right); // 递归遍历右子树
}
inOrder(root); // 输出:4 2 5 1 3
后序遍历(Post-order Traversal)
function postOrder(node) {
if (node === null) return;
postOrder(node.left); // 递归遍历左子树
postOrder(node.right); // 递归遍历右子树
console.log(node.value); // 处理当前节点
}
postOrder(root); // 输出:4 5 2 3 1
插入节点 插入节点时,一般遵循二叉树的基本规则:如果节点值小于当前节点,则进入左子树,反之则进入右子树。
function insert(root, value) {
if (root === null) {
return new TreeNode(value); // 插入新节点
}
if (value < root.value) {
root.left = insert(root.left, value);
} else {
root.right = insert(root.right, value);
}
return root;
}
root = insert(root, 6); // 在树中插入值 6
vue基本二叉树组件渲染举例 通过递归组件的方式来渲染二叉树节点,每个节点可能会显示它的值,并且包含对左子树和右子树的指针。
例子:使用递归组件渲染二叉树
<template>
<div v-if="node">
<div class="node">
<span>{{ node.value }}</span>
<div class="children">
<TreeNode v-if="node.left" :node="node.left" />
<TreeNode v-if="node.right" :node="node.right" />
</div>
</div>
</div>
</template>
<script>
export default {
name: 'TreeNode',
props: {
node: Object
}
}
</script>
<style scoped>
.node {
margin: 10px;
padding: 5px;
border: 1px solid #ccc;
display: inline-block;
}
.children {
margin-left: 20px;
}
</style>
在父组件中使用这个递归组件来传递一个二叉树的根节点:
<template>
<div>
<TreeNode :node="root" />
</div>
</template>
<script>
import TreeNode from './TreeNode.vue';
export default {
components: {
TreeNode
},
data() {
return {
// 创建一个简单的二叉树
root: {
value: 1,
left: { value: 2, left: null, right: null },
right: { value: 3, left: null, right: null }
}
};
}
}
</script>
在文件上传过程中,小文件和大文件上传有不同的实现思路。为了更好地组织两者的上传流程,可以把它们的上传方式按不同的需求进行划分,确保上传效率和稳定性。
以下是一个详细的对比分析:
小文件通常指文件大小较小的文件,一般是在几MB以内(通常小于10MB)。上传小文件时,因为文件较小,传输过程中没有大文件所面临的网络超时、内存溢出等问题,所以可以直接使用传统的上传方法。
<input type="file">
标签选择文件。FormData
或者 XMLHttpRequest
直接发送给服务器。fetch
API 或 XMLHttpRequest
进行文件上传。大文件上传通常是指文件大小超过 10MB,甚至几GB的文件。大文件上传时,由于网络不稳定、内存不足、服务器超时等问题,需要考虑切片上传、断点续传等机制。
Blob.slice()
方法进行切片。FormData
携带文件切片以及其他元数据(如文件哈希、切片编号、文件总大小等)上传。特点 | 小文件上传 | 大文件上传 |
---|---|---|
文件大小 | 小于10MB | 大于10MB,可能达到GB级别 |
上传方式 | 直接上传 | 切片上传 |
上传过程 | 直接通过 FormData 上传 | 切割文件成多个小块逐个上传 |
进度显示 | 一般不需要进度条 | 需要显示上传进度条 |
断点续传 | 不需要(或不常用) | 需要支持断点续传 |
服务器处理 | 直接保存文件 | 合并所有切片后保存文件 |
适用场景 | 小型文件上传,如图片、文档等 | 视频、音频、大型数据文件等 |
对于小文件上传,可以直接将文件通过 FormData
上传给服务器,而大文件上传则需要考虑切片上传、上传进度的显示、断点续传等技术。两者的核心差异在于文件大小及上传的稳定性和效率考虑。
骨架屏(Skeleton Screen)是一种用户体验优化的技术,通常用于提升页面加载的速度感。它通过在内容加载时显示一个简单的占位符(骨架结构),而不是白屏或加载指示器,来让用户知道页面正在加载。它可以减少加载过程中用户的焦虑感,让用户感觉页面正在快速渲染。
骨架屏通过在页面加载时展示简洁的占位符,帮助提升用户的体验,尤其是在网络不稳定或页面加载较慢的情况下。
通常,骨架屏会用灰色、模糊的色块或者简单的图形来表示内容位置和结构。随着内容的逐渐加载,骨架屏会逐步被实际内容替代。
骨架屏的原理在于通过“占位”来模仿页面加载后的结构。在页面的首屏加载时,先展示一个由灰色块、线条等构成的占位界面,给用户一种页面结构已经准备好、正在加载内容的错觉。一旦内容加载完成,再将占位符替换为实际的内容。
骨架屏有助于:
本次的分享就到这里,如果后续有什么新颖的面试题会持续分享,欢迎投稿!
❝您好,我是肥晨。 欢迎关注我获取前端学习资源,日常分享技术变革,生存法则;行业内幕,洞察先机。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有