UseEffect - 使用状态创建外部 Link

UseEffect - Use state to create an external Link

我有一个方法 getUrl() 调用 API 端点

  useEffect(() => {
    getUrl()
      .then(x => x.json())
      .then(x => {
        const { result } = x;
      });
  });

我可以在控制台中看到我页面中的调用,如您在屏幕截图中所见,这是我的数据

{
   "result":"https://www.google.it",
   "error":null,
   "errorCode":null,
   "isSuccessful":true,
   "operationStatusCode":"OK"
}

如何在我的视图中的外部 link 中显示以下 result link 示例 https://www.gooole.it

我必须使用状态吗?

我需要一个示例,说明如何在此处编写代码来执行此操作

<a target="_blank" href={result}>Google Link</a>

您必须在组件中使用状态:

const [url,setUrl] = useState('');

并渲染它:

<a target="_blank" href={url}>Google Link</a>

并且在使用效果中:

useEffect(() => {
   getUrl()
     .then(x => x.json())
     .then(x => {
        const { result } = x;
        // use set url hook 
        setUrl(result);
      });
  });

Do I have to use states?

是的!您应该使用状态对象来维护新结果,因为 setState 可以是异步的,并且当您更新状态时会发生重新渲染并且 UI 得到更新。检查这个:

把这个初始化状态:

const [result, setResult] = useState({});

其中 result 是一个 属性 并且 setResult 将是更新程序方法。

现在您必须在组件的模板中使用它,例如:

{ result && <a target="_blank" href={result}>Google Link</a> }
{/* if result (its a promise) is not available when render happens then it might err. */}

现在在您的 useEffect 中:

useEffect(() => {
    getUrl()
      .then(x => x.json())
      .then(x => {
        const { result } = x;
        setResult(result); // <-----------set it here
      });
  },[result]); //<---pass it here it rerenders when state.result changes after first render.

我猜你应该已经分离了包含所有 API 个调用的文件:

// apiList.js

export const getUrl = (url, params) => axios.get(url, params).then(res => res.data);

etc

然后在你的函数组件上:

import React, { useEffect, useState } from 'react';
import { getUrl } from '[pathTo]/apiList';

const YourComponent = () => {
  const [state, setState] = useState({});
  useEffect(async () => {
    const result = await getUrl() || {};
    setState(result);
  }, []);


  return (
    <a target="_blank" href={state.result}>Google Link</a>
  );
};

useEffect 上调用发生并且 setState 函数更改组件的状态并且将发生重新渲染。然后您会看到 a 标签的 href 属性有了一个新值。

还有一件事我想建议在 useEffect 中进行 API 调用不是一个好的做法。 React 文档还说要避免在 useEffect 中调用 API。相反,创建一个函数来进行所需的 API 调用并在 useEffect 中调用该函数。

const getUrl = () =>{
    /*make your API call here*/
}

useEffect(()=>{
    getUrl()
}

有多种方法可以做到这一点

First Usecase - will use useState

const [url,setUrl] = useState(''); //set useState

useEffect(() => {  //useEffect to get data on componentDidMount ans assign it to url
   getUrl()
     .then(x => x.json())
     .then(x => {
        const { result } = x;           
        setUrl(result); // placing data in useState
      });
  },[])

<a target="_blank" href={url}>Google Link</a>

Second Usecase - Declare one variable in your component and assign the response from api call to variable and used that

let url = ''
useEffect(() => {  //useEffect to get data on componentDidMount ans assign it to url
   getUrl()
     .then(x => x.json())
     .then(x => {
        url = x.result; //Assigning the result to url
      });
  },[])

<a target="_blank" href={url}>Google Link</a>