当前位置: 首页 > 知识库问答 >
问题:

javascript - 请问在 react 中如何实时更新状态?

高吉星
2024-01-30

请教下 useState 更新的问题,有一个页面,当数据库中没有数据的时候,显示 No user,当数据库中有数据的时候,显示出真实的数据,代码如下

const [users, setUsers] = useState([]);useEffect(() => {  const fetchData = async () => {    try {      const response = await fetch(`${apiUrl}/users`, {        method: 'GET',        headers: {          Authorization: `Bearer ${token}`,        }      });      if (response.ok) {        const data = await response.json();        if (data.success) {          setUsers(data.users);        }      } else {        console.log('Other HTTP Error:', response.status);      }    } catch (error) {      console.error('Error fetching users:', error);    }  };  fetchData();}, [token]);const userList = () => {  const activedUsers = users  .filter((user) => user.status === 1);  if (activedUsers.length === 0) {    return(      <>      {activedUsers.length === 0 &&        <div>No user</div>      }      </>    )  }  return (    <>      {activedUsers.map((user) => (        <div key={user.userID}>          <Link to={`/user/${user.userID}`}>{user.Name}</Link>        </div>      ))}    </>  )}

现在我遇到的问题是

  1. 每次访问这个页面 /users,都会显示 No user,然后过一会数据完全载入了才会显示正确的数据。查看了下,这里会渲染两次,第一次渲染 activedUsers.length 是 0,第二次渲染才会正确的载入数据。
  2. 点击任意一个用户名字后,会跳到用户的详情页面,再次访问 /users,会显示刚刚访问的这个用户的用户名,然后过一会才会自动刷新出正确的数据。

请问这个问题怎么解决,希望每次进入都是显示正确的数据。

共有1个答案

冯俊英
2024-01-30

异步导致你不能第一时间拿到最新的 userinfo,最简单的方法加个 loading

const userList = () => {  if (isLoading) {    // 如果数据还在加载,显示加载指示器    return <div>Loading...</div>;  }  const activedUsers = users.filter((user) => user.status === 1);  if (activedUsers.length === 0) {    return <div>No user</div>;  }  return (    // ...用户列表渲染代码保持不变  );};
 类似资料:
  • 问题内容: 我的结构如下所示: 组件3应该根据组件5的状态显示一些数据。由于道具是不可变的,我不能简单地将其状态保存在组件1中并转发它,对吗?是的,我已经阅读了有关redux的内容,但不想使用它。我希望有可能通过反应来解决。我错了吗? 问题答案: 对于孩子与父母的通信,您应该传递一个将状态从父母设置为孩子的函数,如下所示 这样,孩子可以通过调用通过props传递的函数来更新父母的状态。 但是您将不

  • 问题内容: 我正在尝试仅更新数组状态中的一个元素,但不确定如何执行此操作。 State 设定状态 如果我想更改标记的第四个元素中的键,该怎么做? 谢谢 问题答案: 重要的一点是,我们不应该直接更改状态数组,而要始终在新数组中进行更改,然后使用setState更新状态值。 如 Doc 建议: 切勿直接更改this.state,将this.state视为不可变。 更新状态数组的基本流程是: 1- 首先

  • 问题内容: 我试图通过使用这样的嵌套属性来组织我的状态: 但是像这样更新状态 不起作用。如何正确完成? 问题答案: 为了创建嵌套对象,您可以按照以下方法进行操作,因为我认为setState无法处理嵌套更新。 这个想法是创建一个虚拟对象,对其执行操作,然后用更新的对象替换组件的状态 现在,散布运算符仅创建对象的一级嵌套副本。如果您的状态是高度嵌套的,例如: 您可以在每个级别使用传播运算符来设置状态,

  • 问题内容: 我在使用React表单和正确管理状态时遇到麻烦。我有一个形式为模式的时间输入字段。初始值在中设置为状态变量,并从父组件传递。这本身工作正常。 当我想通过父组件更新默认的start_time值时,就会出现问题。更新本身通过发生在父组件中。但是在我的表单中,默认的start_time值从不更改,因为它仅在中定义一次。 我尝试过通过强制进行状态更改,该更改确实有效,但给了我错误。 所以我的问

  • 问题内容: 我正在尝试新的React Hooks,并有一个带有计数器的Clock组件,该计数器应该每秒增加一次。但是,该值不会增加到超过一。 问题答案: 原因是传递给的闭包中的回调仅访问第一个渲染器中的变量,而无法访问后续渲染器中的新值,因为第二次未调用。 回调中的值始终为0 。 就像您熟悉的状态挂钩一样,状态挂钩有两种形式:一种是处于更新状态的状态,另一种是将当前状态传入的回调形式。您应该使用第