Vue中RBAC动态权限控制导致组件重复渲染怎么解决?
在用Vue做RBAC权限控制时遇到个问题,我现在通过v-if根据角色权限显示按钮,但发现每次角色信息更新后,所有被控制的组件都会重新渲染,这样会影响性能吗?
比如这样写:
<template>
<button v-if="hasPermission('edit')">编辑</button>
<div v-if="hasPermission('view')" class="detail">
</div>
</template>
<script>
export default {
computed: {
hasPermission() {
return (action) => this.$store.state.permissions.includes(action)
}
}
}
</script>
当store里的permissions数组更新时,所有用到hasPermission的地方都会触发重渲染。试过用计算属性缓存结果,但权限可能动态变化,这样又不安全。有什么更好的方案既能控制权限又减少不必要的渲染?
v-show替代v-if就能避免重复渲染,因为v-show只是控制显示隐藏。如果需要更精细控制,可以试试把权限判断封装成自定义指令。这样只有符合条件的元素才会被插入到 DOM,减少不必要的重绘。
用
methods替代computed,虽然还是会重新计算,但不会像计算属性那样强制重渲染整个组件。如果还是不行,考虑把权限判断逻辑下沉到具体元素的v-bind里,或者用更高阶的渲染优化方案。