1.盒子水平垂直居中方法(常用)
// 方法一、通常用法
.parent{
position:relitive;
}
.son{
position:absolute;
transfrom:translate(-50%,-50%);
top:50%;
left:50%;
}
// 方法二、不考虑兼容的情况下直接使用flex
.parent{
display: flex;
justify-content: center; //内容水平居中
align-items: center; //垂直居中
}
2.var let const 的区别
var 具有变量提升, let const 具有块级作用域,const 无法重新赋值, 如果 const 声明的变量是一个对象或数组,那么该对象或数组的属性和元素是可以被修改的。
3. JS数据类型有哪些以及检测方法
4. 什么是闭包?
闭包就是能够读取其他函数内部变量的函数,闭包基本上就是一个函数内部返回一个函数
5. 深拷贝与浅拷贝的区别?
6. cookie sessinonStorage localStorage的区别?
cookie、sessionStorage、localStorage都是浏览器的本地存储。
7. 用户输入url到浏览器 渲染完成的过程
8. 简述下三次握手四次挥手
三次握手和四次挥手是TCP协议中用来建立和终止TCP连接的过程。
9.常用的数组方法有哪些?
改变原数组:push、pop、shift、unshift、sort、splice、reverse
不会改变原数组:indexOf 、lastIndexOf 、every 、some 、filter 、map 、concat 、slice
slice和splice的区别?
slice:取起始和终止的下标范围进行元素移除(该方法不会修改原数组,只是返回一个新的子数组。)
splice: 可根据传入参数个数不同实现删除、插入操作,第1个参数为起始下标,第2个为删除个数,第3个为要增加的数据(该方法会改变原数组)
两种场景都存在:forEach
如果数组中都是基础数据类型forEach()不会改变原数组。
如果数组中有是引用数据类型(对象(Object)、数组(Array)、函数(Function)。 ),forEach()改变了引用数据类型的值,原数组的也会改变,其原理就是指针指向问题。
10.什么是DOM事件流?
DOM事件流是指在网页中发生交互事件时,事件在各个元素之间传播和触发的过程。当用户在网页上进行点击、输入、滚动等操作时,这些事件会按照特定的顺序从被点击的元素一直传递到根元素,并且触发相应的事件处理函数。
前端事件流分为两种类型:事件冒泡和事件捕获(事件委托)。
事件捕获(Event Capturing):
在事件捕获阶段,事件从根元素开始传播,沿着DOM树向下传递,直到达到触发事件的目标元素。
事件冒泡(Event Bubbling):
在事件冒泡阶段,事件从目标元素开始传播,沿着DOM树向上冒泡,直到达到根元素。这意味着目标元素会先接收事件,然后再依次传递给父级元素。
11.什么是事件循环?
12.说说你对SPA单页面的理解,它的优缺点分别是什么?
SPA(单页面应用)是指整个应用程序只有一个HTML页面,所有的内容都通过异步加载或动态生成的方式在这个页面中进行展示。SPA通常基于前端框架(如Vue.js、React等)来实现,通过前端路由来控制页面的展示和切换,从而实现快速、流畅的用户体验。
优点:
缺点:
13.Vue的优点
综上所述,Vue.js具有简单易学、灵活高效、组件化开发和优秀的性能等众多优点,这些特点使其成为一种非常受欢迎的前端框架,适用于各种规模的Web应用开发。
14.SPA首屏加载速度慢的怎么解决?
15.Vue初始化过程中(new Vue(options))都做了什么?
总体来说,Vue初始化过程主要包括创建Vue实例、数据绑定、模板编译、挂载实例到HTML元素上以及初始化生命周期钩子等过程。通过这些步骤,Vue实例就能够成功运行和管理应用程序,并实现数据驱动的UI更新。
16.对MVVM的理解?
MVVM是一种软件架构模式,它是Model-View-ViewModel的缩写。MVVM将应用程序划分为三个主要部分,每个部分负责不同的功能,Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑;View 代表UI 组件,它负责将数据模型转化成UI 展现出来;ViewModel 是一个同步View 和 Model的对象。
MVVM的优点包括:
总的来说,MVVM是一种使得前端开发更加高效、可维护和可测试的软件架构模式,它在现代前端框架如Vue.js和Angular中得到了广泛的应用。
17.说说vue的生命周期的理解
Vue.js组件的生命周期是指在组件创建、挂载、更新和销毁的过程中,Vue实例会依次触发一系列的钩子函数。这些钩子函数允许你在不同的阶段执行自定义的操作,以适应不同的业务需求。
以下是每个生命周期阶段通常做的事情:
Vue.js 3.x 在生命周期方面有一些变化,具体的钩子函数和执行顺序可能有所不同,例如新增了beforeUnmount和unmounted钩子。
生命周期的使用让你能够在组件的不同阶段执行相应的操作,例如在created阶段初始化数据、在mounted阶段执行DOM操作、在beforeDestroy阶段进行资源清理等。这些钩子函数使你能够更好地控制和定制组件的行为,以满足不同的业务需求。
18.Vue数据双向绑定原理?
Vue的数据双向绑定是其核心特性之一,它使得模型(Model)中的数据与视图(View)之间能够自动保持同步,即当数据发生变化时,视图会自动更新;当用户在视图中进行交互操作时,数据也会相应地更新。
Vue的数据双向绑定原理可以简单概括为以下几个步骤:
整个过程中的关键是虚拟DOM和Diff算法。虚拟DOM是一个轻量级的JavaScript对象,它对真实DOM进行抽象,通过虚拟DOM的比对,可以最小化真实DOM的操作,从而提高性能。Diff算法是Vue中用于比较新旧虚拟DOM的算法,它能够找出变化的部分,只更新需要更新的部分,减少不必要的DOM操作。
总体来说,Vue的数据双向绑定原理是通过观察者、虚拟DOM和Diff算法相互配合,使得模型中的数据与视图保持同步,实现了数据驱动的UI更新,提供了更高效、响应迅速的用户体验。
19.Vue2.x的响应式原理?
Vue的响应式原理是实现数据双向绑定的核心机制,它使得模型(数据)和视图(DOM)能够自动保持同步。Vue的响应式原理主要依赖于以下几个关键概念:
总的来说,Vue的响应式原理是通过Object.defineProperty方法将数据对象的属性转换为响应式属性,然后通过依赖追踪和依赖更新机制实现数据与视图的自动同步。这样,当数据发生变化时,相关的视图会自动更新,实现了数据驱动的UI更新,提供了更高效、灵活的开发方式。
// Vue的data对象中的每个属性都会被转化为getter和setter,这样Vue能够监听属性的变化,并在变化时执行相应的操作。
const obj = {};
Object.defineProperty(obj, 'count', {
get() {
console.log('Getting count');
return this._count;
},
set(value) {
console.log('Setting count to', value);
this._count = value;
}
});
obj.count = 666; // 触发setter,输出"Setting count to 666"
console.log(obj.count); // 触发getter,输出"Getting count" 和 666
20.Vue中data的属性可以和methods中方法同名吗,为什么?
在Vue中,data属性和methods中的方法可以同名,但不推荐这样做。如果出现同名的情况,Vue会发出警告,并且methods中的方法将会覆盖data中的属性。
原因是因为在Vue实例中,data对象中的属性和methods对象中的方法是在同一个命名空间中的。当Vue实例进行初始化时,会将data中的属性和methods中的方法合并到Vue实例中,所以如果出现同名的情况,methods中的方法会覆盖data中的属性。
举个例子:
var app = new Vue({
el: '#app',
data: {
message: 'Hello',
count: 0 // 同名属性
},
methods: {
count: function() {
this.count++; // 会调用methods中的count方法,而不是data中的count属性
}
}
});
21.vue中created与mounted区别?
在Vue中,created和mounted是两个生命周期钩子函数,用于在Vue实例的不同生命周期阶段执行特定的操作。它们之间有一些区别,下面进行详细说明:
created:
created生命周期钩子在Vue实例被创建后立即被调用,此时实例已经完成了数据的观测,但DOM元素尚未挂载到页面上,因此此时无法访问或操作DOM。
created钩子通常用于进行一些初始化的操作,如数据的预处理、异步请求数据、监听事件等,但不能保证所有子组件已经被挂载。
在created钩子中,可以访问实例的数据和方法,但还不能操作页面上的DOM元素。
mounted:
mounted生命周期钩子在Vue实例的挂载阶段被调用,此时Vue实例已经将DOM元素挂载到页面上,可以进行DOM操作。
mounted钩子通常用于需要进行DOM操作、和其他框架或库进行交互的情况,例如设置定时器、初始化第三方插件、获取DOM元素的尺寸等。
在mounted钩子中,可以访问实例的数据和方法,同时也可以操作页面上的DOM元素。
综上所述,created钩子在Vue实例创建后立即执行,适用于数据初始化和数据请求等操作;而mounted钩子在Vue实例挂载到页面后执行,适用于DOM操作和和其他框架交互等操作。在使用这两个钩子时,需要根据具体需求选择合适的时机执行相应的操作。
22.Vue中computed与method的区别?
computed:
computed用于定义计算属性,它是一个函数,但在Vue中使用时,像是一个响应式的数据属性。
computed是基于它所依赖的响应式数据的值进行缓存的,只有在依赖的响应式数据发生变化时,才会重新计算,否则会直接使用缓存的计算结果。
computed适用于需要根据响应式数据进行计算得出结果的场景,比如对数据进行过滤、排序、求和等操作。
methods:
methods用于定义普通方法,它也是一个函数,但在Vue中使用时,它是一个普通的方法,每次调用都会重新执行。
methods适用于需要主动触发的操作,或者操作中不依赖响应式数据的场景。
23.虚拟DOM中key的作用
在虚拟DOM中,key是一个特殊的属性,用于帮助Vue或其他前端框架在进行DOM Diff(差异对比)时更高效地更新视图。
虚拟DOM通过比较新旧虚拟DOM树的差异来确定需要更新的部分,并最小化对实际DOM的操作,以提高渲染性能。在进行Diff算法时,如果新旧虚拟DOM的节点顺序发生变化,可能会导致一系列的节点删除和插入操作,而这些操作可能会引起不必要的性能开销。
这就是key的作用所在。key是给每个虚拟DOM节点添加的唯一标识符。通过key,Vue可以更准确地追踪每个节点的变化,从而在更新时能够最小化操作。当新旧虚拟DOM的节点顺序发生变化时,Vue会通过key来识别节点的对应关系,而不是简单地按顺序进行比较。这样,在对比时可以准确找到需要移动的节点,而不是删除和插入节点,大大减少了DOM操作的开销,提高了渲染性能。
要注意的是,key应该是唯一且稳定的。在使用key时,不应该使用随机数、时间戳等不稳定的值作为key,因为这可能导致不必要的DOM操作。应该使用每个节点在列表中的唯一标识符,比如数据中的ID值作为key。
用index作为key可能会引发的问题
若对数据进行:逆序添加/逆序删除等破坏顺序的操作,会产生没有必要的真实DOM更新,界面效果虽然没有问题,但是数据过多的话,会效率过低;
如果结构中还包含输入类的DOM,会产生错误DOM更新,界面有问题;
注意!如果不存在对数据的逆序操作,仅用于渲染表用于展示,使用index作为key是没有问题的。
24.Vue中watch用法详解
当你在Vue中使用watch来监听数据的变化时,你可以在组件的选项对象中使用watch属性来定义观察者。watch属性接受一个对象,对象的每个属性都是要观察的数据属性,而属性的值是一个处理数据变化的回调函数。这些回调函数会在被观察的数据发生变化时被调用。
用法如下:
export default {
data() {
return {
user: {
name: 'Alice',
age: 25,
},
};
},
watch: {
user: {
handler(newValue, oldValue) {
console.log('user属性发生变化:', newValue, oldValue);
},
immediate: true, // 在watch定义时立即触发回调
deep: true, // 启用深度观察
},
},
};
通过watch,你可以更精细地处理数据变化时的逻辑,例如数据的验证、异步操作等。
25.vue中对mixins的理解和使用
在Vue中,Mixins(混入)是一种用于组件复用的特性,它允许你将一些通用的选项、数据、方法等抽离出来,然后在多个组件之间进行复用。通过Mixins,你可以在不同的组件中共享相同的代码,从而提高代码的复用性和可维护性。
Mixins的理解和使用包括以下几点:
// mixins.js
export const myMixin = {
data() {
return {
count: 0,
};
},
methods: {
increment() {
this.count++;
},
},
};
使用Mixins:
在组件选项中使用mixins属性来引入Mixins。可以引入一个或多个Mixins,它们会被合并到组件中。
Mixins的合并规则:当多个Mixins和组件具有相同的选项(如data、methods等)时,它们会按照一定的合并策略进行合并,通常是通过数组合并、覆盖、合并钩子等方式。
示例:
// MyComponent.vue
import { myMixin } from './mixins';
export default {
mixins: [myMixin],
// 其他组件选项...
};
Mixins的注意事项:
总之,Mixins是Vue提供的一种强大的组件复用机制,可以帮助你更好地组织和管理代码,提高开发效率。但需要谨慎使用,以避免混乱和冲突。
26.vue中的插槽
插槽(Slot)是Vue中用于组件内容分发的一种机制,它允许你在组件的模板中定义一些“占位符”,然后在使用该组件时,将具体内容插入到这些占位符中。插槽使得组件的结构更加灵活,能够更好地适应不同的使用场景。
Vue中的插槽分为两种类型:
// 子组件的模板:
<template>
<div>
<h2>默认插槽示例</h2>
<slot></slot> <!-- 默认插槽的位置 -->
</div>
</template>
// 父组件使用子组件
<template>
<div>
<my-component>
<p>This is the default slot content.</p>
</my-component>
</div>
</template>
// 子组件的模板:
<template>
<div>
<h2>子组件</h2>
<slot name="header"></slot> <!-- 名为"header"的具名插槽位置 -->
<slot></slot> <!-- 默认插槽的位置 -->
<slot name="footer"></slot> <!-- 名为"footer"的具名插槽位置 -->
</div>
</template>
// 父组件使用子组件
<template>
<div>
<my-component>
<template v-slot:header>
<h3>This is the header slot content.</h3>
</template>
<p>This is the default slot content.</p>
<template v-slot:footer>
<footer>This is the footer slot content.</footer>
</template>
</my-component>
</div>
</template>
27.$nextTick的理解
$nextTick是Vue.js中的一个异步方法,它的作用是在下次DOM更新循环结束之后执行指定的回调函数。在Vue中,数据的更新是异步的,所以有时候在修改数据后立即获取更新后的DOM状态可能会出现问题。nextTick允许你在DOM更新之后执行一些操作,以确保你操作的是最新的DOM状态。
使用的场景包括:
28.Vue中常用的一些指令
Vue中常用的一些指令是用于在模板中控制DOM渲染和行为的特殊标记。这些指令以"v-"开头,可以在HTML模板中直接使用,用于绑定数据、控制显示/隐藏、循环、条件判断等操作。
以下是一些常用的Vue指令:
29.vue的自定义指令
在Vue中,你可以创建自定义指令来扩展模板中的功能。自定义指令允许你在DOM元素上添加额外的行为或逻辑,使得你可以在模板中复用这些行为。自定义指令以v-开头,后面跟着指令的名称,例如v-mydirective。
在Vue中,你可以通过Vue.directive方法来定义自定义指令。这个方法接受两个参数:指令名称和一个对象,该对象包含了指令的一些钩子函数和属性。
// 自定义指令
Vue.directive('mydirective', {
// 指令的绑定时调用
bind(el, binding) {// 在绑定时执行一些逻辑
// 在绑定时设置元素的背景颜色
el.style.backgroundColor = binding.value;
},
// 指令的更新时调用
update(el, binding) {
// 在更新时执行一些逻辑
},
// 指令的解绑时调用
unbind(el, binding) {// 在解绑时执行一些逻辑
// 在解绑时清理样式
el.style.backgroundColor = '';
}
});
// 在模板中使用自定义指令时,将指令名称作为属性添加到DOM元素上,并可以使用指令表达式传递参数。
<template>
<div>
<p v-mydirective="'Hello, Vue!'">Custom directive example</p>
</div>
</template>
自定义指令的钩子函数:
自定义指令可以定义多个钩子函数,用于不同的生命周期阶段执行不同的逻辑。
自定义指令的常见应用场景:
总的来说,自定义指令可以用于各种各样的场景,帮助你实现特定的交互效果、优化代码结构,以及集成第三方功能,从而让你的Vue应用更加强大和灵活。
30.v-show和v-if指令的共同点和不同点
v-show和v-if都是Vue中用于控制元素显示与隐藏的指令
共同点:
不同点
适用场景:
v-show:适用于频繁切换显示状态的情况,或者在初始渲染时需要保持较好的性能。
v-if:适用于条件较少变化、或者在切换时涉及较复杂操作的情况。
31.为什么避免v-if和v-for一起使用
Vue中,尽量避免在同一个元素上同时使用v-if和v-for是因为这样的组合可能会导致意外的行为和性能问题。虽然不是绝对禁止,但需要小心使用,并理解其中的潜在问题。
一起使用的情况下,vue2.x版本中,v-for 具有比 v-if 更高的优先级;vue3.x版本中,v-if 具有比 v-for 更高的优先级。
避免v-if和v-for一起使用的方法:
元素上同时使用v-if和v-for。
<template>
<div>
<template v-for="item in items">
<div v-if="item.isVisible">{{ item.name }}</div>
</template>
</div>
</template>
29.vue.$set是什么,解决了什么问题
Vue.set(或this.$set)是Vue.js提供的一个方法,用于在响应式对象中添加新属性或更新已有属性,并确保这些操作是响应式的。主要用于在Vue实例的数据中改变数组和对象中的属性。
Vue.js可以检测到对象的属性的添加和删除,以及数组的变化(如push、pop、splice等),从而实现响应式更新。然而,在直接通过索引修改数组或直接添加新属性时,Vue.js可能无法正常跟踪这些变化,导致视图无法正确更新。
这时,就需要使用Vue.set方法来保证变化是响应式的。
解决办法: Vue.set(this.data, ‘name’, ‘Alice’);
Vue.set的第一个参数必须是一个响应式对象,第二个参数是属性名或索引,第三个参数是要设置的新值。
32.Vue组件通信有哪些方式
Vue组件通信是在不同组件之间传递数据和交换信息的过程。在Vue中,有多种方式可以实现组件通信,以下是一些常用的方式: