【问题标题】:How to display menu items based on sessionStorage如何基于 sessionStorage 显示菜单项
【发布时间】:2021-10-22 10:11:51
【问题描述】:

我有点迷失在哪一个是最好的方法。从 API 获取用户数据后,我将用户数据存储在 sessionStorage 中。如何根据角色(即管理员、代表、访客)显示菜单项。

我有一个基本的 Bootstrap 侧边栏,如下所示。

<ul class="sidebar-nav">
 <li><a>Home</a>
   <ul class="sidebar-dropdown">
     <li>Default</li>
     <li>Reports</li>
   </ul>
 </li>
 <li><a>Contact</a>
    <ul class="sidebar-dropdown">
      <li>Admin Contact</li>
      <li>Contact 1</li>
    </ul>
 </li>
</ul>

我是否应该根据菜单项的角色以及在加载显示或隐藏菜单项时运行的 JavaScript 函数向菜单项添加类??

任何指导将不胜感激。

JSFIDDLE

【问题讨论】:

  • 应该是其他方式。收到数据后,您应该通过可用链接填充列表ul。隐藏是不够的。您确实想删除它们,因为用户根本无权访问它们。
  • 类似const list = routes.map( route =&gt; `&lt;li&gt;&lt;link href=${route.link}&gt;${route.title}&lt;/link&gt;&lt;/li&gt;);,然后将其注入您的ulULelement.innerHTML = list.join("")
  • 感谢您的回复。我最初的想法是这样的对象(请参阅更新的小提琴):link 但我无法让它与您提供的示例一起使用。我还应该如何构建我的链接??
  • 您有几个问题,请参阅我对工作示例的回答

标签: javascript bootstrap-4 user-permissions user-roles session-storage


【解决方案1】:

您想要的是根据数据动态呈现列表。从会话存储接收数据不是问题,因为它可以通过

JSON.parse(sessionStorage.getItem('data'));

您的问题是渲染它们。首先尝试使用硬编码数据,看看您是否能够呈现您想要的内容,然后从存储中插入数据。举个例子 https://codesandbox.io/s/elated-fast-my3ud?file=/src/index.js

const routes = [
  {
    href: "/home",
    title: "Home",
    children: [
      {
        href: "/home/defaults",
        title: "Defaults"
      },
      {
        href: "/home/reports",
        title: "Reports"
      }
    ]
  },
  {
    href: "/contact",
    title: "Contact",
    children: [
      {
        href: "/contact/admin-contact",
        title: "Admin Contanct"
      },
      {
        href: "/contact/contact-1",
        title: "Contact 1"
      }
    ]
  }
];

function renderSingleRoute(route) {
  const children = route.children ? renderRoutes(route.children) : "";
  return `
    <li>
      <a href="${route.href}">${route.title}</a>
      ${children}
    </li>
  `;
}

function renderRoutes(routes) {
  return `
    <ul>
      ${routes.map((route) => renderRoute(route)).join("")}
    </ul>
  `;
}

document.getElementById("app").innerHTML = renderRoutes(routes);

所以这里的想法是根据需要构建路由,然后将其传递给渲染函数

【讨论】:

  • 感谢您的工作示例,我得到了它的工作。基本上返回的用户数据应该包括权限路由对象,这样我就可以建立我的链接。为什么li 元素后面有逗号? updated example
  • 它是因为routes.map((route) =&gt; renderRoute(route)) 将呈现为以逗号分隔的数组。只需以routes.map((route) =&gt; renderRoute(route)).join("") 的身份加入他们。我更新了示例
  • 如果它回答了您的问题,请接受答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多