【问题标题】:ReferenceError: Cannot access 'players' before initializationReferenceError:在初始化之前无法访问“玩家”
【发布时间】:2021-09-30 12:18:25
【问题描述】:

根据您 (StackOverflow) 的建议,我已将我的应用程序重写为 [几个组件]https://codesandbox.io/s/points-scored-forked-brnni?file=/src/components/ScoredPointsList.js:0-561

现在当我运行 yarn start 时,我得到一个参考错误。谷歌搜索后,我尝试了“一切”,包括: 从 npm 更改为 yarn,在 package.json 中更改……但似乎没有任何帮助。

如何更改代码以使其正常工作?


import NewPointsScored from './components/NewPointsScored';
import ScoredPointsList from './components/ScoredPointsList';

function App() {
  const [scorerNumber, setScorerNumber] = useState('');
  const [totPoints, setTotPoints] = useState(0);
  const [players, setPlayers] = useState([]);

  const sortedPlayers = [...players].sort(
    (a, b) => a.scorerNumber - b.scorerNumber
  );
  const onePointHandler = () => {
    // eslint-disable-next-linex
    const players = [...players];

    if (scorerNumber.trim() === 0) {
      return;
    }

    const posit = players
      .map((player) => player.scorerNumber)
      .indexOf(+scorerNumber);
    if (posit !== -1) {
      setPlayers((players) =>
        players.map(
          (player, i) =>
            (i = posit ? {...player, totPoints: player.totPoints + 1} : player)
        )
      );
    } else {
      const newScorer = {
        id: Math.floor(Math.random() * 1000),
        scorerNumber: +scorerNumber,
        totPoints: totPoints + 1,
      };
      setPlayers([...players, newScorer]);
      setTotPoints(totPoints);
    }
    setScorerNumber('');
  };
  const twoPointsHandler = (e) => {
    e.preventDefault();
    console.log('scored 2p');
  };
  const threePointsHandler = (e) => {
    e.preventDefault();
    console.log('3p Made!');
  };
  return (
    <div className="App">
      <NewPointsScored
        setScorerNumber={setScorerNumber}
        scorerNumber={scorerNumber}
        onOneP={onePointHandler}
        onTwoP={twoPointsHandler}
        onThreeP={threePointsHandler}
      />
      <ScoredPointsList sortedPlayers={sortedPlayers} />
    </div>
  );
}

export default App;

提前致谢 问候 彼得

【问题讨论】:

    标签: reactjs react-hooks


    【解决方案1】:

    您正在尝试在初始化 player 变量之前对其进行修改,您可以使用Memo(仅在玩家值更改时运行)并在 sortPlayers 可用后修改它,并且您还试图再次初始化导致问题的播放器

    const sortedPlayers =useMemo(()=>{
      return players.sort(
        (a, b) => a.scorerNumber - b.scorerNumber
      );
    },[players]) 
    

    完整代码:

    import NewPointsScored from './components/NewPointsScored';
    import ScoredPointsList from './components/ScoredPointsList';
    import {useMemo} from 'react'
    
    function App() {
      const [scorerNumber, setScorerNumber] = useState('');
      const [totPoints, setTotPoints] = useState(0);
      const [players, setPlayers] = useState([]);
    
     const sortedPlayers =useMemo(()=>{
      return players?.sort(
        (a, b) => a.scorerNumber - b.scorerNumber
      );
    },[players]) 
    
    
    const onePointHandler = () => {
        const _players = [...players];
    
        if (scorerNumber.trim() === 0) {
          return;
        }
    
        const posit = _players
          .map((player) => player.scorerNumber)
          .indexOf(+scorerNumber);
        if (posit !== -1) {
          setPlayers((players) =>
            players.map(
              (player, i) =>
                (i = posit
                  ? { ...player, totPoints: player.totPoints + 1 }
                  : player)
            )
          );
        } else {
          const newScorer = {
            id: Math.floor(Math.random() * 1000),
            scorerNumber: +scorerNumber,
            totPoints: totPoints + 1
          };
          setPlayers([..._players, newScorer]);
          setTotPoints(totPoints);
        }
        setScorerNumber("");
      };
      const twoPointsHandler = (e) => {
        e.preventDefault();
        console.log('scored 2p');
      };
      const threePointsHandler = (e) => {
        e.preventDefault();
        console.log('3p Made!');
      };
      return (
        <div className="App">
          <NewPointsScored
            setScorerNumber={setScorerNumber}
            scorerNumber={scorerNumber}
            onOneP={onePointHandler}
            onTwoP={twoPointsHandler}
            onThreeP={threePointsHandler}
          />
          <ScoredPointsList sortedPlayers={sortedPlayers} />
        </div>
      );
    }
    
    export default App;
    

    参考沙盒:

    【讨论】:

    • 感谢 Goutham!不幸的是,仍然遇到相同的参考错误
    • 对不起,我的错。它工作得非常完美。没有检查你的完整代码,只是复制了 useMemo 部分......
    • 其实把11-13行改成:const scorers = [...sortedPlayers],15行改成const onList = scorers .map((scorer) =&gt; scorer.scorerNumber) .indexOf(+scorerNumber);好像就够了
    猜你喜欢
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 2021-09-10
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多