Я пытаюсь использовать useSWR в своем приложении NEXT.JS. Во-первых, я сделал собственный хук, где я его использую:
import useSWR from "swr";
const apiUrl = process.env.NEXT_PUBLIC_API_URL;
const fetcher = (url) => {
fetch(url).then((res) => res.json());
};
export default function useSocialMedia() {
const url = apiUrl + "/socialMedia";
const { data, error } = useSWR(url, fetcher);
console.info("data : ", data);
return {
socialMedia: data,
loading: !error && !data,
error: error,
};
}
Затем я импортирую его в свой компонент:
import styles from "./styles/socialIcons.module.scss";
import useSocialMedia from "../../../utils/hooks/useSocialMedia";
export default function SocialIcons() {
const { socialMedia, loading, error } = useSocialMedia();
return (
<div className = {styles.socialIcons}>
{loading && <p>Loading...</p>}
{error && <p>Loading failed : {error}</p>}
{socialMedia && <p>Here will appear my social media list</p>}
</div>
);
}
В результате моего console.info в моем пользовательском хуке у меня всегда есть неопределенные данные, и поэтому мой компонент зависает при загрузке... Я не понимаю, что не так с моим кодом.
Извините, я вставил свой код с console.info в свой сборщик. Я отредактировал свой вопрос, потому что даже с возвратом данных fecther он все еще не определен после использования SWR...



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Рассмотрим следующий пример. Вы забыли вернуть данные в функцию выборки. Вы только что использовали console.info, и он не дал никаких результатов.
import React from 'react';
import useSWR from 'swr';
const apiUrl = 'https://jsonplaceholder.typicode.com/posts';
const fetcher = (url) => fetch(url).then((r) => r.json());
function useSocialMedia() {
const url = apiUrl;
const { data, error } = useSWR(url, fetcher);
return {
socialMedia: data,
loading: !data,
error,
};
}
export default function SocialIcons() {
const { socialMedia, loading, error } = useSocialMedia();
return (
<div>
{loading && <p>Loading...</p>}
{error && <p>Loading failed : {error}</p>}
{socialMedia && socialMedia.map((post) => <p>{post.title}</p>)}
</div>
);
}
Извините, я вставил свой код с console.info в свой сборщик. Я отредактировал свой вопрос, потому что даже с возвратом данных fecther он все еще не определен после использования SWR...
Изучите функцию сборщика; он заключен в фигурные скобки; чтобы вернуть выборку, используйте ключевое слово return или удалите фигурные скобки. Вы можете посмотреть мой код, чтобы увидеть, как я построил функцию получения.
Спасибо ! Я только что совершил ошибку новичка... Думаю, пришло время сделать кофе-брейк... Теперь он работает как часы!
Это нормально! Удачи с вашим проектом.
Насколько я вижу из вашего кода, вы не возвращаете никаких данных в функцию выборки.