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

useState set调用不反映应用程序首次呈现前的更改

岑畅
2023-03-14

新的反应挂钩和不确定如何解决。我在下面的App.js文件中有以下代码片段。

我基本上试图实现的是通过调用getUser()函数让用户登录,一旦我有了用户标识,然后通过调用用户的函数check UserAccess()来检查他们是否是授权用户ID.

根据validis数组中的结果,我检查它是否为真,并通过setauthorized()调用将authorized state设置为真或假。

我的问题是,我需要先处理这个过程,然后在我的App.js文件中执行我的第一次渲染。

现在,它说我没有被授权,即使我是。

任何人都可以帮助我做错事,因为我需要确保在应用程序的第一个组件呈现之前正确设置authorizeduseState,即path=“/”

const [theId, setTheId] = useState('');
const [authorised, setAuthorised] = useState(false);


  const checkUserAccess = async (empid) => {
    try {
      const response = await fetch("http://localhost:4200/get-valid-users");
      const allUsers = await response.json();

      const validIds = allUsers.map(({ id }) => id);
      const isAuthorised = validIds.includes(empid);

      if (isAuthorised) {
        setAuthorised(true)
      } else {
        setAuthorised(false)
      }
    } catch (err) {
      console.error(err.message);
    }
  }  
    
    const getUser = async () => {
        try {
          const response = await fetch("http://localhost:4200/get-user");
          const theId= await response.json();
          
          setTheId(theId);
          checkUserAccess(theId);
    
        } catch (err) {
          console.error(err.message);
        }
      }
    
     useEffect(() => {
        getUser();
      }, []);  

共有2个答案

孙博艺
2023-03-14

这样它应该可以工作,但请记住,只有当状态中的id存在时,您才必须呈现您的应用,这意味着您的用户被正确地获取。

const [state, setState] = useState({ theId: '', isAutorized: false })    
const getUser = async () => {
  try {
    const idResp = await fetch("http://localhost:4200/get-user");
    const theId = await idResp.json();
    const authResp = await fetch("http://localhost:4200/get-valid-users");
    const allUsers = await authResp.response.json();

    const validIds = allUsers.map(({ id }) => id);
    const isAuthorised = validIds.includes(theId);
    setState({ theId, isAuthorised })
  } catch (err) {
    console.error(err.message);
  }
}

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

if (!state.theId) return <div>Loading</div>;

if (state.theId && !isAuthorized) return <AccessNotAllowed />

return <Home />
杨研
2023-03-14

除非您希望在获取用户ID后进行部分渲染,然后获取访问级别。没有理由拥有多个useState/useEffect。

只需获取您的用户,然后获取您的访问级别并使用它。

下面是一个例子。

const [user, setUser] = useState(null);

const checkUserAccess = async (empid) => {
  const response = await fetch("http://localhost:4200/get-valid-users");
  const allUsers = await response.json();
  const validIds = allUsers.map(({ id }) => id);
  const isAuthorised = validIds.includes(empid);
  return isAuthorised;
}  
    
const getUser = async () => {
  try {
    const response = await fetch("http://localhost:4200/get-user");
    const theId= await response.json();
    const access = await checkUserAccess(theId);
    setUser({
      theId,
      access
    });
  } catch (err) {
    console.error(err.message);
  }
}
    
useEffect(() => {
  getUser();
}, []);  

if (!user) return <div>Loading</div>;

return <>{user.theId}</>
 类似资料:
  • 我已经按照https://reactnative.dev/docs/environment-setup中规定的说明,除了choclatey,因为我已经有了节点等,但我不能构建我的应用程序,以达到仿真器上的输出RN样板(步骤2:在文档中)以下npx反应本机运行android。我已经搜索了很多很多个小时来寻找一个解决方案,但是我一无所获,这变得非常令人沮丧。下面我附上了相关的输出。 提前感谢您的帮助。

  • 我需要以下方面的帮助:我正在javafx中实现一个应用程序,这个应用程序是通过单击按钮调用的。问题是当我关闭应用程序时,我不能再次调用它。我读到过你不能多次调用Application.launch()方法。但是我在服务类上发现了一些东西。留档页面中的示例不是很清楚。有人知道如何做到这一点吗?谢谢。 http://docs.oracle.com/javafx/2/threads/jfxpub-thr

  • 问题内容: 在我的应用程序中,首先显示启动屏幕。在进行另一项活动之后,必须显示我的主要活动。这是我的设计计划。必须为应用程序的首次用户显示第二个活动(即在主要活动之前)。如果他/她关闭应用程序,启动屏幕将自动重定向到主要活动。我该怎么做呢?有任何想法吗?我正在为Android手机开发应用程序。 问题答案: 在首选项中保留一个标志,并在启动时进行检查。闪屏显示一次后更改其状态。

  • 问题内容: 我的问题很简单,我该如何识别首次申请?我认为可以通过在RMS中保存一些值并在应用启动时读取它并决定要做什么来实现。 但是没有更简单的解决方案吗? 问题答案: 据我所知,没有比这更简单的方法了,但这还是很容易的。

  • 我第一次尝试React钩子,一切似乎都很好,直到我意识到当我获取数据并更新两个不同的状态变量(数据和加载标志)时,我的组件(数据表)会呈现两次,尽管对状态更新器的两次调用都发生在同一个函数中。下面是我的api函数,它将两个变量都返回到我的组件中。 在普通的类组件中,您只需调用一次来更新状态,状态可能是一个复杂的对象,但“挂钩方式”似乎是将状态拆分为更小的单元,其副作用似乎是在单独更新时多次重新呈现