reactjs 在react中有条件渲染到一个按钮

byqmnocz  于 2023-11-18  发布在  React
关注(0)|答案(2)|浏览(128)

我有一个数组,我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

gab6jxml

gab6jxml1#

您可以创建一个状态变量来跟踪当前选择/单击的项,然后检查它是否与当前Map项匹配。

const [selected, setSelected] = useState("");

字符串
//剩余代码

{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={()=>{setSelected(item.name);handleNavSelect();handleDropdown(item)}}>
                                {showAccountsDropdown && selected === item.name? <h1>More info</h1>: null }
                                {item.name}
                                <span className='mt-1 mx-1'>{item.icon}</span>
                            </NavLink>
                        </div>
                    )
                })}


PS:当在循环上使用事件监听器时,如onClick here,不要将循环项作为参数传递给事件监听器。

kt06eoxx

kt06eoxx2#

问题

1.代码使用相同的单个showAccountsDropdown状态来控制每个项目的“否”,showAccountsDropdown将同时为所有项目的true或false。

const [showAccountsDropdown, setShowAccountsDropdown] = useState(false)

...

{NavbarInfo.map((item) => {
  return (
    <div className="navOptions flex justify-center items-center py-0">
      <NavLink ... >
        {showAccountsDropdown ? <h1>More info</h1> : null}
        ...
      </NavLink>
    </div>
  );
})}

字符串

  1. NavLink组件的onClick处理程序将click事件传递给handleDropdown回调。
const handleDropdown = (item) => { // <-- item is click event
  (item.name === "Profile") {   // <-- never true
    setShowAccountsDropdown(!showAccountsDropdown);
  }
};

...

{NavbarInfo.map((item) => {
  return (
    <div className="navOptions flex justify-center items-center py-0">
      <NavLink
        ...
        onClick={(item) => {    // <-- click event
          handleNavSelect();
          handleDropdown(item); // <-- click event passed through
        }}
      >
        ...
      </NavLink>
    </div>
  );
})}


1.可能是复制/粘贴错误/打字错误,但在您的示例中有一个额外的关闭div标记,并且handleDropdown缺少if语句。

解决方案

我建议作以下更新:
1.使用showAccountsDropdown状态保存活动item.name值。
1.更新handleDropdown以在null和item.name之间切换setShowAccountsDropdown
1.在Map导航项时,检查setShowAccountsDropdown是否等于当前item.name,以有条件地呈现“”。修复单击事件问题。
代码:

function Navbar() {
  const [navShow, setNavShow] = useState(false);

  // Initially null, e.g. no active item
  const [showAccountsDropdown, setShowAccountsDropdown] = useState(null);

  const handleDropdown = (item) => {
    // If item.name is already in state, set back to null to deselect
    // otherwise set to new item.name
    setShowAccountsDropdown((show) => (show === item.name ? null : item.name));
  };

  const handleNavSelect = () => {
    setNavShow(show => !show);
  };

  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={() => {
                handleNavSelect();
                handleDropdown(item); // <-- pass current mapped item
              }}
            >
              {/* Check if current item is the "active" one */}
              {showAccountsDropdown === item.name ? <h1>More info</h1> : null}
              {item.name}
              <span className="mt-1 mx-1">{item.icon}</span>
            </NavLink>
          </div>
        );
      })}
    </div>
  );
}


x1c 0d1x的数据

相关问题