質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1548閲覧

React Hooksを用いた、ページネーションの実装が上手くいきません

sinsia

総合スコア0

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2020/07/13 06:34

編集2020/07/13 06:47

前提・実現したいこと

現在、https://qiita.com/takf-jp/items/823c568350097df4ddea
こちらの記事を参考にして、React Hooksを用いたページネーションの実装を試みています。

発生している問題

起こっている問題は
次へボタンを押した際に、resourceDataが0件未満の際に表示される「データがありません」が、
画面に表示されてしまうという事です。
前へボタンを押した際には、resourceDataを取得でき、問題なくデータが表示されます。
コードを見直しましたが、タイポなどは確認できず、原因が不明で困っております。
一体どこが原因で、次へボタンを押しても上手くデータが表示されないのでしょうか。

該当のソースコード

index

1import React from "react"; 2import ReactDOM from "react-dom"; 3import { App } from "./App"; 4import Pagenation from "./pagenation"; 5import { ListComponent } from "./List"; 6import cities from "./Data"; 7import ClassComponent from "./classComponent"; 8 9const root = document.getElementById("root"); 10 11ReactDOM.render( 12 <React.StrictMode> 13 <App /> 14 <ClassComponent /> 15 <Pagenation 16 sum={cities.length} 17 per={10} 18 initialData={cities.slice(0, 10)} 19 component={ListComponent} 20 /> 21 </React.StrictMode>, 22 root 23);

pagenation

1import React, { useReducer } from "react"; 2import List from "@material-ui/core/List"; 3import Button from "@material-ui/core/Button"; 4 5import cities from "./Data"; 6 7const reducer = (state, action) => { 8 switch (action.type) { 9 case "viewPreview": 10 return { 11 ...state, 12 currentPage: state.currentPage - 1, 13 resourceData: action.data, 14 }; 15 case "viewNext": 16 return { 17 ...state, 18 currentPage: state.currentPage + 1, 19 resourceData: action.data, 20 }; 21 default: 22 } 23}; 24 25const sliceData = (offset, per) => { 26 return cities.slice(offset, offset + per); 27}; 28const Pagenation = ({ sum, per, initialData, component }) => { 29 const [state, dispatch] = useReducer(reducer, { 30 currentPage: 1, 31 sum: sum, 32 per: per, 33 pageAmount: Math.ceil(sum / per), 34 resourceData: initialData, 35 component: component, 36 }); 37 38 const viewPreview = () => { 39 const offset = (state.currentPage - 2) * state.per; 40 return dispatch({ 41 type: "viewPreview", 42 data: sliceData(offset, state.per), 43 }); 44 }; 45 46 const viewNext = () => { 47 const offset = state.currentPage * state.par; 48 return dispatch({ type: "viewNext", data: sliceData(offset, state.per) }); 49 }; 50 51 return ( 52 <> 53 <List> 54 {state.resourceData.length > 0 ? ( 55 state.resourceData.map((e) => state.component({ props: e })) 56 ) : ( 57 <p>表示するデータがありません</p> 58 )} 59 </List> 60 <Button onClick={viewPreview} disabled={state.currentPage === 1}> 61 前へ 62 </Button> 63 <div> 64 {state.currentPage} / {state.pageAmount} 65 </div> 66 <Button 67 onClick={viewNext} 68 disabled={ 69 state.currentPage === state.pageAmount || state.pageAmount === 0 70 } 71 > 72   次へ 73 </Button> 74 </> 75 ); 76}; 77 78export default Pagenation; 79

List

1import React from "react"; 2import ListItem from "@material-ui/core/ListItem"; 3import ListItemText from "@material-ui/core/ListItemText"; 4 5export const ListComponent = ({ props }) => ( 6 <ListItem> 7 <ListItemText primary={props.name} secondary={props.id} /> 8 </ListItem> 9); 10

補足情報(FW/ツールのバージョンなど)

"@material-ui/core": "^4.11.0",
"@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^9.3.2",
"@testing-library/user-event": "^7.1.2",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-scripts": "3.4.1"

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

const viewNext = () => {
const offset = state.currentPage * state.par;
return dispatch({ type: "viewNext", data: sliceData(offset, state.per) });
};

この部分が正しくはperでした。原因はタイプミスでした。
お騒がせしました。

投稿2020/07/13 09:35

sinsia

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問