reactjs - React:为什么我的状态在 useEffect 的初始渲染中未定义?
问题描述
useEffect 会渲染来自 axios get 请求的数据。但是在控制台中,它将初始结果记录为一个空数组。const childRefs = useMemo(() => new Array(results.length).fill(0).map((i) => React.createRef()),[]);
此行要求结果状态与 axios 请求中的数组一起返回,否则我会收到错误消息TypeError: Cannot read property 'current' of undefined
。如果我在 useEffect 中将结果状态作为参数传递,那么 useEffect 会继续调用而不会停止。如何在不无限期调用 useEffect 的情况下在初始渲染上设置结果状态?
export default function SwipePage() {
const [ results, setResults ] = useState([]);
const [ isOpen, setIsOpen ] = useState(false);
const { userState, setUserState } = useContext(UserContext);
const { id } = useParams();
const api = `http://localhost:5000/user/match/${id}`;
const alreadyRemoved = [];
useEffect(() => {
axios
.get(api, {
headers: {
Authorization: localStorage.getItem("jwt"),
"Content-Type": "application/json",
"Cache-Control": "no-cache",
},
})
.then((res) => {
setResults(res.data.user);
console.log(results, "Results")
});
}, []);
const childRefs = useMemo(() => new Array(results.length).fill(0).map((i) => React.createRef()),[]);
解决方案
使用 useMemo 你会得到一个记忆化的结果。将结果放入 useMemo 的依赖数组中,如果结果状态发生更改,将重新计算您的数据。
const childRefs = useMemo(() => new Array(results.length).fill(0).map((i) => React.createRef()),[results]);
推荐阅读
- reporting-services - SSRS 通过单击 Tablix 中的分组单元传递多个参数
- c - GTK 接口结构:为什么要构建为铸造接口?
- facebook - 我可以将 Facebook Pixels 用于原生 android 应用吗
- google-cloud-datastore - 谷歌数据存储投影查询是否可以获取实体中的所有数据?
- mongodb - How to use mongodb aggregation
- javascript - 如何正确地将 django 列表/字典传递给 javascript
- android - 如何设计新的 google 材料“Sidesheet”?
- powershell - 为什么在远程计算机上使用 PowerShell 调用 Get-Service 时出现“Get-WindowSize”未实现错误?
- amazon-web-services - AWS 服务(通过 ARN 定位)之间的通信是否始终使用 SSL?
- laravel - Laravel 6.0 php artisan route:list 返回“目标类 [App\Http\Controllers\SessionsController] 不存在。”