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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

SPA(Single-page Application)

SPA(Single-page Application)は、単一のWebページのみでコンテンツの切り替えができるWebアプリケーションもしくはWebサイトです。ブラウザでのページ遷移がないため、デスクトップアプリケーションのようなUXを提供します。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

0回答

1618閲覧

Inertiaでpaginationを実装

daidai8

総合スコア0

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

SPA(Single-page Application)

SPA(Single-page Application)は、単一のWebページのみでコンテンツの切り替えができるWebアプリケーションもしくはWebサイトです。ブラウザでのページ遷移がないため、デスクトップアプリケーションのようなUXを提供します。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2021/12/06 08:36

Vue.js、laravelでSPAアプリを作っています。Inertiaでpaginationを実装しようとしているのですが、エラーがでて困っております。

TaskController

1class TaskController extends Controller 2{ 3 public function index() 4 { 5               $tasks = DB::table('tasks')->orderBy('created_at', 'desc')->paginate(2); 6 7 return Inertia::render ( 8 'Task/Index', 9 ['tasks'=> $tasks] 10 ); 11 } 12}

↑このようにpaginate(数字)をつけることで全件中2件とって来れると思うのですが、[TypeError: Cannot read properties of null (reading 'id')]が出てきてしまいます。

※consoleではしっかりcurrent_pageの件数が2件と内容も出力されています。

class TaskController extends Controller { public function index() {                $tasks = DB::table('tasks')->orderBy('created_at', 'desc')->get()->paginate(2); return Inertia::render ( 'Task/Index', ['tasks'=> $tasks] ); } }

↑もちろんget()をつければ全件とってこれますが、paginateがやりたいので、仮に上記のようにget()の後ろにpaginateを指定するとエラーが出ます。getとpaginateは混在できないですよね。

試したことは下記の記事を参考にしました。
https://stackoverflow.com/questions/66846136/laravel-inertia-vuejs-pagination
しかし解決には至らず。。。

 InertiaではLaravelのデフォルトのpaginateが使えなそうという事でしたが、いろんな記事や公式を見てもそんなことはなさそうで、普通に末尾にpaginate(数字)をつけて問題なさそうです。

原因が突き止められず質問させて頂きました。

Indexvue

1<template> 2 <app-layout title="Tasks"> 3 <header-component></header-component> 4 <div class="flash_message" id="flash_message" v-if="show === true"> 5 <i class="far fa-check-circle mr-1"></i> 6 {{ $page.props.flash.success }} 7 </div> 8 9 <table class="min-w-full border-collapse block md:table"> 10 <thead class="block md:table-header-group"> 11 <tr class="border border-grey-500 md:border-none block md:table-row absolute -top-full md:top-auto -left-full md:left-auto md:relative "> 12 <th class="bg-gray-600 p-2 text-white font-bold md:border md:border-grey-500 text-left block md:table-cell">Number</th> 13 <th class="bg-gray-600 p-2 text-white font-bold md:border md:border-grey-500 text-left block md:table-cell">Title</th> 14 <th class="bg-gray-600 p-2 text-white font-bold md:border md:border-grey-500 text-left block md:table-cell">Content</th> 15 <th class="bg-gray-600 p-2 text-white font-bold md:border md:border-grey-500 text-left block md:table-cell">Person in Charge</th> 16 <th class="bg-gray-600 p-2 text-white font-bold md:border md:border-grey-500 text-left block md:table-cell">Actions</th> 17 </tr> 18 </thead> 19 <tbody class="block md:table-row-group" v-for="(task, index) in tasks" :key="index"> 20 <tr class="bg-gray-300 border border-grey-500 md:border-none block md:table-row"> 21 <td class="p-2 md:border md:border-grey-500 text-left block md:table-cell"><span class="inline-block w-1/3 md:hidden font-bold">Number</span>{{ task.id }}</td> 22 <td class="p-2 md:border md:border-grey-500 text-left block md:table-cell"><span class="inline-block w-1/3 md:hidden font-bold">Title</span>{{ task.title }}</td> 23 <td class="p-2 md:border md:border-grey-500 text-left block md:table-cell"><span class="inline-block w-1/3 md:hidden font-bold">Content</span>{{ task.content }}</td> 24 <td class="p-2 md:border md:border-grey-500 text-left block md:table-cell"><span class="inline-block w-1/3 md:hidden font-bold">Person in Charge</span>{{ task.person_in_charge }}</td> 25 <td class="p-2 md:border md:border-grey-500 text-left block md:table-cell"> 26 <span class="inline-block w-1/3 md:hidden font-bold">Actions</span> 27 <button class="bg-green-500 hover:bg-green-700 text-white font-bold py-1 px-2 border border-green-500 rounded"> 28 <Link :href="`/task/${task.id}`"> 29 show 30 </Link> 31 </button> 32 <button class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-1 px-2 border border-blue-500 rounded"> 33 <Link :href="`/task/${task.id}/edit`"> 34 Edit 35 </Link> 36 </button> 37 <button @click="deleteTask(task)" class="bg-red-500 hover:bg-red-700 text-white font-bold py-1 px-2 border border-red-500 rounded"> 38 Delete 39 </button> 40 </td> 41 </tr> 42 </tbody> 43 </table> 44 <paginator :paginator="tasks" /> 45 </app-layout> 46</template> 47 48<script> 49 import { defineComponent } from 'vue' 50 import AppLayout from '@/Layouts/AppLayout.vue' 51 import HeaderComponent from '@/Pages/components/HeaderComponent.vue' 52 import { Link } from '@inertiajs/inertia-vue3' 53 import Paginator from "@/Components/Paginator"; 54 55 56 export default defineComponent({ 57 components: { 58 AppLayout, 59 HeaderComponent, 60 Link, 61 Paginator, 62 }, 63 props: [ 64 'tasks', 65 'show', 66 ], 67 data: function() { 68 return { 69 show:false 70 } 71 }, 72 methods: { 73 deleteTask: function (task) { 74 this.$inertia.delete('/task/'+ task.id); 75 this.show = true; 76 }, 77 }, 78 updated() { 79 setTimeout(() => { 80 this.show = false} 81 ,3000 82 ) 83 }, 84 mounted: function () { 85 this.show = this.$page.props.flash.show; 86 setTimeout(() => { 87 this.show = false} 88 ,3000 89 ) 90 } 91 }) 92 93</script> 94<style> 95 .flash_message { 96 background-color: rgb(122, 196, 27); 97 width: 280px; 98 font-size: 0.8rem; 99 padding-left: 10px; 100 padding-top: 5px; 101 padding-bottom: 5px; 102 position: fixed; 103 top: 13.5%; 104 left: 1%; 105 opacity: 0.9; 106 border-radius: 6px; 107 z-index: 10; 108 } 109</style>

表示はInertiaVuePaginatorというものを使って表示させる予定です。
<paginator :paginator="tasks" />のところはそれになります。

何卒ご教示いただけると幸いです。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問