【问题标题】:How to track which list item was clicked in React?如何跟踪在 React 中单击了哪个列表项?
【发布时间】:2020-09-21 15:14:44
【问题描述】:

我有一个菜单选项列表,我需要跟踪单击了哪个选项。我还需要对单击的选项应用不同的样式。以下是相关代码:

export default function account() {
  let [currentTab, setCurrentTab] = useState("username")

  const handleListItemClick = (e) => {
    let targetId = e.target.id || e.target.parentNode.id
    if (currentTab !== targetId) setCurrentTab(targetId)
  }

  return (
    <>
      <Layout>
        <div className={styles.contentWrapper}>
          <div className={styles.leftBar}>
            <ul className={styles.listContainer}>
              <li className={`${styles.listItem} ${currentTab === "username" && styles.listItemActive} `}
                id="username"
                onClick={handleListItemClick}>
                <FiUser color="#5650bf" size="18px" />
                <span>Update username</span>
              </li>
              <li className={`${styles.listItem} ${currentTab === "topics" && styles.listItemActive} `}
                id="topics"
                onClick={handleListItemClick}>
                <FiBookmark color="#5650bf" size="18px" />
                <span>My topics</span>
              </li>
              <li className={`${styles.listItem} ${currentTab === "about" && styles.listItemActive} `}
                id="about"
                onClick={handleListItemClick}>
                <FiInfo color="#5650bf" size="18px" />
                <span>Update About page</span>
              </li>
            </ul>
          </div>
        </div>
      </Layout>
    </>
  )
}

代码有效,但是,我不确定它是否是使用 React 的正确方法,以及是否有更好的解决方法。谢谢。

【问题讨论】:

  • 您做得完全正确...我不确定您是否需要问这个问题...?
  • 一个小整理,你需要包裹整个return语句的片段吗?它只包装了一个 JSX 元素,因此您可以删除它。
  • @DBS 这不是所有的代码,只是一个相关的部分。不过谢谢!

标签: javascript reactjs


【解决方案1】:

与其拥有 ID,不如在调用时将选项卡的名称传递给点击回调?

此外,这些部分会产生不良标记:

className={`${styles.listItem} ${currentTab === "username" && styles.listItemActive}

因为如果条件不满足,它们将评估为包含falseclassName。使用条件运算符,以便它们评估为空字符串。

改变

<li className={`${styles.listItem} ${currentTab === "username" && styles.listItemActive} `}
  id="username"
  onClick={handleListItemClick}>
  <FiUser color="#5650bf" size="18px" />
  <span>Update username</span>
</li>

<li
  className={`${styles.listItem} ${currentTab === "username" ? styles.listItemActive : ''} `}
  onClick={() => setCurrentTab('username')}
>
  <FiUser color="#5650bf" size="18px" />
  <span>Update username</span>
</li>

不需要handleListItemClick - 如果新状态与旧状态相同,则不会发生变化。

你也可以把类名抽象成一个DRY-er的函数:

const getClass = thisTab => `${styles.listItem} ${currentTab === thisTab ? styles.listItemActive : ''}`;
className={getClass('username')}
className={getClass('topics')}
className={getClass('about')}

【讨论】:

  • onClick={() =&gt; setCurrentTab('username')} 是否有性能损失,而不是 onClick={setCurrentTab('username')} 并让 setCurrentTab 返回回调函数?
  • @TKoL 可能会慢一点,但绝对是微不足道的,尤其是考虑到这些是个别独特的元素而不是庞大的列表。最好先争取简洁易读的代码。
  • @CertainPerformance 在“个别独特元素”这一点上是可以理解的。好电话
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多