首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确使用UseCallBack

正确使用UseCallBack
EN

Stack Overflow用户
提问于 2020-03-25 00:53:56
回答 1查看 9.2K关注 0票数 3

目前,每次更新查询参数时,我的代码都会重新呈现。一旦我删除了查询参数;但是,我得到了一个警告:"React Hook useCallback有一个缺失的依赖关系:' query‘。要么包括它,要么删除依赖关系数组react-hooks/exhaustive Deps.“。我已经尝试在useEffect中定义我的getData函数,但我在useEffect外部使用getData作为onclick函数。我试图完成的是最初在react钩子上获取文章,然后仅在提交时获取新数据,而不是在查询更新时获取新数据,并且不会出现任何关于查询是缺失依赖的警告。任何建议都会有很大帮助。代码如下:

代码语言:javascript
复制
import React, { useState, useEffect, useCallback } from "react"
import axios from "axios"

const Home = () => {
  const [data, setData] = useState(null)
  const [query, setQuery] = useState("react hooks")

  const getData = useCallback(async () => {
    const response = await axios.get(
      `http://hn.algolia.com/api/v1/search?query=${query}`
    )
    setData(response.data)
  }, [query])

  useEffect(() => {
    getData()
  }, [getData])

  const handleChange = event => {
    event.preventDefault()
    setQuery(event.target.value)
  }

  return (
    <div>
      <input type='text' onChange={handleChange} value={query} />
      <button type='button' onClick={getData}>
        Submit
      </button>
      {data &&
        data.hits.map(item => (
          <div key={item.objectID}>
            {item.url && (
              <>
                <a href={item.url}>{item.title}</a>
                <div>{item.author}</div>
              </>
            )}
          </div>
        ))}
    </div>
  )
}

export default Home
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-25 01:55:07

添加submitting状态作为触发axios请求的条件

代码语言:javascript
复制
  const [submitting, setSubmitting] = useState(true)
  const [data, setData] = useState(null)
  const [query, setQuery] = useState("react hooks")

  useEffect(() => {
    const getData = async () => {
      const response = await axios.get(
        `http://hn.algolia.com/api/v1/search?query=${query}`
      )
      setData(response.data)
      setSubmitting(false) // call is finished, set to false
    }

    // query can change, but don't actually trigger 
    // request unless submitting is true

    if (submitting) { // is true initially, and again when button is clicked
      getData()
    }
  }, [submitting, query])

  const handleChange = event => {
    event.preventDefault()
    setQuery(event.target.value)
  }

  const getData = () => setSubmitting(true)

如果你想使用useCallback,它可以这样重构:

代码语言:javascript
复制
  const [submitting, setSubmitting] = useState(true)
  const [data, setData] = useState(null)
  const [query, setQuery] = useState("react hooks")

  const getData = useCallback(async () => {
    const response = await axios.get(
      `http://hn.algolia.com/api/v1/search?query=${query}`
    )
    setData(response.data)
  }, [query])

  useEffect(() => {
    if (submitting) { // is true initially, and again when button is clicked
      getData().then(() => setSubmitting(false))
    }
  }, [submitting, getData])

  const handleChange = event => {
    event.preventDefault()
    setQuery(event.target.value)
  }

并且在render中

代码语言:javascript
复制
<button type='button' onClick={() => setSubmitting(true)}>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60835660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档