Vue.jsの学習メモ
フロントエンドの勉強もしたいみたいなことを言ってたので、Vue.jsを勉強していきます。ちなみにSPA開発は前職でBackbone.jsベースの内製フレームワークとAngularJS (1.4.x) くらいしか経験がありません。
React.jsと迷いましたが迷うならどっちも触ればいいじゃんということで、まずはVue.jsを選んでみました。決め手は見た目のキムワイプ感です。
ググって出てきた以下の記事をそのままなぞるだけのつもりなので、気になったところだけ脳内を出力していきます。
Vue.jsアプリにホストOSからアクセスできない
vagrantで作った環境を使ってプロジェクトを生成したところ、アプリを起動してホストOSからlocalhost:8080にアクセスしても「サイトにアクセスできません」という画面になった。
アプリケーションのログで「headlessな環境ではopenフラグを使うな」みたいなメッセージが出ていたので、よくわからないがpackage.json
の以下の部分を修正。
修正前
"scripts": { "dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot",
修正後
"scripts": { "dev": "cross-env NODE_ENV=development webpack-dev-server --hot",
メッセージは出なくなったが相変わらずアクセスはできない。
tmuxを起動してウィンドウを二つにして、一方でアプリを起動してもう一方でlocalhost:8080をwgetしてみると、index.htmlの中身が取得できた。
なんか設定が必要なんだろうか。試しにN予備校のアプリケーションを起動してみたところホストOSからアクセスできた。うーむ。
「vagrant webpack dev server」とかでググると出てきた情報をもとにwebpack.config.js
を編集。
編集前
devServer: { historyApiFallback: true, noInfo: true, overlay: true },
編集後
devServer: { historyApiFallback: true, noInfo: true, overlay: true, host: "0.0.0.0", port: 8000 },
私の環境だとhost: "0.0.0.0"
だけではアクセスできず、試しにポートを8000にしたらホストOSからhttp://localhost:8000
でアクセスできた。やっと進められる。
ところでvue-cli
でのプロジェクト生成時、webpack-simple
ではなくwebpack
を指定するとテスティングフレームワークとかLinterとか入ってて便利とのこと。今回はVue.jsの学習のためいったん置いておき、今後何かアプリをつくるときに改めて調べてみる。
ここまででやったこと
vagrant上の環境でhot reloadが効かない
解決策
解決できるっぽいが、しばらくは手動でちくちくやる。
ここまでやったこと
- 画面遷移はないので
router
は後回しにした- なので
index.html
App.vue
main.js
の3つだけの最小構成で作る(と思う)
- なので
.vue
のtemplate
要素の子にdiv
を二つ作ったら「ルートは一つにしろ」って怒られたform
でボタンとかインプットとかチェックボックスとか置いた- 最終形の確認のためタスクのリストは一旦手で複数書いてる
ボタンをクリックするとリロードされる
追加・削除のボタンの関数を実装してv-on
でそれぞれの関数が実行されるようにしたところ、ボタンをクリックしたらページがリロードされてURLの末尾に?
が付くみたいな感じになった。困った。
イベントを購読していない普通のbutton
でも同様の動きをするので、GETメソッドになってクエリパラメータの?
がついてしまうみたいなHTMLの動きだと思うたぶん。ひとまずevent.preventDefault()
でデフォルトの挙動を無視するようにした。対応がこれで合っているのか分からないがリロードされなくなったので良しとした。
ここまでやったこと
- リストレンダリング
v-for
- タスクをループで記述
- 双方向バインディング
v-model
- Vueコンポーネントに
newTodo
を定義してテンプレート側のinput
要素のv-model
属性に指定すると、入力がnewTodo
に反映される
- Vueコンポーネントに
- イベントを購読
v-on:click
してTodoリストを更新するように実装@click
のような省略も可能らしい
v-if
v-else
属性でフラグによって表示する要素を変更するv-bind:class
でフラグによってclass
を書き換える
GitHub pagesで公開されない
npm run build
の出力結果が違うので何とかする。ちょっとこれから用事があるので今日はここまで。