Vue.js/リストを作った
はじめの一歩
「一覧画面」みたいに言われる画面を作りましょう。
const app = Vue.createApp({
data() {
return {
rows: [
{ id: 1, name: 'Taro', age: 5, country: 'Japan' },
{ id: 2, name: 'Jiro', age: 3, country: 'Japan' },
{ id: 3, name: 'John', age: 15, country: 'U.K.' },
{ id: 4, name: 'Michael', age: 8, country: 'U.S.A.' },
{ id: 5, name: 'Martín', age: 24, country: 'Spain' },
{ id: 6, name: 'Miguel', age: 5, country: 'Mexico' },
],
}
}
});
app.mount('#list');
rowsというデータに人名や年齢を詰め込んだリストを用意してみました。
<div id="list">
<ul>
<li v-for="(r,index) in rows">
<span>氏名: {{ r.name }}</span>
<span>( {{ r.age }} )</span>
<span>{{ r.country }} 出身</span>
</li>
</ul>
</div>
v-forループを使って一覧表示しました。これを基本のリストとします。
件数表示
<div id="list">
<p>{{ rows.length }}件数</p>
<ul> .. </ul>
</div>
リストの上に表示件数を出してみました。rowsの中身の数を数えただけ(Array.length)ですね。
絞り込み
<div id="list">
<p>{{ filterdRows.length }}件数</p>
<p><input type="text" v-model="keyword"></p>
<ul>
<li v-for="(r,index) in filterdRows">
<span>氏名: {{ r.name }}</span>
<span>( {{ r.age }} )</span>
<span>{{ r.country }} 出身</span>
</li>
</ul>
</div>
リストをキーワードで絞り込んでみます。テキストフィールドを足して、そこに入力されたテキストが含まれるものだけリストに表示されるようにします。テキストフィールドには v-model="keyword" という指定が入りましたね。Vueのデータ(data)に keyword というのを追加すると、テキストフィールドの入力内容とkeyword値が同期されるようになるそうです。これは便利!
今までrows配列の中身を表示していましたが、絞り込みが済んだfilterdRowsという新しい配列を作ってそれを表示させましょう。v-forループのところと件数表示のところをfilterdRowsに変更しました。
const app = Vue.createApp({
data() {
return {
rows: [ .. ],
keyword: '',
}
},
computed: {
filteredRows() {
return rows.filter(r => {
if (this.keyword) {
return (r[1]+r[2]+r[3]).match(this.keyword);
}
return true;
});
},
}
});
app.mount('#list');
data部にkeywordを追加しました。とりあえず空の状態です。
そしてcomputed部が新たに増えました。data部が事前に中身が決められた静的なデータだとすれば、computed部はその都度計算して決定される動的なデータって感じですかね。keywordの中身が空の場合は、絞り込みは行わず全リストを表示します。keywordが入力されていたら、rowsの中身毎に「氏名・年齢・出身国」を連結した文字列の中にkeywordがあるかどうかをチェックし、あったものだけ表示します。これだけ書けば、もう意図した通りに動いてくれました。ありがたや~。
次回、もうちょっと機能を追加してみましょう。
- Vue.js/ライフサイクル例によってデータを詰めたVueのAppを用意しました。このrowsの部分はよそのシステムやデータベースが出力したJSON的なものだったりして、事前に手を加えられâ¦
- Vue.js/日記002<div id="app"> {{ message }} </div> 前回、二重括弧({{}})で囲んだ部分がテンプレート機能のようにVue.jsの制御下に置â¦
- Vue.js/リストを改良した前回 、複数ある項目をリスト表示して、件数を数えて、絞り込み機能をつけました。絞り込まれたリスト(filteredRows)が現在の表示対象です。全部で6件あるâ¦
- Vue.js/メニューを作った試しにクリックして選ぶメニューを作ることにしました。 メニューからカテゴリーを選ぶ、といった用途のつもりです。データ部にはカテゴリーの選択肢リストと現在選択中のâ¦
- Gutenberg/日記002前回、create-guten-blockによって生成されたブロックの雛形情報の実体は、プラグインフォルダの中の src/block/blocks.js の中にâ¦
- Gutenberg/日記006Wordpressの記事編集画面で、テキストの次に入力したくなるのは画像情報だと思います。今回は実際に作成したブロックをご紹介します。ブロックの概要は「画像と著â¦
- Vue.js/日記003WEBの特性でもあるインタラクティブな部分はVue.jsではどう記述するのかなと思ったら、メソッドを規定しておいて、操作対象の要素に必要なメソッドを紐づければいâ¦
- Gutenberg/日記003前回ブロックの構成をある程度把握できたので、今回は実際に使えるブロックに仕上げてみます。簡単な目標として、記事編集画面上でリッチテキストエディタによって中身が編â¦
- Gutenberg/日記005ちゃんと調べないでなぁなぁのままのままできてしまった部分を少し補完していこうと思います。Gutenbergのブロックで入力された値を扱うにあたって attribâ¦
- 開発日記/2010年の日記MovableType OpenSourceの5.03を使っていたら、FirefoxでJavaScriptのエラーが発生しました。原因はまだ不明ですが、「mt-â¦