【问题标题】:how to get, by a get from axios, data in useState with react functionnal component如何通过从 axios 获取带有反应功能组件的 useState 中的数据
【发布时间】:2020-07-17 18:44:58
【问题描述】:

我正在处理 jhipster 生成的 react 项目。 当我从我的 rest api 执行获取请求时。

GET http://localhost:8080/api/account
Accept: */*
Cache-Control: no-cache
Authorization: Bearer bearerValue

我明白了:

HTTP/1.1 200 OK
Expires: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
X-XSS-Protection: 1; mode=block
Pragma: no-cache
X-Frame-Options: DENY
Referrer-Policy: strict-origin-when-cross-origin
Content-Security-Policy: default-src 'self'; frame-src 'self' data:; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://storage.googleapis.com; style-src 'self' https://fonts.googleapis.com 'unsafe-inline'; img-src 'self' data:; font-src 'self' https://fonts.gstatic.com data:
Date: Sun, 05 Apr 2020 18:26:07 GMT
Connection: keep-alive
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
Feature-Policy: geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; speaker 'none'; fullscreen 'self'; payment 'none'
Transfer-Encoding: chunked
Content-Type: application/json

{
  "id": 3,
  "login": "admin",
  "firstName": "Administrator",
  "lastName": "Administrator",
  "email": "admin@localhost",
  "imageUrl": "",
  "activated": true,
  "langKey": "fr",
  "createdBy": "system",
  "createdDate": null,
  "lastModifiedBy": "system",
  "lastModifiedDate": null,
  "authorities": [
    "ROLE_USER",
    "ROLE_ADMIN"
  ]
}

表示 API 没问题。 我的问题是如何在我的状态下从 axios 承诺中获得结果, 只执行一个请求。

这是我尝试继续的方式。

portfolio.tsx


export interface IPortfolioProps extends StateProps,
  DispatchProps,
  RouteComponentProps<{ url: string }> {
}

export interface AccountState {
  id: number,
  login: string,
  firstName: string,
  lastName: string,
  email: string,
  imageUrl: string,
  activated: boolean,
  langKey: string,
  createdBy: string,
  createdDate: string,
  lastModifiedBy: string,
  lastModifiedDate: string,
  authorities: Array<string>
}

export const Portfolio = (props: IPortfolioProps) => {

  const currentAccountState = async (): Promise<AccountState> => {
    return await axios.get<AccountState>(`/api/account`)
      .then((response) => {
        return response.data
      });
  };

  // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
  // @ts-ignore
  const isAdmin: boolean = () => {
    let as: AccountState;
    currentAccountState()
      .then(response => {
        as = response;
        // eslint-disable-next-line no-console
        console.log('as : ', as);
        return as.authorities.find(
          authority => authority === AUTHORITIES.ADMIN) !== undefined;
      });
  };

  const [admin, setAdmin] = useState(isAdmin);

  return (
    <div>
      {`admin : ${admin}`}
    </div>);
}

运行应用程序时,我总是在屏幕上显示“admin : undefined”, 而我的控制台登录向我显示正确的帐户预期帐户。 我想要的是将布尔答案保存为状态,当前用户是管理员, 处于管理员状态。

【问题讨论】:

    标签: reactjs typescript promise axios react-functional-component


    【解决方案1】:

    我认为这是因为admin 没有默认值,所以当页面在您从 API 返回响应之前首次呈现时,adminundefined。最好先用默认值初始化,在挂载时调用API,再用响应更新状态。

    你可以试试这样的:

    const [admin, setAdmin] = useState(null);
    
    useEffect(() => {
        if (!admin) {
            const currentAccountState = async (): Promise<AccountState> => {
                return await axios.get<AccountState>(`/api/account`)
                    .then((response) => {
                        return response.data
                    });
            };
            currentAccountState()
                .then(response => {
                    console.log('as : ', response );
                    // probably add better handling here in the case that there is no result in the find, otherwise you mightrun into the same issue if admin is undefined again
                    setAdmin(response.authorities.find(authority => authority === AUTHORITIES.ADMIN) !== undefined);
                });
        }
    }, [admin])
    
    return (
        <div>
            {`admin : ${admin}`}
        </div>
    );
    

    【讨论】:

    • 它有效!多谢。我只是给 useEffect hooks 方法一个空数组,因为我希望这个值只被评估一次以避免多个 http 请求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2020-01-23
    • 2020-06-28
    • 2018-03-27
    • 2021-08-12
    • 2019-07-14
    相关资源
    最近更新 更多