我有一个数组,我Map到我的导航栏创建按钮。但我希望一个按钮与一个特定的名称(配置文件),以显示一个按钮时,点击。
目前使用下面的代码,当点击“配置文件”按钮时,没有显示按钮。或者当我尝试使用其他代码时,当点击其他按钮时,按钮显示不是“配置文件”
这是我的数组。
export const NavbarInfo= [
{
id: 1,
name: 'Home',
link: '/',
},
{
id: 2,
name: "Profile",
link: "/profile",
},
{
id: 3,
name: "About",
link: "/about",
},
字符串
这是我迄今为止尝试的条件渲染。我还尝试对onClick
使用三元条件,例如item.name === 'Profile' && showAccountsDropdown
import { NavbarInfo } from '/NavbarInfo'
function Navbar() {
// Hooks /////////////////////
const [navShow, setNavShow] = useState(false)
const [showAccountsDropdown, setShowAccountsDropdown] = useState(false)
const handleDropdown = (item) => {
(item.name === 'Profile'){
setShowAccountsDropdown(!showAccountsDropdown)
}
}
const handleNavSelect = () =>{
setNavShow(!navShow)
}
return (
<div className='navbarContainer '>
{NavbarInfo.map((item) => {
return (
<div className='navOptions flex justify-center items-center py-0'>
<NavLink key={item.id} to={item.link} id={item.id} className='flex flex-row-reverse'
onClick={(item)=>{handleNavSelect();handleDropdown(item)}}>
{showAccountsDropdown? <h1>More info</h1>: null }
{item.name}
<span className='mt-1 mx-1'>{item.icon}</span>
</NavLink>
</div>
)
})}
</div>
</div>
)
}
export default Navbar
型
我想实现类似的东西,但不确定如何去使用Map渲染按钮时。
What I want to achieve
2条答案
按热度按时间gab6jxml1#
您可以创建一个状态变量来跟踪当前选择/单击的项,然后检查它是否与当前Map项匹配。
字符串
//剩余代码
型
PS:当在循环上使用事件监听器时,如onClick here,不要将循环项作为参数传递给事件监听器。
kt06eoxx2#
问题
1.代码使用相同的单个
showAccountsDropdown
状态来控制每个项目的“否”,showAccountsDropdown
将同时为所有项目的true或false。字符串
NavLink
组件的onClick
处理程序将click事件传递给handleDropdown
回调。型
1.可能是复制/粘贴错误/打字错误,但在您的示例中有一个额外的关闭
div
标记,并且handleDropdown
缺少if
语句。解决方案
我建议作以下更新:
1.使用
showAccountsDropdown
状态保存活动item.name
值。1.更新
handleDropdown
以在null和item.name
之间切换setShowAccountsDropdown
。1.在Map导航项时,检查
setShowAccountsDropdown
是否等于当前item.name
,以有条件地呈现“”。修复单击事件问题。代码:
型
x1c 0d1x的数据