【问题标题】:Setting state of nested array with React Hooks使用 React Hooks 设置嵌套数组的状态
【发布时间】:2019-03-18 16:19:08
【问题描述】:

我使用 React Hooks 已经有一段时间了,但对我来说最大的问题是使用数组。

我正在为团队制作注册表。球队有球员(字符串数组)。

用户应该能够添加一个团队,并且对于每个团队,都会显示一个输入,并在输入上方显示团队中的当前成员。

我的问题:如何使用 React Hooks 设置嵌套数组的状态?

在按钮点击时,它应该(现在)将一个字符串添加到当前球队的球员数组中。

我的代码:

interface ITeam {
    id: string;
    players: Array<string>;
}


export default function Team() {
const [teams, setTeams] = useState<Array<ITeam>>([{id: '1', players: ['a', 'b']}]);

return (
    <div>
        {teams.map((team, teamIndex) => {
            return (
                <div key={teamIndex}>
                    <h2>Team {teamIndex + 1}</h2>
                    <ul>
                        {team.players.map((player, playerIndex) => {
                            return (
                                <div key={playerIndex}>
                                    {player}
                                </div>
                            );
                        })}
                    </ul>
                    <button onClick={() => setTeams([...teams, team.players.concat('c')])}>Add player</button>
                </div>
            );
        })}
    </div>
);
}

【问题讨论】:

    标签: javascript reactjs typescript react-hooks


    【解决方案1】:

    您需要使用团队索引并使用 spread syntaxslice 更新特定团队的价值

      function addPlayer(index) {
        setTeams(prevTeams => {
          return [ ...prevTeams.slice(0, index), {...prevTeams[index], players: [...prevTeams[index].players, "c"] }, ...prevTeams.slice(index+1)];
        });
      }
    

    或者更好的是你可以使用地图来更新

    function addPlayer(index) {
      setTeams(prevTeams => {
        return prevTeam.map((team, idx) => {
          if(index === idx) {
            return {...prevTeams[index], players: [...prevTeams[index].players, "c"]}
          } else {
            return team;
          }
        })
      });
    }
    

    const { useState } = React;
    
    function Team() {
      const [teams, setTeams] = useState([{ id: "1", players: ["a", "b"] }]);
    
      function addPlayer(index) {
        setTeams(prevTeams => {
          return [ ...prevTeams.slice(0, index), {...prevTeams[index], players: [...prevTeams[index].players, "c"] }, ...prevTeams.slice(index+1)];
        });
      }
    
      return (
        <div>
          {teams.map((team, teamIndex) => {
            return (
              <div key={teamIndex}>
                <h2>Team {teamIndex + 1}</h2>
                <ul>
                  {team.players.map((player, playerIndex) => {
                    return <div key={playerIndex}>{player}</div>;
                  })}
                </ul>
                <button onClick={() => addPlayer(teamIndex)}>Add player</button>
              </div>
            );
          })}
        </div>
      );
    }
    
    ReactDOM.render(<Team />, document.getElementById("root"));
    <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    
    <div id="root"></div>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      • 2018-12-28
      • 2023-01-31
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 2020-11-02
      相关资源
      最近更新 更多