设置 useState 时不会重新呈现 className 语句

className statement not re-rending when useState is set

当我单击“线程”/按钮时 handleClick 被调用并且 currentIndex 是 updated/set 触发按钮的 className 三元语句执行为 true。但是,由于有许多 <li> 元素,其他元素不会将 className 重新呈现给 false 语句。 currentIndex 对于这些元素不应该 == thread.id

ThreadItem 组件

import { useState } from 'react'

const ThreadItem = ({ thread, changeThread }) => {

    const [currentIndex, setCurrentIndex] = useState('')

    // On thread click
    const handleClick = (threadId) => {
        setCurrentIndex(threadId)
    }

    return (
        <li className="chat-item">
            <form onSubmit={changeThread}>
                <button className={currentIndex == thread.id ? 'side-menu-links-focus threads' : 'side-menu-links threads'} onClick={() => handleClick(thread.id)}>{`#${thread.threadType}`}</button>
            </form>
        </li>
    )
}

export default ThreadItem

父级 ThreadList 组件

import ThreadItem from './ThreadItem'

const ThreadList = ({ threads, changeThread }) => {

    return (
        <ul className='chat-list'>
            {threads.map((thread) => (
                <ThreadItem
                    key={thread.id}
                    thread={thread}
                    changeThread={changeThread}
                />
            ))}
        </ul>
    )
}

export default ThreadList

如果我对你的问题理解正确,你想点击一个按钮,然后有一个 ThreadItem 来改变 className

我看到的问题是,您已将 useState 添加到每个 ThreadItem。相反,您应该将上面的状态移动到 ThreadList 组件。

这样,整个项目列表只有一个状态实例。只需将 active 属性和 onClick 处理程序传递给每个 ThreadItem.

线程列表

import React, { useState } from 'react';
import ThreadItem from './ThreadItem';

const ThreadList = ({ threads, changeThread }) => {
  const [currentIndex, setCurrentIndex] = useState('');

  // On thread click
  const handleClick = (threadId) => {
    setCurrentIndex(threadId);
  };

  return (
    <ul className="chat-list">
      {threads.map((thread) => (
        <ThreadItem
          key={thread.id}
          thread={thread}
          changeThread={changeThread}
          isActive={currentIndex === thread.id}
          onClick={() => handleClick(thread.id)}
        />
      ))}
    </ul>
  );
};

export default ThreadList;

线程项

import React from 'react';

const ThreadItem = ({ thread, changeThread, isActive, onClick }) => {
  return (
    <li className="chat-item">
      <form onSubmit={changeThread}>
        <button
          className={isActive ? 'side-menu-links-focus threads' : 'side-menu-links threads'}
          onClick={onClick}
        >{`#${thread.threadType}`}</button>
      </form>
    </li>
  );
};

export default ThreadItem;