import React, { useState, useEffect } from 'react'; // axiosをインポート import axios from 'axios'; import lodash from 'lodash'; import dayjs from 'dayjs'; import relativeTime from 'dayjs/plugin/relativeTime'; dayjs.extend(relativeTime); import './QiitaApp.css'; function App() { const [page, setPage] = useState(1); const [perPage, setPerPage] = useState(20); const [postsList, setPostsList] = useState([]); const [isLoading, setIsLoading] = useState(false); const [tag, setTag] = useState('React'); const [error, setError] = useState(''); // 一番下に到達したら handleClick()でページを更新 const handleScroll = lodash.throttle(() => { if ( window.innerHeight + document.documentElement.scrollTop !== document.documentElement.offsetHeight ) { return; } // 一番下に到達した時の処理 //if(message !== "loading...") { setPage((prevCount) => prevCount + 1); //} }, 500); useEffect(() => { window.addEventListener('scroll', handleScroll); return () => { window.removeEventListener('scroll', handleScroll); }; }, []); // eslint-disable-line react-hooks/exhaustive-deps // pageが変化した時に実行 useEffect(() => { //document.title = `page = ${page}, message = ${message}`; handleClick(); // eslint-disable-next-line }, [page]); // Only re-run the effect if count changes // tagが変化した時に実行 useEffect(() => { //document.title = `page = ${page}, message = ${message}`; handleClick(); // eslint-disable-next-line }, [tag]); // Only re-run the effect if count changes const tagButtonClick = (target) => { setPerPage(20); setPostsList([]); setPage(1); setTag(target); } const pageButtonClick = (target) => { setPerPage(100); setPostsList([]); const tmp = parseInt(target,10); setPage(tmp); //setTag('Swift'); } const handleClick = (target) => { const url = `https://qiita.com/api/v2/tags/${tag}/items?page=${page}&per_page=${perPage}`; setIsLoading(true); const headers = {} fetch(url, { headers }) .then(res => res.json().then(data => ({ ok: res.ok, data, })) ) .then(res => { if (!res.ok) { setError(res.data.message); setIsLoading(false); //throw Error(res.data.message) } else { setPostsList(postsList.concat(res.data)); setIsLoading(false); } }) } // page + 1 const getNextQiitaPosts = () => { const newPage = page + 1; setPage(newPage); } // page - 1 const getBeforeQiitaPosts = () => { const newPage = page - 1; setPage(newPage); } const renderTag = (list) => { const tags = list.map((item, index) => { return ( <>{item.name}, ); }); return tags; } const renderImageList = (list) => { const posts = list.map((item, index) => { return (
  • img
    {item.title}

    {dayjs(item.created_at).fromNow(true)} / {renderTag(item.tags)} / {item.likes_count}likes / {item.user.items_count}posts

  • ); }); return posts; } // 表示されるHTMLを記述 return (
    {error}
    netlifyとVercelでVite React App、QiitaAPIから記事情報を取得して表示(vite-react-pages)
    Vite で React 新規プロジェクトを作成

    QiitaでReactタグありの記事を表示


    {tag}
    page: ___: ___: ___: {page}/{perPage}posts Page {page}, tag {tag}, {isLoading}
    {isLoading ? ( <>Loading .... page: {page}/{perPage}posts/{perPage*(page-1)+1}- ) : ( <>Not Loading. page: {page}/{perPage}posts/{perPage*(page-1)+1}- )}
    {tag} Page {page}/{perPage}posts/{perPage*(page-1)+1}-
    ) } export default App;