reactjs - 反应原生将大代码移动到单独的文件中 - 它是一个钩子吗?
问题描述
我有一个反应原生屏幕,它有很长的代码,我想折射。
说我screen.jsx
的是(当然是简化的):
import React, { useState, useCallback, useEffect } from 'react';
import useLocation from '../hooks/useLocation'; // A custom hook I wrote. This one makes sense to use as a hook. It's a function that returns a location.
...
export default function Screen() {
const [fetchingLocation, region, setRegion] = useLocation();
// FROM HERE DOWN
const [fetchingRestaurants, setFetchingRestaurants] = useState(false);
const [restaurants, setRestaurants] = useState([]);
const [errorMessage, setErrorMessage] = useState('');
const initSearch = useCallback(async ({ searchQuery, region }) => {
setFetchingRestaurants(true);
try {
const response = await remoteApi.get('/search', {
params: {
term: searchQuery,
latitude: region.latitude,
longitude: region.longitude,
},
});
const fetchedRestaurants = response.data.businesses;
const fetchedRestaurantsArray = fetchedRestaurants.map((restaurant) => ({
id: restaurant.id,
name: restaurant.name,
}));
setRestaurants(fetchedRestaurantsArray);
setFetchingRestaurants(false);
} catch (e) {
setRestaurants([]);
setFetchingRestaurants(false);
}
}, []);
return (
<View>...</View>
);
}
为了更好地构建我的代码,我想将您在“FROM HERE DOWN”下面看到的所有代码(initSearch
以及它上面的三个状态管理 useState 挂钩)移动到另一个文件中并导入它。
目前我在hooksuseRestaurantSearch
文件夹中创建了一个自定义钩子,如下所示:
export default function useRestaurantSearch() {
// The code I mentioned goes here
return [initSearch, errorMessage, restaurants, setRestaurants, fetchingRestaurants];
}
然后在我的Screen.jsx
文件中我导入它import useRestaurantSearch from '../hooks/useRestaurantSearch';
并在里面function Screen()
我抓住const
我需要的 s
const [
initSearch,
errorMessage,
restaurants,
setRestaurants,
fetchingRestaurants,
] = useRestaurantSearch();
这行得通,但我觉得它可以写得更好,而且整个方法看起来很奇怪——它真的是一个自定义钩子吗?如果它不是自定义钩子,它是否作为实用程序属于 util 文件夹?
你会如何处理这个问题?
解决方案
推荐阅读
- c# - 无法验证 DataGridView 中的单元格
- kubernetes - 留言板教程和redis找不到master
- laravel - 迁移和修补程序作为在继续之前设计和完成数据库的工具
- rabbitmq - RabbitMQ:更改 Windows Server 上的端口
- dart - Flutter 方法 [] 在 null 上被调用
- django - 在阿里云 ECS 上部署 Django 应用
- ios - 如何在 iOS Swift 的“图库”中显示可用的 pdf 文档?
- c# - 不匹配任何可用的视图
- javascript - 不包括 .module.less 的 .less 扩展文件的正则表达式
- bash - 退出正在运行的脚本而不退出 shell