田無rb#3
前回に引き続き Vue.js&Nuxt.js超入門 の続きをやっていきます
Chapter5 Nuxt.jsにアップグレード!
前回ガッと写経してアプリを作るところまでやったので、気になった点をメモしながら解説部分を読んでいきます
.vueファイルの template 部分
- 入力フィールドに対して
@focus="foo"
と記述すると、フォーカスが当たった時にfoo
を実行する@click="bar"
でクリックに対して実行できる@
はv-on
の省略記法
transition
で要素を囲むと、その要素が追加や削除される時にアニメーションを適用したりできる
<template> <transition name="del"> <button v-if="baz != false">delete</button> </transition> </template> <style> .del-enter-active, .del-leave-active { transition: opacity 5s; } .del-enter, .del-leave-to { opacity: 0; } </style>
- このサンプルアプリはページネーションを実現するのに
span
タグのクリックをトリガとして実現している- 🤔 ページ遷移程度だから自前で実装した感じかな。リンクについて調べてみたら
nuxt-link
というコンポーネントが用意されてるから、ページ遷移はそういったものを使うケースが多いのかな
- 🤔 ページ遷移程度だから自前で実装した感じかな。リンクについて調べてみたら
.vueファイルの script 部分
- Vuexでモジュールモードを使うときは、ステートは
$store.state.モジュール.○○
という形で指定 - 復習:Vuexのミューテーションを呼び出すためには
$store.commit
メソッドを実行
Chapter5はここまで
Chapter6 外部サービスを利用しよう!
- 見出しを見てみたところ
axios
パッケージを使っての外部連携と、Firebase
を使うとのこと - 🤔 外部連携で言うと
fetch
がデフォルトじゃなかったかなと言う記憶があったので調べてみました- Fetch APIはネイティブAPIだから外部リソースの読み込みは不要だけど、完全にサポートされてはいないから、現状は
axios
を好んで使う人が多いらしい - axios を利用した API の使用 — Vue.js
- Fetch APIはネイティブAPIだから外部リソースの読み込みは不要だけど、完全にサポートされてはいないから、現状は
axios
- インストール方法
$ npm install --save axios
- 後からインストールもできるけど、プロジェクト生成時にインストールも可能とのこと
- 実際に新規生成をしてみたところ以下のような選択肢が出現
? Choose features to install (Press <space> to select, <a> to toggle all, <i> to invert selection) ◯ Progressive Web App (PWA) Support ◯ Linter / Formatter ◯ Prettier ❯◯ Axios
- インポート方法
const axios = require('axios');
と書いてある。import じゃアカンのかなと思って調べてみたけど、特に優劣は無さそう。好きな方で良いらしい - データ取得方法
変数 = await axios.get(アドレス)
- 返されたオブジェクトの
data
プロパティにデータが保存されている await
は非同期処理を利用する際に用いられる
- 返されたオブジェクトの
- cssの
white-space
のpre-wrap
- ボックスサイズが指定されている場合にはそれに合わせて自動改行する
- white-space-スタイルシートリファレンス
- nuxtアプリ自身の
static/README.md
の内容を表示させるためにlet url = "/README.md"
と書いていたがNuxtServerError connect ECONNREFUSED 127.0.0.1:80
というエラーが発生 asyncData
について- 非同期で扱うデータをまとめた管理する関数であり、この中で非同期の値を用意してオブジェクトの形にして返す
- この返された値は自動で
data
にマージされる
- この返された値は自動で
- コンポーネントが用意される前に呼び出される
- 非同期で扱うデータをまとめた管理する関数であり、この中で非同期の値を用意してオブジェクトの形にして返す
asyncData: async function() { ...非同期処理... return { 取得した値 } }
今日はここまで。次はChapter6の JSONデータのサイトを活用しよう から
その他
- vimでカーソル行を行頭に持ってきたいときは
z<enter>
orzt
田無rb#2
昨日に引き続き「Vue.js&Nuxt.js超入門」の写経の続きをやっていきます
Section 5-4 メモアプリを作ろう!
アプリ作成に挑戦
データをローカルストレージに保存できるようになったのでメモ書きアプリを作ってみる
できること
- メモの登録
- タイトルと内容が登録できる
- タイトルで検索する機能も兼ねている
- リスト閲覧
- ページネーション付き
- タイトルと作成日時が表示されている
- タイトルクリックで登録フォームにて編集できる
プロジェクトを作る
npx create-nuxt-app コマンドでプロジェクトを作成 ローカルストレージに値を保存するため rendering mode は spa を指定しておく
$ npx create-nuxt-app memo_app
ディレクトリ移動してサーバ起動
$ cd memo_app $ npm run dev
store/index.js
を作成して、 vuex-persistedstate
を使う設定を書いておく
store/memo.js を作成する
メモアプリ用のストアファイル store/memo.js
を作成
🤔内容はメモ追加、ページネーション設定、メモ削除のミューテーション定義っぽい感じ
クラシックモードからモジュールモードへ!
ストアには1つのファイル(index.js)に全てのストア関係を記述するクラシックモードと、storeディレクトリの中に複数ファイルを設置し、それぞれに内容を記述するモジュールモードがある
🤔よっぽど小規模のアプリならクラシックモードでいいかもしれないけど、基本モジュールモードが良さそう
クラシックモードは Vuex.Store オブジェクトを返す関数を用意して、export defaut する形
const createStore = () => { return new Vuex.Store({ state: function() { return { ... } }, mutation: { foo: function(state) { ... }, }, }) } export default createStore
モジュールモードは Vuex.Store オブジェクトの作成は行わない。ストア関連の情報を個別に export していく形
export const state = () => ({ ... }) export const mutations = { foo: function(state) { ... } }
storeファイル内に複数ファイルに対してこのように記述したら、全て読み込まれ内容をまとめて扱えるようにしてくれるとのこと
memoストアに用意するもの
store/memo.js
にはstate、mutationを記述している
- state:
- memo: メモを保管するための配列
- page: 現在表示しているページ数を扱うための数値
- mutation:
- insert: メモを追加する処理
- set_page: 引数の数値をpageステートに設定
- remove: メモの中から引数に渡されたメモを削除
📝 spliceメソッド - arr.splice(i, 1) といった形で使う - 第一引数で指定したインデックス番号のものから、第二引数の数だけ要素を取り除く
vuex-persistedstate
プラグインの導入を行っていなかったのでやっておく
$ npm install vuex-persistedstate
memo.vueを作成する
ここでガッツリコンポーネント(.vueファイル)の作成を行う
動くところまで持っていけた! 今日はここまで
田無rb#1
勉強の記録をブログに残していこうかなという気持ちになったので(続くかは分かりません!)筆を執ってみました@田無のカフェ
テンションがアゲアゲになるので勉強会っぽいタイトルにしてみましたが、ただ一人でモクモクしているだけです
以前やっていた「Vue.js&Nuxt.js超入門」という本の写経の続きをやっていきます(rbとはなんだったのか)
Chapter5「Nuxt.jsにアップグレード!」の中途半端ところで止まっていたのでその続きから
久しぶりすぎてアプリの起動方法を忘れている。本を遡って以下のコマンドで実行できることを確認
$ npm run dev
それでは読み進めていきやしょう
Section5-3 Vuexによる状態管理
の途中の
アクションを利用する
ミューテーションを実行するためのアクションを利用するとのこと
ミューテーションってなんだっけ…本を遡って確認
stateを直接書き換えるのは推奨されていないからミューテーションという機能を使ってネ
とのこと
このミューテーションを実行するのがアクション アクションの第一引数にはcontextというオブジェクトが渡され、contextのcommitメソッドを使ってミューテーションを実行するらしい
mutations: { foo: function(state) { ... }, bar: function(state) { ... } }, actions: { baz: function(context) { context.commit('foo'); context.commit('bar'); } }
テンプレートから以下のように呼び出すことができる
<div @click="$store.dispatch('baz')"></div>
複数のミューテーションを一つのアクションから呼び出すように定義できて便利!ということなのかな
値をずっと保持するには?
stateの値はリロードすると消えるからそれをローカルストレージに保持してみましょうという話 vuexに標準でその仕組みはないらしいのでプラグインをインストール
$ npm install vuex-persistedate
vuex-persistedstateとモードについて
ローカルストレージに保存する仕組みのため、サーバサイドレンダリングを使う場合は利用できない Vuexのモードを変更する必要があるとのこと デフォルトではサーバサイドとクライアントサイドどちらのレンダリングにも対応しているがそれをspaモードに書き換え
nuxt.config.js
のmodeを指定している行を以下のように書き換え
mode: 'spa',
Vuexでvuex-persistedstateを利用する
store/index.js
にて vuex-persistedstate
を読み込む設定を追加する
下記コードの importの部分とpluginの部分だけ追記すれば良さそう
手元では他にも一部書き換えている(アクションの部分をミューテーションに書き換えている)けど直接的な影響は無さそう
一部抜粋
import Vuex from "vuex" import createPersistedState from "vuex-persistedstate" const createStore = () => { return new Vuex.Store({ ... plugins: [ createPersistedState(), ], }) } export default createStore
テンプレート側も修正(アクションを呼び出していたのをミューテーションを呼び出す形にする)
<div class="link" @click="$store.commit('doit')">
リロードしても値が保持されたままになっている〜 🎉
今日はここまで
5/8~5/12のファイターズ
3勝2敗0分
基本オーダー
中 西川 .353 右 大田 .263 左 近藤 .235 一 中田 .176 指 田中賢介 .250 二 渡邉 .500 三 石井 .250 捕 清水 .000 遊 中島卓也 .133
5/1~5/6のファイターズ
3勝3敗0分
基本オーダー
中 西川 .286 右 大田 .440 左 近藤 .304 一 中田 .231 指 田中賢介 .400 二 渡邉 .222 三 平沼 .286 遊 中島卓也 .182 捕 清水 .308
3,4月のファイターズ
12勝12敗2分
4/16~4/21のファイターズ
2勝3敗0分
基本オーダー
中 西川 .238 右 大田 .263 指 王 .350 左 近藤 .158 一 中田 .263 三 横尾 .211 二 渡邉 .200 遊 中島卓也 .353 捕 鶴岡 .125