gpt4 book ai didi

javascript - 单击事件后如何触发函数 useEffect?

转载 作者:行者123 更新时间:2023-12-03 07:11:17 25 4
gpt4 key购买 nike

最近正在学习 React hooks,现在正在做一个搜索应用程序,它必须调用 API,然后返回与我在搜索框中键入的内容相对应的电影列表。

我的代码在这里:

使用Fetch.js

import { useState, useEffect } from 'react'

export const useFetch = (url, initialState) => {
const [data, setData] = useState(initialState)
const [loading, setLoading] = useState(true)
useEffect(() => {
async function fetchMovies() {
const response = await fetch(url)
const data = await response.json()
setData(data.Search)
setLoading(false)
}
fetchMovies()
}, [url])

return { data, loading }
}

App.js

import React, { useState } from 'react'
import Search from './components/Search'
import Result from './components/Result'
import Loading from './components/Loading'
import { useFetch } from './utils/useFetch'

export default function App() {
const [key, setKey] = useState('Iron man')
const onSearch = (key) => {
setKey(key)
}
const {data, loading} = useFetch(`https://www.omdbapi.com/?s=${key}&apikey=${API_KEY}`)

return (
<>
<Search handleSearch={onSearch}/>
<Loading isLoading={loading} />
<Result movies={data}/>
</>
)
}

据我所知,单击按钮后搜索函数调用 API 将被触发并按预期返回结果。我放不下

const {data, loading} = useFetch(`https://www.omdbapi.com/?s=${key}&apikey=${API_KEY}`)

onSearch 函数中。遵循代码函数调用 API 会在应用程序启动时自动调用并返回未定义的结果。

谁能帮我解释一下原因?

最佳答案

您对钩子(Hook)如何只能在 React 组件的顶层调用的理解是正确的。进行以下更改,API 将不会在第一次被调用,但会在随后被调用。

  1. 使用 url 状态变量并在组件外部提取 generateUrl 逻辑:
function generateUrl(key) {
return `https://www.omdbapi.com/?s=${key}&apikey=${API_KEY}`
}

function MyComponent() {
const [url, setUrl] = React.useState('');
//...
}
  1. 通过在 if 条件中包装 fetchMovies() 调用,检查 useFetch Hook 中是否存在 url。这样,API 将不会触发,因为 url 的默认值为空。
import { useState, useEffect } from 'react'

export const useFetch = (url, initialState) => {
const [data, setData] = useState(initialState)
const [loading, setLoading] = useState(true)
useEffect(() => {
async function fetchMovies() {
const response = await fetch(url)
const data = await response.json()
setData(data.Search)
setLoading(false)
}

if(url) {
fetchMovies()
}
}, [url])

return { data, loading }
}
  1. 最后修改onSearch
const onSearch = (key) => {
setUrl(generateUrl(key))
}

关于javascript - 单击事件后如何触发函数 useEffect?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57177987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com