Vue.js/リストを改良した
ページングした
前回、複数ある項目をリスト表示して、件数を数えて、絞り込み機能をつけました。絞り込まれたリスト(filteredRows)が現在の表示対象です。全部で6件あるデータ(rows - filteredRows)を2件ずつ表示するページング機能(rows - filteredRows - pagedRows)を作ってみましょう。
const app = Vue.createApp({
data() {
return {
rows: [ .. ],
page: 0,
per: 10,
...
}
},
computed: {
filteredRows() { .. },
pagedRow() {
return this.filteredRows.slice(this.page*this.per,this.page*this.per+this.per);
},
}
});
app.mount('#list');
data部にページングされた何ページ目を表示されるかを表す page と1ページにいくつデータを表示するかを表す per という項目を足しました。pageは0始まりなので初期値は0です。6件のデータを1ページ2件、3ページに分けるのでperは2です。
computed部のpagedRowはfilteredRowsから選択されたページ(page)のデータを抜き出して返します。
これで最初の1ページ目が表示されるようになりました・・・が、次のページに移動できません。pageデータを変更する操作部を作りましょう。
操作部
const app = Vue.createApp({
data() { .. },
computed: { .. },
methods: {
pageList() {
const n = this.pageNumber()+1;
const c = this.page+1;
let list = [],to = false;
for (let x=1;x<=n;x++) {
if (
x === 1 ||
x === n ||
(c <= 4 && x <= 5) ||
(c > 4 && c <= n - 4 && (c - 1 <= x && x <= c + 1)) ||
(c > n - 4 && x >= n - 4)
) {
list.push(x);
to = false;
} else if (!to) {
list.push(-1);
to = true;
}
}
return list;
},
pageNumber() {
return Math.floor((this.filteredRows.length-1)/this.per);
},
prevPage() {
if (this.page>0) this.movePage(this.page-1);
},
nextPage() {
if (this.page+1<=this.pageNumber()) this.movePage(this.page+1);
},
movePage(p) {
this.page = p;
},
}
});
app.mount('#list');
methods部にpageListというのを用意しました。これを呼び出した場所にページ番号の選択肢の配列を返します。番号が多すぎて画面がぐちゃぐちゃにならないように、よくある中間を間引く処理もついています。
pageNumberはページの数を返すメソッドで、指定のページに移動するのがmovePage、前後のページに移動するのがそれぞれprevPage、nextPageです。page値を書き換えるだけで描画してくれるので楽ちん!
<div class="paging">
<span class="prev" v-if="page != 0" @click="prevPage">←</span>
<span class="numbers">
<span v-for="p in pageList()" :class="pageClass(p)" @click="movePage(p-1)">{{ p==-1 ? '…' : p }}</span>
</span>
<span class="next" v-if="page != pageNumber()" @click="nextPage">→</span>
</div>
HTML側はこんな感じにしてみました。番号列の前後にはクリックすると一つ前のページ、一つ後ろのページに移動する要素も置いてあります。
computedでデータを整形して、操作するUIをつけてあげる・・・こういうのを役割に応じていじる部分が固まっているのが、製作を楽にしてくれるんでしょうね。保守性はまだわかんないですけど。
- Vue.js/リストを作った「一覧画面」みたいに言われる画面を作りましょう。 rowsというデータに人名や年齢を詰め込んだリストを用意してみました。 v-forループを使って一覧表示しましâ¦
- WPF/日記5前回Identityで作成した アニメーション3Dモデルデータは、プログラム上でユーザのチャット空間への入退室に連動して動的に追加したり削除したりする必要がありâ¦
- Vue.js/ライフサイクル例によってデータを詰めたVueのAppを用意しました。このrowsの部分はよそのシステムやデータベースが出力したJSON的なものだったりして、事前に手を加えられâ¦
- JavaScript/Webコンポーネント/ライフサイクルコールバックcustomElements.define('fan-menu', FanMenu); 前回、こんな感じで独自のタグとその実体となるクラスを結びつけました。このâ¦
WPF/日記4昨日、うまくいかなかった部分について検討を加えて直してみました。画像を貼り付けたポリゴンがうまく表示されなかった原因は、貼り付けた画像のサイズが極端に大きかったâ¦- JavaScript/Webコンポーネント/コンポーネント状態属性Webコンポーネントは内部に持つShadow DOMを外部のLight DOMと切り離して考えられるところがいいのですが、コンポーネントの内部状態を外から操作しâ¦
- Vue.js/メニューを作った試しにクリックして選ぶメニューを作ることにしました。 メニューからカテゴリーを選ぶ、といった用途のつもりです。データ部にはカテゴリーの選択肢リストと現在選択中のâ¦
- Androidアプリ/日記8SoftbankキャリアのHTC Desireも2010年10月8日にAndroid OS 2.2へのアップデートを果たしました。噂の通り、動作が全般的に機敏にâ¦
- Kotlin/ドロワーに再挑戦前回、ScaffoldからdrawerContentを指定してドロワーを実装しようとしたら、今はその手が通じないと言われたのでした。マテリアル3(M3)への過渡â¦
- Vue.js/日記003WEBの特性でもあるインタラクティブな部分はVue.jsではどう記述するのかなと思ったら、メソッドを規定しておいて、操作対象の要素に必要なメソッドを紐づければいâ¦