React - 是不是在 useEffect 中调用 API
Posted
技术标签:
【中文标题】React - 是不是在 useEffect 中调用 API【英文标题】:React - API call within useEffect or notReact - 是否在 useEffect 中调用 API 【发布时间】:2021-10-14 07:52:19 【问题描述】:我很好奇使用 useEffect
钩子处理 API 调用与仅在效果之外处理 API 的区别。
例如,使用useEffect
,您可能会执行类似的操作
const MyComponent = () =>
const [myState, setMyState] = useState([])
const [trigger, setTrigger] = useState(false)
useEffect(() =>
const getData = async () =>
const callMyApi = await fetch('http://someApi.com')
setMyState(await callMyApi.json()
if(trigger)
getData()
, [trigger])
return (
<button onClick=setTrigger(true)>Click me</button>
)
Vs,删除useEffect
const MyComponent = () =>
const [myState, setMyState] = useState([])
const getData = async () =>
const callMyApi = await fetch('http://someApi.com')
setMyState(await callMyApi.json()
return (
<button onClick=getData()>Click me</button>
)
该代码并不准确。 但关键是,使用钩子,不使用useEffect
处理是否存在陷阱获取数据和更新状态?
【问题讨论】:
【参考方案1】:理想情况下,
如果您想在单击按钮时进行 API 调用,则无需像您所做的那样使用 useEffect 和 useState 之类的任何钩子。您的第二种方法是完美的,没有任何问题。
但是,如果有一些特定的用例需要它,那么使用钩子也没有错,你也只会做一些额外的重新渲染,但如果这对你的用例有用,那么我想这也很好。
注意:
<button onClick=setTrigger(true)>Click me</button>
这是错误的,这个 setTrigger 函数将在组件挂载时被调用,我猜你可能不希望这样。
你可以这样做
<button onClick=()=>setTrigger(true)>Click me</button>
或
const MyComponent = () =>
const [myState, setMyState] = useState([])
const getData = async () =>
const callMyApi = await fetch('http://someApi.com')
setMyState(await callMyApi.json()
return (
<button onClick=getData>Click me</button>
)
【讨论】:
谢谢!我知道代码肯定有错别字。不太担心那部分,主要是好奇是否使用useEffect
。潜在的陷阱等。听起来好像真的没有。【参考方案2】:
您不能使用按钮来激活事件以响应任何可检测到的应用状态变化。 要理解这一点,请考虑聊天应用程序的情况,两个客户端 A 和 B 处于活动状态,并且 A 向 B 发送消息,现在在接收到来自 A 的消息时,B 客户端必须采取一些措施,以及 B 如何知道它已收到消息, 为此 B 可以利用事件侦听器。现在您可以自定义创建事件侦听器,但您会为每个不同的事件创建自定义事件侦听器吗?
理想情况下,您可以创建一个通用事件侦听器,用于检测应用程序状态的变化,React 已经为您编写了该事件侦听器。
编写自己的监听器的唯一缺点是浪费时间。
【讨论】:
以上是关于React - 是不是在 useEffect 中调用 API的主要内容,如果未能解决你的问题,请参考以下文章
React - useEffect() 中的错误。 dat 是不是会使页面上的所有内容陷入无限循环?
为啥从 React 的 useEffect 依赖列表中省略函数是不安全的?