我正在尝试使用状态管理来修改我的应用程序并使其更加通用。基本上我的应用程序是嵌入了 tableau 仪表板的 React Web 应用程序,我需要通过从后端读取指定我们想要的项目的 json 来在应用程序中填充特定的路由(包含特定的仪表板)。
我通过两种方式需要它:
UI 项目切换让我可以在项目之间切换 通过前端从登录尝试中收到的 JWT(成功后) 我认为唯一需要管理的状态是导航栏及其数据,将呈现相关路径,从而仅按项目/用户启用相关仪表板。
这是我的导航栏的代码:
import React, { useState, useEffect } from "react"; import { Link, useLocation } from "react-router-dom"; import { NavbarData } from "./NavbarData"; import { IconContext } from "react-icons"; import "./Navbar.css"; import Hamburger from "./Icons/Hamburger.svg"; import "./Icons/p_logo_color.png"; import Persona from "./Icons/Persona.svg"; import Logout from "./Icons/Logout.svg"; //someting //Navbar function function Navbar() { const [sidebar, setSidebar] = useState(false); const showSidebar = () => setSidebar(!sidebar); const [pageName, setPageName] = useState('Operational Overview'); const location = useLocation(); const getPageTitleByUrl = (path) => { NavbarData.filter((navItem) => { if(navItem.path === path) { setPageName(navItem.title); } return true; } ) }; const userConfigPageTitle = (path) => { setPageName("User Information"); } useEffect(() => { if(location.pathname) { getPageTitleByUrl(location.pathname); } }, [location] ); return ( <> <IconContext.Provider value={{ color: "undefined" }}> <div className="navbar"> <Link to="#" className="menu-bars"> <img src={Hamburger} alt="hamburger" onClick={showSidebar} /> </Link> <div className="criminal-records">Elecciones Guatemala |</div> <div className="pageTitle"><h1>{pageName}</h1></div> <> <div><img className="userIcon" src={Persona} alt="persona" /> </div> <div className="userButton">User123#</div> </> <Link to='/' className="logout-button"> <div><img className="logoutIcon" src={Logout} alt="persona" /> </div> <div className="logoutButton">Logout</div> </Link> </div> <nav className={sidebar ? "nav-menu active" : "nav-menu"}> <ul className="nav-menu-items" onClick={showSidebar}> <li className="navbar-toggle"> </li> {NavbarData.map((item, index) => { return ( <li key={index} className={item.cName}> <Link to={item.path}> <span className="navbutton-icon">{item.icon}</span><span className="navbutton-text" >{item.title}</span> </Link> </li> ); })} </ul> </nav> </IconContext.Provider> </> ); } export default Navbar;
这是 NavbarData:
import React from 'react' import startpageIcon from './Icons/startpage.svg'; import performance from './Icons/performance.svg'; import bars from './Icons/bars.svg'; import simulation from './Icons/simulation.svg'; import fraud from './Icons/fraud.svg'; import deployForNow from './Icons/Profiles.svg'; import Planning from './Icons/plan.svg'; import deployment from './Icons/layer1.svg'; import barswithperson from './Icons/barswithperson.svg' export const NavbarData = [ { title: 'Simulación', path: '/monitoringoverview', icon: <img src={simulation} alt="" />, cName: 'nav-text' }, { title: "Empadronados", path: "/performancequality", icon: <img src={barswithperson} alt="" />, cName: 'nav-text' } ]
所以基本上我需要的就是连接下拉切换器来更改 NavbarData 内的 json 结构化数据,并将这些变化中的每一个定义为状态。因此,由于这是一个非常简单的状态管理任务,我想使用 React Context 来解决它,我该怎么做?
提前致谢!
使用 React Context 控制导航栏的状态:
§ 要定义上下文及其初始状态,请创建一个名为 NavbarContext.js 的文件。
§ 使用 NavbarProvider 组件包围您的应用程序或应用程序中的目标区域,这应该在您的主文件(即 App.js)中完成。
§ 使用上下文来操作状态,您可以相应地修改导航栏组件。
§ 在接收导航栏的 JSON 数据时(通常在登录后),您可以使用上下文中的 setNavbarData 函数更新 navbarData 状态。
使用 setNavbarData 更新 navbarData 状态现在会导致导航栏组件重新渲染,最终导致更新的数据显示在导航栏中。
React Router 需要正确的设置,并且必须将正确的依赖项导入到您的代码中。记下以验证这些步骤是否已完成。