Reactjs为循环中的每个项设置状态

pkbketx9  于 2023-01-12  发布在  React
关注(0)|答案(1)|浏览(164)

我有一个名为data的对象数组,实际上它是从API的真实的代码中获取的,我不能更改它的结构。所以我想在一个表中显示数据,它有一个名为list的嵌套对象,其中包含位置和价格,我想在用户更改位置时显示为选择选项,在它前面显示自己的价格。

{data.serverTypes.map((Item, Index) => {
return (
  <tr key={Index}>
    <td>{Item.id}</td>
    <td>
      <select onChange={(e) => setPrice(e.target.value)}>
        {Item.list.map((Location, Idx) => {
          return (
            <option value={Location.price}>
              {Location.location}
            </option>
          );
        })}
      </select>
    </td>
    <td>{price}</td>
  </tr>
);
})}

但我不能弄清楚我如何显示每个价格形式每个位置时,我迭代对象,因为我定义了循环外的状态。为了更好地理解,请参阅现场演示,改变选择选项,以查看结果。它已经显示所有的价格,但我想显示每个位置的价格前面。

**一个

f87krz0w

f87krz0w1#

考虑为每个ServerType创建一个子组件来保存其自己的状态。
此外,您选择的是位置,而不是价格。因此,价格可以从selectedLocation导出。

export default function App() {
  const data = {
    serverTypes: [
      {
        id: 1,
        list: [
          { location: "usa", price: 1000 },
          { location: "germany", price: 2000 }
        ]
      },
      {
        id: 2,
        list: [
          { location: "usa", price: 2500 },
          { location: "germany", price: 3000 }
        ]
      }
    ]
  };

  return (
    <div className="App">
      <table>
        <thead>
          <tr>
            <th>id</th>
            <th>location</th>
            <th>price</th>
          </tr>
        </thead>
        <thead>
          {data.serverTypes.map((serverType, index) => (
            <ServerType key={index} serverType={serverType} />
          ))}
        </thead>
      </table>
    </div>
  );
}

const ServerType = ({ serverType }) => {
  const [selectedLocation, setSelectedLocation] = useState(0);
  const { id, list } = serverType;
  return (
    <tr>
      <td>{id}</td>
      <td>
        <select onChange={({ target }) => setSelectedLocation(target.value)}>
          {list.map(({ location }, index) => {
            return <option value={index}>{location}</option>;
          })}
        </select>
      </td>
      <td>{list[selectedLocation].price}</td>
    </tr>
  );
};

相关问题