前提・実現したいこと
ページネーション機能実装後に、投稿削除機能をつけたい。
※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までしか発行されないことが原因だと思われます。
既存のデータを別の配列へ格納させること自体が間違っているのでしょうか?
いい方法があれば教えていただけると幸いです????♂️
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/23 10:00
2021/04/23 17:30