《前后端面试题
》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,MySQL,Linux… 。
文章目录
一、本文面试题目录
131. Vue2中如何实现虚拟滚动列表?
- 答案:Vue2中实现虚拟滚动列表通常使用第三方库,如
vue-virtual-scroller
,它能有效处理大数据量列表的渲染性能问题。以下是一个基本实现示例:
<template>
<RecycleScroller
class="scroller"
:items="items"
:item-size="32"
key-field="id"
>
<template #item="{ item }">
<div class="item">{{ item.name }}</div>
</template>
</RecycleScroller>
</template>
<script>
import { RecycleScroller } from 'vue-virtual-scroller';
import 'vue-virtual-scroller/dist/vue-virtual-scroller.css';
export default {
components: {
RecycleScroller
},
data() {
return {
items: Array.from({ length: 10000 }).map((_, i) => ({
id: i,
name: `Item ${i}`
}))
};
}
};
</script>
该库会根据容器尺寸和滚动位置动态渲染可见区域的列表项,极大提升了性能。
132. Vue2中如何处理组件间的循环引用?
- 答案:Vue2中处理组件间的循环引用有以下几种方式:
- 异步导入组件:在
components
选项中使用动态导入,例如:
- 异步导入组件:在
export default {
components: {
ChildComponent: () => import('./ChildComponent.vue')
}
};
- **在`beforeCreate`或`created`钩子中注册组件**:
export default {
beforeCreate() {
this.$options.components.ChildComponent = require('./ChildComponent.vue').default;
}
};
- **重构组件结构**:将共享逻辑提取到独立组件或混入中,避免直接循环引用。
133. Vue2中如何实现自定义指令的生命周期钩子?
- 答案:Vue2自定义指令的生命周期钩子包括:
- bind:指令第一次绑定到元素时调用。
- inserted:被绑定元素插入父节点时调用。
- update:所在组件的VNode更新时调用。
- componentUpdated:所在组件的VNode及其子VNode全部更新后调用。
- unbind:指令与元素解绑时调用。
示例代码如下:
Vue.directive('focus', {
bind(el) {
// 准备工作
console.log('bind');
},
inserted(el) {
el.focus(); // 元素插入DOM后聚焦
console.log('inserted');
},
update(el) {
console.log('update');
},
componentUpdated(el) {
console.log('componentUpdated');
},
unbind(el) {
// 清理工作
console.log('unbind');
}
});
134. Vue2中如何实现路由参数变化时组件的复用与更新?
- 答案:Vue2中当路由参数变化(如
/user/1
到/user/2
)时,默认会复用组件,此时可通过以下方式响应参数变化:- watch监听$route:
export default {
watch: {
$route(to, from) {
// 处理路由变化
this.loadData(to.params.id);
}
},
methods: {
loadData(id) {
// 获取数据逻辑
}
}
};
- **beforeRouteUpdate导航守卫**:
export default {
beforeRouteUpdate(to, from, next) {
this.loadData(to.params.id);
next();
}
};
135. Vue2中如何实现响应式原理的手动触发?
- 答案:Vue2的响应式系统基于Object.defineProperty(),对于已创建的实例,Vue不允许动态添加根级别的响应式属性。但可通过以下方式手动触发:
- Vue.set/this.$set:向嵌套对象添加响应式属性,例如:
this.$set(this.user, 'age', 25);
- **替换整个对象**:用新对象替换原对象,例如:
this.user = { ...this.user, age: 25 };
136. Vue2中如何实现动态组件?
- 答案:Vue2中使用
<component>
元素结合:is
特性实现动态组件,例如:
<template>
<div>
<button @click="currentComponent = 'ComponentA'">组件A</button>
<button @click="currentComponent = 'ComponentB'">组件B</button>
<component :is="currentComponent"></component>
</div>
</template>
<script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';
export default {
components: {
ComponentA,
ComponentB
},
data() {
return {
currentComponent: 'ComponentA'
};
}
};
</script>
137. Vue2中如何实现懒加载插件?
- 答案:Vue2中实现懒加载插件有以下几种方式:
- 异步导入并在需要时安装:
// 异步加载并安装插件
async function loadPlugin() {
const plugin = await import('my-plugin');
Vue.use(plugin.default);
}
// 在某个事件触发时加载
this.$nextTick(() => {
loadPlugin();
});
- **路由守卫中加载**:
router.beforeEach(async (to, from, next) => {
if (to.meta.requiresPlugin) {
const plugin = await import('my-plugin');
Vue.use(plugin.default);
}
next();
});
138. Vue2中如何实现组件的批量注册?
- 答案:Vue2中实现组件的批量注册有以下几种方式:
- 使用require.context自动导入:
// 自动注册全局组件
const requireComponent = require.context(
'./components', // 组件目录
false, // 是否递归查找子目录
/Base[A-Z]\w+\.(vue|js)$/ // 匹配组件文件名的正则
);
requireComponent.keys().forEach(fileName => {
const componentConfig = requireComponent(fileName);
const componentName = fileName
.split('/')
.pop()
.replace(/\.\w+$/, '');
Vue.component(componentName, componentConfig.default || componentConfig);
});
- **手动批量注册**:
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';
const components = { ComponentA, ComponentB };
Object.keys(components).forEach(name => {
Vue.component(name, components[name]);
});
139. Vue2中如何实现深度响应式监听?
- 答案:Vue2中实现深度响应式监听有以下几种方式:
- watch选项的deep:true:
export default {
watch: {
obj: {
handler(newVal, oldVal) {
// 处理变化
},
deep: true // 深度监听
}
}
};
- **Vue.observable创建响应式对象**:
import Vue from 'vue';
const state = Vue.observable({
nested: {
prop: 'value'
}
});
// 监听变化
watchEffect(() => {
console.log(state.nested.prop);
});
140. Vue2中如何实现过渡动画的钩子函数?
- 答案:Vue2中过渡动画的钩子函数可通过以下方式实现:
<transition
@before-enter="beforeEnter"
@enter="enter"
@after-enter="afterEnter"
@before-leave="beforeLeave"
@leave="leave"
@after-leave="afterLeave"
>
<div v-if="show">Hello</div>
</transition>
export default {
methods: {
beforeEnter(el) {
// 进入前的准备工作
el.style.opacity = 0;
},
enter(el, done) {
// 进入动画
requestAnimationFrame(() => {
el.style.opacity = 1;
done(); // 必须调用以通知Vue动画完成
});
},
// 其他钩子...
}
};
这些钩子可用于实现更复杂的自定义动画效果。