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

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

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

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

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

ページネーション

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

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

1回答

1236閲覧

ページネーション時の投稿削除について

F_Yohei

総合スコア14

Vue.js

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

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

ページネーション

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

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/04/23 06:57

前提・実現したいこと

ページネーション機能実装後に、投稿削除機能をつけたい。
※Nuxt.jsで開発しています。

該当のソースコード

vue

1<template> 2 <!-- 商品一覧 --> 3 <div> 4 <ul class="list_header"> 5 <li v-for="(product, index) in displayLists" :key="index"> 6 <div class="list_title"> 7 <p>{{ product.shop }}</p> 8 <p class="openEdit" @click="openEdit(index)">・・・</p> 9 </div> 10 <div class="list_product_details"> 11 <div class="list_price_box"> 12 <p>価格</p> 13 </div> 14 <p>{{ product.name }}</p> 15 <small>{{ product.quantity }}{{ product.unit }}</small> 16 <p>{{ product.price }}円</p> 17 </div> 18 19 <div class="list_date"> 20 <p>{{ product.date }}</p> 21 <p>{{ product.user }}</p> 22 </div> 23 </li> 24 </ul> 25 </div> 26 27 <!-- ページネーションボタン --> 28 <v-content> 29 <div class="text-center"> 30 <v-pagination 31 v-model="page" 32 :length="getPageLength" 33 @input = "pageChange" 34 ></v-pagination> 35 </div> 36 </v-content> 37</template> 38 39<script> 40export default { 41 data: function() { 42 return { 43 index, 44 page: 1 45 }; 46 }, 47 computed: { 48 displayLists() { 49 return this.$store.getters.displayLists; 50 }, 51 //ページ数の取得 52 getPageLength() { 53 return this.$store.getters.getPageLength; 54 } 55 }, 56 mounted() { 57 // 投稿された商品情報を表示 58 this.$store.dispatch('displayLists'); 59 // 投稿数に対してのページ数を取得 60 this.$store.dispatch('getPageLength'); 61 }, 62 methods: { 63 // ページネーションを発火させる為の関数 64 pageChange: function(pageNumber){ 65 this.$store.dispatch('pageChange', pageNumber); 66 }, 67 // 投稿を削除する関数 68 deletePost() { 69 this.$store.dispatch('deletePost', this.index); 70 }, 71 } 72}; 73</script>

javascript

1import Vuex from 'vuex'; 2const createStore = () => { 3 return new Vuex.Store({ 4 state: function() { 5 return { 6 products: [ 7 {user: '太郎',shop: '東京野菜市場',price: 100,name: 'トマト',quantity: 1,unit: '個',date: '2021/04/15 11:30'}, 8 {user: '花子',shop: '巣鴨野菜市場',price: 50,name: 'なす',quantity: 2,unit: '個',date: '2021/04/05 12:30'}, 9 {user: '一郎',shop: '新宿野菜市場',price: 300,name: 'りんご',quantity: 3,unit: '個',date: '2021/04/03 13:30'}, 10 {user: '二郎',shop: '杉並区野菜市場',price: 200,name: 'きゅうり',quantity: 2,unit: '個',date: '2021/04/04 14:30'}, 11 {user: '三郎',shop: '世田谷区野菜市場',price: 130,name: 'ほうれん草',quantity: 1,unit: '個',date: '2021/04/05 16:30'}, 12 {user: '三郎',shop: '世田谷区野菜市場',price: 150,name: 'ぶどう',quantity: 1,unit: '個',date: '2021/04/05 16:30'}, 13 {user: '三郎',shop: '世田谷区野菜市場',price: 110,name: 'キャベツ',quantity: 1,unit: '個',date: '2021/04/05 16:30'}, 14 {user: '三郎',shop: '世田谷区野菜市場',price: 200,name: 'ぶどう',quantity: 1,unit: '個',date: '2021/04/01 10:30'}, 15 {user: '四郎',shop: '世田谷区野菜市場',price: 110,name: 'オレンジ',quantity: 1,unit: '個',date: '2021/04/01 11:03'}, 16 {user: '一郎',shop: '新宿野菜市場',price: 200,name: 'りんご',quantity: 2,unit: '個',date: '2021/04/08 13:30'}, 17 {user: '花子',shop: '巣鴨野菜市場',price: 100,name: 'なす',quantity: 3,unit: '個',date: '2021/04/02 12:30'}, 18 ], 19 displayLists: [], 20 length: 0, 21 pageSize: 10, 22 filterWord: { name: 'すべて' }, }; 23 }, 24 getters: { 25 displayLists: function(state) { 26 if (state.filterWord.name === 'すべて') { 27 return state.displayLists; 28 } else { 29 const result = state.displayLists.filter(function(value) { 30 return value.name === state.filterWord.name; 31 }); 32 return result; 33 } 34 }, 35 getPageLength: function(state) { 36 return state.length; 37 } 38 }, 39 mutations: { 40 deletePost(state, index) { 41 state.displayLists.splice(index, 1); 42 state.products.splice(index, 1); 43 }, 44 displayLists(state) { 45 state.displayLists = state.products.slice(0, state.pageSize); 46 }, 47 pageChange(state, pageNumber) { 48 state.displayLists = state.products.slice( 49 state.pageSize * (pageNumber - 1), 50 state.pageSize * pageNumber 51 ); 52 }, 53 getPageLength(state) { 54 state.length = Math.ceil(state.products.length / state.pageSize); 55 } 56 }, 57 actions: { 58 // 配列productsに格納されているデータの中から10件ずつ表示させる為の関数 59 displayLists({ commit }) { 60 commit('displayLists'); 61 }, 62 // ページネーションさせる関数 63 pageChange({ commit }, pageNumber) { 64 commit('pageChange', pageNumber); 65 }, 66 // ページネーションするページ数を取得 67 getPageLength({ commit }) { 68 commit('getPageLength'); 69 }, 70 // 商品情報削除処理 71 deletePost({ commit }, index) { //クリックされた要素のインデックス番号を取得し引数として渡す 72 commit('deletePost', index); 73 }, 74 } 75 }); 76}; 77export default createStore;

発生している問題・エラーメッセージ

配列productsの中に入っているデータを10件ずつ取り出し、空の配列displayListsに格納後、v-forで表示するようにしています。
不要な投稿を削除しようとした時に、products、displayListsそれぞれの配列から該当する配列番号のデータを削除しようとした時にそれぞれ違うデータが削除されるようになってしまいました。

原因はページネーションで10件ずつの表示にしている為、仮にproductsのデータが20件あったとしてもindexが0〜9までしか発行されないことが原因だと思われます。

既存のデータを別の配列へ格納させること自体が間違っているのでしょうか?

いい方法があれば教えていただけると幸いです????‍♂️

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

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

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

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

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

guest

回答1

0

Vueで配列から削除処理するときはarray.spliceじゃなくてthis.$delete(array,idx)を使いましょう。連想配列でspliceを使うと、基準キーの値がどんどんずれていってしまいますよ。

投稿2021/04/23 09:23

編集2021/04/23 09:30
FKM

総合スコア3644

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

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

F_Yohei

2021/04/23 10:00

ありがとうございます。 配列から削除はできるのですが、配列productsと配列displayListsから同じ投稿が削除されないことに関しては変わらずでした。。。
FKM

2021/04/23 17:30

displayListsがページネーション用にも区切ってしまっているためですね。 なので、 1:productsからデータを削除した 2:削除されたproductsから新たにdisplayListsを生成 この動きの方が自然です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問