为了账号安全,请及时绑定邮箱和手机立即绑定

如何在导入函数中使用更高级别的 useState

如何在导入函数中使用更高级别的 useState

阿波罗的战车 2023-03-10 15:49:00
以下代码(为简洁起见删除了其中的某些部分)正在运行:function AddressInputList({  isOpen,  inputValue,  highlightedIndex,  getItemProps,  getMenuProps}: AutocompleteInputListProps) {  const [items, setItems] = useState<MarkerPoint[]>([])  const api = 'XXXX'  const fetchURL = `https://api.opencagedata.com/geocode/v1/json?key=${api}&q=${inputValue}&limit=5&pretty=1`  useEffect(() => {    async function fetchData() {      if (inputValue !== null && inputValue.length > 1) {        try {          const request = await axios.get(fetchURL)          const items = request.data.results.map((res: any) => {            return {              lat: res.geometry.lat,              lng: res.geometry.lng,              address: res.formatted            }          })          setItems(items)        } catch (error) {          console.error(error)        }      }    }    fetchData()  }, [inputValue])  return (/*Code cut out*/)}我现在想做的是重构代码,让它更精简。因此,我将创建一个utility.ts-file,其中包含 -function fetchData,随后我想将fetchData-function 导入初始AddressInputList-function:实用程序.ts:export async function fetchData(inputValue: string, fetchURL: string) {  if (inputValue !== null && inputValue.length > 1) {    try {      const request = await axios.get(fetchURL)      const items = request.data.results.map((res: any) => {        return {          lat: res.geometry.lat,          lng: res.geometry.lng,          address: res.formatted        }      })      setItems(items)    } catch (error) {      console.error(error)    }  }}现在我的问题是我不知道如何使 useState-hooksetItems在utility.ts. 我在某处读到可以做到这一点props,但我不确定这会是什么样子。一个简短的例子将不胜感激!
查看完整描述

2 回答

?
MM们

TA贡献1886条经验 获得超2个赞

只需创建一个自定义挂钩即可为您获取数据。我不建议把这个钩子绑inputValue那么多。此外,.map 格式也不通用。


export function useFetchData(inputValue: string, fetchURL: string) {

  const [items,setItems] = useState([]);


  useEffect(() => {

    async function fetchData() {

      if (inputValue !== null && inputValue.length > 1) {

        try {

          const request = await axios.get(fetchURL)

          const items = request.data.results.map((res: any) => {

            return {

              lat: res.geometry.lat,

              lng: res.geometry.lng,

              address: res.formatted

            }

          })

          setItems(items)

        } catch (error) {

          console.error(error)

        }

      }

    }

  }, [inputValue]);


  return items;

}

之后你可以像这样使用这个自定义钩子


const items = useFetchData(inputValue, "/api/<endpoint>);


查看完整回答
反对 回复 2023-03-10
?
郎朗坤

TA贡献1921条经验 获得超9个赞

我想您可以将 setItems 作为回调函数作为参数传递给您的 fetchData 函数。

fetchData(inputValue: string, fetchURL: string, setItems) {
    ...
}


查看完整回答
反对 回复 2023-03-10
  • 2 回答
  • 0 关注
  • 139 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号