介绍:权限管理实现,前端存储完整的路由表,通过后端返回的权限名role来筛选需要渲染的路由,然后利用addRoute来动态添加路由。 由于要把role存到vuex中(存在本地可以随意更改,无法实现真正的权限控制),在导航守卫中先判断是否有role或是路由表来决定是要重新获取权限role还是直接筛选路由表,这时会出现vuex中获取的数据是_observe_:Observe类型,可以console但是无法取值。
问题原因以及解决方法
_observe_:Observe类型的数据无法取值遍历
具体原因:同步和异步的问题,因为是先请求获取到数据存储到vuex中,然后我们来判断vuex中是否有值,这时就存在数据还没有存进去,但是已经读取了,导致无法获取到。
解决方法:
1、既然是异步问题,那么我们只要在已经存上值的情况下再取值就没问题了,可以通过setTimeout,设置定时器延缓我们取值
2、如果还有问题,也可以使用async await函数来等待获取到值在进行后续步骤,
注意:这里不可以直接await定时器,因为await只是等待一个值,定时器开始执行就会给一个值,执行完还有一个返回值,当定时器开始执行时,返回一个值回让await直接继续执行,所以需要通过promise包裹来等待定时器。
getRouterList方法:请求,筛选路由表,以及动态添加路由
备注:addRoute是添加单个路由到一级路由,每次添加都会走一次导航守卫,想要添加子路由,需要addRoute("父级路由的name",要添加的路由对象)。在没有获取到role的数据时,会导致if中的方法内的addRoute重复执行,出现警告Duplicate named routes definition,路由命名name重复,成功获取到role数据后,该警告消失。