javascript - 如何在 React 中将布尔变量从一个组件传递到另一个组件?
问题描述
我有一个导航栏组件,我在其中将状态设置为一个变量以显示或隐藏我的侧边栏。现在在另一个组件中,我想使用此变量为容器设置一个类(因为展开的侧边栏与我的内容重叠)。这个怎么做?
导航栏.js
import React, { useState } from 'react';
import * as FaIcons from 'react-icons/fa';
import * as AiIcons from 'react-icons/ai';
import { Link } from 'react-router-dom';
import { SidebarData } from './NavbarData';
import './Navbar.css';
import { IconContext } from 'react-icons';
function Navbar() {
const [sidebar, setSidebar] = useState(false);
const showSidebar = () => setSidebar(!sidebar);
console.log(sidebar)
return (
<IconContext.Provider value={{ color: '#fff' }}>
<div className='navbar'>
<Link to='#' className='menu-bars'>
<FaIcons.FaBars onClick={showSidebar} />
</Link>
</div>
<nav className={sidebar ? 'nav-menu active ' : 'nav-menu'}>
<ul className='nav-menu-items' onClick={showSidebar}>
<li className='navbar-toggle'>
<Link to='#' className='menu-bars'>
<AiIcons.AiOutlineClose />
</Link>
</li>
{SidebarData.map((item, index) => {
return (
<li key={index} className={item.cName}>
<Link to={item.path}>
{item.icon}
<span>{item.title}</span>
</Link>
</li>
);
})}
</ul>
</nav>
</IconContext.Provider>
);
}
export default Navbar;
并且在另一个组件中有渲染:
render() {
<Navbar /> //I tried this but don't know what else should I do
return (
<div className="container">
<div className="row">
<div className="col-6 offset-1">
<h1 className=''>Add new product</h1> //here the condition to set a class if sidebar is set to true
<input type-"text" className="grey-text"/>
</div>
</div>
</div>
解决方案
您可以在侧边栏的父组件中拥有侧边栏状态,这样您就可以将状态传递给您的导航栏和其他组件。
导航栏.js
import React, { useState } from 'react';
import * as FaIcons from 'react-icons/fa';
import * as AiIcons from 'react-icons/ai';
import { Link } from 'react-router-dom';
import { SidebarData } from './NavbarData';
import './Navbar.css';
import { IconContext } from 'react-icons';
function Navbar({sidebar, setSidebar}) {
const showSidebar = () => setSidebar(!sidebar);
console.log(sidebar)
return (
<IconContext.Provider value={{ color: '#fff' }}>
<div className='navbar'>
<Link to='#' className='menu-bars'>
<FaIcons.FaBars onClick={showSidebar} />
</Link>
</div>
<nav className={sidebar ? 'nav-menu active ' : 'nav-menu'}>
<ul className='nav-menu-items' onClick={showSidebar}>
<li className='navbar-toggle'>
<Link to='#' className='menu-bars'>
<AiIcons.AiOutlineClose />
</Link>
</li>
{SidebarData.map((item, index) => {
return (
<li key={index} className={item.cName}>
<Link to={item.path}>
{item.icon}
<span>{item.title}</span>
</Link>
</li>
);
})}
</ul>
</nav>
</IconContext.Provider>
);
}
export default Navbar;
其他组件
function YourOtherComponent(){
const [sidebar, setSidebar] = useState(false);//have your state here
render() {
<Navbar sidebar={sidebar} setSidebar={setSidebar}/>//pass it down to your Navbar component
return (
<div className="container">
<div className="row">
<div className="col-6 offset-1">
<h1 className={`${sidebar && "SET YOUR CLASS HERE"}`}>Add new product</h1> {//you could add a class when sidebar is true}
<input type-"text" className="grey-text"/>
</div>
</div>
</div>
)}}
我希望这能够帮到你。
推荐阅读
- python-3.x - 在多处理之后调用 file_write 在一种情况下会导致问题,而在另一种情况下不会
- python - 我可以将多线程应用于 python 中的计算密集型任务吗?
- angular - 单元测试 - onGridReady - Angular 中的 Ag-grid 事件
- reactjs - 如何在具有 echarts-for-react 背景的条形图上动态强调特定类别
- elasticsearch - Couchbase 弹性连接器检查点问题
- javascript - 如果我们发现重复的最大出现次数,如何在 JavaScript 中返回字符串中字母的最大出现次数?
- c# - MVC TextBoxFor 显示日期格式而不是值
- javascript - PerformanceResourceTiming.responseStart 和 PerformanceResourceTiming.requestStart 都为 0,表示状态正常的 http 请求
- arrays - 从数组中获取特定键
- javascript - 当用户在Javascript中使用鼠标滚轮开始滚动时,如何确定用户将滚动多少像素