// コンパイル時、以下を有効にする。 // import React,{useEffect,useState} from 'react'; // import ReactDOM from 'react-dom'; const { useEffect, useState, useLayoutEffect, useCallback, useRef } = React; // データ取得関数 async function tableDataGet(parm) { let res = await fetch('/api/newsList', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-CSRF-TOKEN': document .getElementById('csrf-token') .getAttribute('content') }, body: JSON.stringify({ page: parm['page'], category: parm['category'], }), }).then((res) => { return res.json(); }); console.log(res) return { data: res['data'], categoryList: res['categoryList'], pagenation: pagerCreate(res, parm['page']) }; } // ページネーション作成 function pagerCreate(res, pageNum) { let prevStatus; let nextStatus; let pageStart; let pageEnd; let pagePrev; let pageNext; let pageNow; // 表示ページ数 pageNum = Number(pageNum); // レコード総数 const totalRecord = Number(res['count']); // 総ページ数 const totalPage = Math.ceil(totalRecord / Number(res['postLimit'])); // ページの位置を計算 let pageCalk = Number(Math.ceil(pageNum / Number(res['pageLimit']))); // ページ送りの開始位置を計算 pageStart = pageCalk * Number(res['pageLimit']) - Number(res['pageLimit']) + 1; // ページ送りの終わり値を計算 pageEnd = Number(pageStart + res['pageLimit'] - 1); // ページ送りが途中で終わる場合はそれ以降をなしにする if (pageEnd >= totalPage) { pageEnd = totalPage; } // 値を設定 pageNow = pageNum; pagePrev = pageNum - 1; pageNext = pageNum + 1; // 前にいけない場合はリンクを消す prevStatus = pagePrev == '0' ? 'disabled' : ''; // 次にいけない場合はリンクを消す nextStatus = pageNext > totalPage ? 'disabled' : ''; const pagenation = { 'page_start': pageStart, 'page_end': pageEnd, 'page_next': pageNext, 'page_prev': pagePrev, 'page_now': pageNow, 'next_status': nextStatus, 'prev_status': prevStatus, }; return pagenation; } function NewsList(props) { const [state, setState] = useState({ 'page': json['page'], 'category': json['category'], 'categoryList': json['categoryList'], 'list': json['data'], 'pagenation': pagerCreate(json, json['page']) }); // 初期化 useEffect(function () { }, []) // ページ変更関数 function changePage(page) { document.cookie = 'newsPage=' + page; const parm = { page: page, category: state.category }; tableDataGet(parm).then(json => { setState({ 'page': page, 'category': state.category, 'categoryList': { ...json['categoryList'] }, 'list': [...json['data']], 'pagenation': { ...json['pagenation'] } }) }); } // カテゴリー変更 function changeCategory(category) { document.cookie = 'newsPage=1'; document.cookie = 'newsCategory=' + category; const parm = { page: 1, category: category }; tableDataGet(parm).then(json => { setState({ 'page': 1, 'category': category, 'categoryList': { ...json['categoryList'] }, 'list': [...json['data']], 'pagenation': { ...json['pagenation'] } }) }); } // console.log(state); return (