用户数组挂钩未更新所有列表项

users array hook is not updating with all the list items

所以我正在创建一个简单的 MERN 应用程序,后端工作正常,但是在前端使用 useState 挂钩时会导致问题。 我想做的是从后端端点获取“用户”数据(带有字段用户名的对象数组),并更新用户数组,这是一个钩子,但它只更新传入用户名的最后一个 itm 而不是列表所有用户名!!

获取和更新挂钩的代码:

const [users, setUsers] = useState([]);

const getUsers = () => {
    fetch("http://localhost:5000/users")
        .then(res => res.json())
        .then(data => {
            console.log(data);      //line 17
            data.map((itm) => {
                console.log([itm.username])      //line 19
                setUsers([...users, itm.username])
            })
        })
        .catch(err => console.log(err))
}

useEffect(() => {
    getUsers();
}, [])

console.log(users);       //line 30

我想要的是获取“users”状态下的用户名列表! 是这样的: 用户 = [“蜘蛛侠”、“雷神”、“钢铁侠”、“美国队长”]

console.log 也没有显示任何错误... console window

求助,不知道哪里出错了?

问题有两个方面,首先您正在使用 Array.prototype.map 迭代数组但发出了无意的副作用(状态更新),其次,您正在循环中对状态更新进行排队,但使用标准更新,每个后续更新都会覆盖之前的更新,因此只有最后一个排队的更新是您在下一个渲染中看到的。

使用 .forEach 遍历 data 并使用功能状态更新从之前的状态正确更新。

const getUsers = () => {
  fetch("http://localhost:5000/users")
    .then(res => res.json())
    .then(data => {
      console.log(data);
      data.forEach((itm) => {
        console.log([itm.username]);
        setUsers(users => [...users, itm.username]);
      })
    })
    .catch(err => console.log(err));
}

或者使用 .map 并将 data 映射到要附加到 users 状态的数组。

const getUsers = () => {
  fetch("http://localhost:5000/users")
    .then(res => res.json())
    .then(data => {
      console.log(data);
      setUsers(users => users.concat(data.map(itm => itm.username)));
    })
    .catch(err => console.log(err));
}

您可以将地图结果设置在一个变量中,然后您可以在其上调用 useState。

 const [users, setUsers] = useState([]);

 const getUsers = () => {
   fetch("http://localhost:5000/users")
    .then(res => res.json())
    .then(data => {
        console.log(data);      //line 17
        const userNameData = data.map(itm => itm.username)
     setUsers(...users, userNameData)
    })
    .catch(err => console.log(err))
  }

 useEffect(() => {
   getUsers();
 }, [])

 console.log(users);