【问题标题】:Display sidebar menu elements based on user's role, with "yaminncco/vue-sidebar-menu" package根据用户角色显示侧边栏菜单元素,使用“yaminncco/vue-sidebar-menu”包
【发布时间】:2021-10-30 11:19:39
【问题描述】:

您好,我正在使用带有 Inertia JS 的 Laravel Breeze。我正在使用 "yaminncco / vue-sidebar-menu package" 作为侧边栏。

我在问是否有办法根据用户角色显示菜单元素(管理员:查看所有内容,简单用户,...)。包文档中没有关于此的内容。

那么,如果有人有想法或者可以建议在使用 Laravel Breeze 时构建侧边栏的更好方法(或包)?

谢谢

【问题讨论】:

  • 能否将用户角色作为道具传递给组件,然后根据道具检查角色?

标签: laravel vue.js sidebar inertiajs laravel-breeze


【解决方案1】:

如果这是您想在所有页面中执行的操作,您可以通过HandleInertiarRequests 中间件share 方法共享属性。

public function share(Request $request)
{
   return array_merge(parent::share($request), [
      'user_role' => Auth::user()->role
   ]);
}

现在,您的所有页面都将在您的 Vue 页面组件上的 $pages.props.user_role 处收到此道具。然后你可以这样做:

<template>
    <sidebar-menu v-if="user_role === 'admin'" :menu="menu" />
</template>

<script>
export default {
   props: {
      user_role: String
   }
}
</script>

如果您在非页面组件的 Vue 组件上使用侧边栏组件,例如在布局组件中,您将拥有来自 $page.props 的计算属性:

<template>
    <sidebar-menu v-if="user_role === 'admin'" :menu="menu" />
</template>

<script>
export default {
   computed: {
      user_role () {
         return this.$page.props.user_role
      }
   }
}
</script>

如果您想根据user_role 选择菜单应呈现的菜单项,您可以计算menu 属性:

export default {
   data () {
      return {
         menuItems: [
            {
               href: '/',
               title: 'Dashboard',
               icon: 'fa fa-user'
            },
            {
               href: '/charts',
               title: 'Charts',
               icon: 'fa fa-chart-area',
               admin: true
            } 
         ]
      }
   },
   computed: {
      menu () {
         if (this.user_role === 'admin') {
            return this.menuItems // return all the items
         }

         return this.menuItems.filter((item) => {
            return !item.admin // return only items NOT marked as admin
         })
      }
   }
}

【讨论】:

  • 我正在使用“yaminncco/vue-sidebar-menu”包。因此,当您将 user_role 作为道具传递给该组件时,有一种方法可以从组件内部处理它,以便仅显示取决于用户角色的链接。如果您有任何想法,这是包的链接,否则我知道 HandleInertiarRequests。这是包链接:github.com/yaminncco/vue-sidebar-menu/tree/next
  • 好的...现在我明白了!我更新了答案以包含此功能...看看它是否是您正在寻找的...
  • 感谢您的帮助,非常感谢,它有效。我想在最后一节中添加一个小细节,您提到了我之前添加的过滤器方法 return ,以使其像这样工作:return this.menuItems.filter(item => {return !item.admin })跨度>
  • 对...我错过了...谢谢...很高兴我得到了帮助...
猜你喜欢
  • 2023-01-02
  • 2018-01-01
  • 2022-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
相关资源
最近更新 更多