更新反应状态挂钩中的单个项目

Updating single item in react state hook

我有数组 useState 挂钩,它由具有类名的项目组成。我想从该挂钩更新单个项目的类名。如何更新 useState hook.Of 课程的单个值我将在更新前放置条件。 这是代码 -

 display.map( word => 
   ( Words[leftPointer] === word.props.children ? 
      {...display, word:(<span key={uuid()} className="singleWord greenword"> 
      {Words[leftPointer]}</span>)} :
        display )
        )
 setDisplay(display)

此处显示包含跨度数组。 我想要的是根据条件示例更改类名-更新项目后 className = "singleWord greenword" 应该是该项目的 className="singleWord"。

您能否只使用一个状态变量来保存 className 的文本并将 useState 挂钩上的状态变量更新为您想要的任何值?

Map 函数将 return 一个新数组,因此您只需将数组存储在一个新变量中并使用该新变量设置状态

const newDisplay = display.map( (word) =>{ 
    if(Words[leftPointer] === word.props.children){
      return {word:(<span key={uuid()} className="singleWord greenword"> 
      {Words[leftPointer]}</span>)}
    }else{
        return word
    }
  })
  setDisplay(newDisplay)

我建议不要在州域中设置 className,因为它是 UI 域的一部分。相反,数据更改可用于在 UI 渲染中发出响应信号。这就是程序 data-driven.

的意思

这是一个最小的可验证示例。 运行 下面的程序并更改一些数量以查看 display 状态更新。 className 根据应用于应用程序状态的条件自动更改。

function App() {
  const [display, setDisplay] = React.useState([
    {item: "walnut", quantity: 0 },
    {item: "peanut", quantity: 3 },
    {item: "donut", quantity: 6 }
  ])
  function update(index) { return event =>
    setDisplay([
      ...display.slice(0, index),
      { ...display[index], quantity: Number(event.target.value) },
      ...display.slice(index + 1)
    ])
  }   
  return <div>
    {display.map((d, index) =>
      <div key={index}>
        {d.item}:
        <input
          className={d.quantity > 0 ? "instock" : "outofstock" }
          value={d.quantity}
          onChange={update(index)}
        />
      </div>
    )}
    <div>{display.every(d => d.quantity > 0) ? "✅" : "❌"}</div>
    <pre>{JSON.stringify(display, null, 2)}</pre>
  </div>
}

ReactDOM.render(<App/>, document.querySelector("#app"))
input { outline: 0 }
.instock { border-color: limegreen; }
.outofstock { border-color: red; }
pre { padding: 0.5rem; background-color: #ffc; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.14.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.14.0/umd/react-dom.production.min.js"></script>
<div id="app"></div>