1. 在复杂后台系统中,如何实现动态路由权限控制?描述具体实现步骤。
-
:
- 用户登录后,从服务端获取权限路由配置(JSON格式)。
- 使用
router.addRoute()
动态添加路由,过滤无权限的路由。 - 结合全局路由守卫
beforeEach
校验权限,跳转404或登录页
ini
// 动态添加路由示例
const dynamicRoutes = await fetchUserRoutes();
dynamicRoutes.forEach(route => router.addRoute(route));
2. 如何优化Vue 3中渲染超长列表(10万条数据)的性能?
-
:
- 虚拟滚动 :仅渲染可视区域内的元素(如
vue-virtual-scroller
库)。 - 分页/分块加载:分段请求数据,减少单次渲染量。
- 减少响应式依赖 :使用
shallowRef
或非响应式数组存储数据。 - 避免内联事件 :使用事件委托替代每个元素的
@click
。
- 虚拟滚动 :仅渲染可视区域内的元素(如
3. 如何用Vue 3实现一个支持搜索、排序和分页的表格组件,并保证复用性?
-
:
- Props设计 :接收
data
、columns
、pageSize
等配置。 - 组合式API封装逻辑 :抽取
useTable
Hook处理过滤、排序、分页。 - 插槽扩展:允许自定义列内容和操作按钮。
- 性能优化:防抖搜索、缓存排序结果。
- Props设计 :接收
4. 在Vue 3中,如何实现表单的复杂联动校验(如字段A变化时,动态校验字段B)?
-
:
- 使用
vuelidate
或vee-validate
库,结合watch
监听字段变化。 - 自定义校验规则,通过
validate
函数触发关联字段校验。
- 使用
ini
watch(() => form.fieldA, (newVal) => {
if (newVal === 'xxx') {
form.fieldBRules.required = true;
}
});
5. 如何用自定义Hook封装一个实时保存表单草稿的功能?
- :
javascript
// useAutoSave.js
import { ref, watch, onBeforeUnmount } from 'vue';
export function useAutoSave(formData, key) {
const save = () => localStorage.setItem(key, JSON.stringify(formData));
const stop = watch(formData, save, { deep: true });
onBeforeUnmount(() => {
save();
stop();
});
}
6. 在Vue 3项目中如何集成第三方图表库(如ECharts),并保证响应式更新?
-
:
- 在
onMounted
中初始化图表实例,绑定DOM元素。 - 使用
watch
监听数据变化,调用echartsInstance.setOption()
更新。 - 在
onBeforeUnmount
中销毁实例,避免内存泄漏。
- 在
7. 如何用Vue 3的Teleport组件实现全局弹窗,并解决样式隔离问题?
- :
xml
<!-- 将弹窗渲染到body末尾 -->
<teleport to="body">
<div class="modal" v-if="showModal">
<!-- 内容 -->
</div>
</teleport>
8. 如何用自定义指令实现按钮级权限控制?
- :
ini
// v-permission指令
app.directive('permission', {
mounted(el, binding) {
const userPermissions = store.state.user.permissions;
if (!userPermissions.includes(binding.value)) {
el.remove();
}
}
});
ini
<button v-permission="'user:delete'">删除用户</button>
9. 在Vue 3中,如何避免组件不必要的重新渲染?举两个实际优化手段。
-
:
- v-once/v-memo:缓存静态内容或依赖特定条件的变化。
- shallowRef/shallowReactive:非深度响应式数据减少触发更新。
- 合理拆分组件:隔离高频变化的部分,避免父组件整体更新。