首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么简单的useState初始化不能工作?

为什么简单的useState初始化不能工作?
EN

Stack Overflow用户
提问于 2022-10-15 20:46:09
回答 1查看 50关注 0票数 -3

我有这个反应码:

代码语言:javascript
复制
import React, { useState, useEffect } from "react";
import axios from "axios";

function App() {
  const [players, setPlayers] = useState([]);

  // Get all Players
  const getAllPlayersUrl = "http://localhost:5087/api/GetAllPlayers";
  useEffect(() => {
    axios.get(getAllPlayersUrl).then((response) => {
      setPlayers(response.data);
    });
  }, []);

  const [playerCount, setPlayerCount] = useState(players.length);

  return (
    <div>
      <p>{`This is how many there are: ${playerCount}`}</p>
    </div>
  );
}

export default App;

我想打印多少初始球员使用playerCount变量。但是它说它是零:

这是有多少个:0

如果我打印players.length,它将输出正确的数字:

代码语言:javascript
复制
 <p>{`This is how many there are: ${players.length}`}</p>

这是有多少:9

即使我删除依赖数组以继续呈现,playerCount仍然不会更新:

代码语言:javascript
复制
  useEffect(() => {
    axios.get(getAllPlayersUrl).then((response) => {
      setPlayers(response.data);
    });
  });

我想知道为什么useState不能工作?我的代码中有遗漏什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-15 20:51:05

状态(和道具)的一个好的经验法则是,当一个值可以完全由另一个值确定时,避免重复状态值。否则,您可能会遇到这样的问题,在这些问题中,保持多个状态保持同步可能比需要的更具有挑战性。

在这里,您可以在组件挂载时设置playerCount的初始值:

代码语言:javascript
复制
const [playerCount, setPlayerCount] = useState(players.length);

组件只挂载一次--此时,players是空数组--因此playerCount变为0,因为您从不调用setPlayerCount,所以它始终保持为0。

虽然您可以通过在您的setPlayerCount中调用.then来修复它,但更好的方法是只在需要时从players状态计算玩家计数:

代码语言:javascript
复制
function App() {
  const [players, setPlayers] = useState([]);
  const getAllPlayersUrl = "http://localhost:5087/api/GetAllPlayers";
  useEffect(() => {
    axios.get(getAllPlayersUrl).then((response) => {
      setPlayers(response.data);
    });
  }, []);

  return (
    <div>
      <p>{`This is how many there are: ${players.length}`}</p>
    </div>
  );
}

或者,如果您真的必须这样做的话,根据players数组(不需要创建额外的状态)来回溯计数。

代码语言:javascript
复制
function App() {
  const [players, setPlayers] = useState([]);
  const playerCount = useMemo(() => players.length, [players]);
  const getAllPlayersUrl = "http://localhost:5087/api/GetAllPlayers";
  useEffect(() => {
    axios.get(getAllPlayersUrl).then((response) => {
      setPlayers(response.data);
    });
  }, []);

  return (
    <div>
      <p>{`This is how many there are: ${playerCount}`}</p>
    </div>
  );
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74082905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档