Vue.js ITかあさん

ITかあさん

Vue.jsでtoggleClass

Clickをしたら、特定の要素にclassが付与されて、もう一度clickしたら付与したClassが消える、JavaScript書いたことがある人なら誰しもが書いたことがあるであろう、あの処理をVue.jsで。

$(function() {
$('#btn').on('click', function() {
$(this).toggleClass('is-active');
});
});
<p v-on:click="toggleMenu">menuの開閉</p>
<div id="navMenu" :class="{'is-active': isActive}">
<menu>
<ul class="menu">
<li><a href="#">menu1</a></li>
<li><a href="#">menu2</a></li>
<li><a href="#">menu3</a></li>
<li><a href="#">menu4</a></li>
</ul>
</menu>
</div>
<script>
export default {
data: () => {
return {isActive: false}
},
methods: {
toggleMenu () {
this.isActive = !this.isActive
}
}
}
</script>

:class=”{‘is-active’: true}

is-classはtureの時にバインドされます。

Vuetify.jsでマテリアルデザインことはじめ

Vuetify.jsでマテリアルデザインことはじめ

スクリーンショット 2018-05-24 11.01.40.png (249.0 kB)

昨日Nuxt.jsの環境構築の記事を書かせて頂きましたが、テンプレートの変更や、ページの追加に触れてNuxt.jsの入門は終了したいと思います。

自分の作ったアプリケーションにcdで移動

$cd jsfes_nuxt/your-app-name

 

Nuxtのプロジェクトはこんな感じです。

your-app-name $ls -ll
total 752
-rw-r--r--    1 chihiro.matsuda  staff     376  5 19 00:42 README.md
drwxr-xr-x    3 chihiro.matsuda  staff      96  5 19 00:42 assets
drwxr-xr-x    5 chihiro.matsuda  staff     160  5 19 00:42 components
drwxr-xr-x    4 chihiro.matsuda  staff     128  5 19 00:42 layouts
drwxr-xr-x    3 chihiro.matsuda  staff      96  5 19 00:42 middleware
drwxr-xr-x  808 chihiro.matsuda  staff   25856  5 19 00:43 node_modules
-rw-r--r--    1 chihiro.matsuda  staff    1655  5 19 00:42 nuxt.config.js
-rw-r--r--    1 chihiro.matsuda  staff  369890  5 19 00:42 package-lock.json
-rw-r--r--    1 chihiro.matsuda  staff     702  5 19 00:42 package.json
drwxr-xr-x    5 chihiro.matsuda  staff     160  5 19 00:42 pages
drwxr-xr-x    4 chihiro.matsuda  staff     128  5 19 00:42 plugins
drwxr-xr-x    5 chihiro.matsuda  staff     160  5 19 00:42 static
drwxr-xr-x    3 chihiro.matsuda  staff      96  5 19 00:42 store

 

Sassを使えるようにする

生でCSSはもう書きたくないですね。そこで、Sassを使えるようにする必要があります。
package.jsonのあるディレクトリでnpmでパッケージをインストールします

$ npm install --save-dev node-sass sass-loader

 

nuxt.config.jsで使えるスタイルシートを追加する

assetsにディレクトリにscssフォルダを切って、そこにtodo.scssを追加することにしました。

  /*
  ** Global CSS
  */
  css: [
    'vuetify/src/stylus/main.styl',
    '@/assets/scss/todo.scss'
  ],

 

scss

sassが無事使えることだけを確認したいので、文字色を赤くするだけで試します

$red: red;
blockquote {
    color: $red;
}

 

スクリーンショット 2018-05-24 10.58.23.png (21.3 kB)
http://localhost:3000/inspire
にアクセスすると、更新ボタンを押さずにリアルタイムにブラウザに変更が保存されますね(SSRさまさまやで)

新規テンプレートの追加

現在はVuetifyのデフォルトテンプレートですので、白地にVuetifyのグリッドデザインでサンプルを作ってみます。

出来上がりの様子

スクリーンショット 2018-05-24 11.01.40.png (249.0 kB)
DoorKeeper のAPIを使って、イベントを取得してVuetifyのグリッドで表示してみました。もちろん、APIを叩くにはNuxt.jsの環境構築の際にインストールしたaxiousを使っています。

テンプレートの追加

テンプレートの追加は非常に簡単です。layoutsフォルダがありますので、新たにファイルを追加するだけです。
スクリーンショット 2018-05-24 11.06.10.png (8.3 kB)

event.vue

を追加しました

ファイルの中身についてはこちらのgistをご確認ください。

いよいよオリジナルページの追加

いよいよオリジナルページの追加です。pagesディレクトリに.vueファイルを追加するだけ
スクリーンショット 2018-05-24 11.11.13.png (10.8 kB)

さきほど追加したテンプレートでpageを読み込むにはこれだけ。

<script>
  export default {
    layout: 'event',
  }
</script>

 

こちらもAPIの接続のソースコード含めてgistからご確認ください。

今度はゆっくりとaxiousの解説記事を書きたいと思います。

Nuxt.jsではじめるSSRことはじめ

Nuxt.jsではじめるSSRことはじめ

※このブログは先日 5月19日(土)初夏のJavaScript祭のLTコーナーでITかあさんが超駆け足でSSR紹介したネタの解説版です。
73314_normal_1524055009_jsfes201805eyecatch01.png (202.4 kB)

運営以来最大のチェック員数になりました!
ご参加くださった皆さまありがとうございます!

この模様はJavaScript祭公式Twitterから実況されておりましたので、ぜひこちらのTwitterアカウントもチェックしてください

LT内容 Nuxt.jsではじめるSSRことはじめ

仕事でAPIゴリゴリ、フロントエンドはモダンなJS FWを使う必要がでてきて、
重い腰をあげて「Nuxt.jsをいっちょやったろ!」と思ったらあまりにも環境の構築が楽なうえ、SSRも簡単すぎてもうSSRナシのコーディングは到底考えられなくなるほどだったので、そんな話をLTでしゃべりました。

なので、今回の記事はLTの補足説明です

Nuxt.jsをインストール

Nuxt.jsをインストールするだけで、なんとSSRも使えるようになります。(楽だね!
NPMはすでにインストール済であることを前提に話を進めます。

$ npx create-nuxt-app your-app-name

Node.jsがバージョン8.2.0以降であれば基本的にnpxのコマンドは使えるはずです。
任意のディレクトリにcdで移動して、npxコマンドを叩きます
your-app-nameに自分のアプリケーション名をつけてあげましょう
ビルドされたアプリケーション名のフォルダ(todoという名前を付けたらtodoというディレクトリができます)

$ cd todo
$ npm run build
$ npm start

 

あとは以下のURLにAccessすればNuxt.jsのトップページが表示されるようになります。

ここまでの手順は画面のキャプチャを動画にしましたのでよろしければご確認ください。

動画の途中、
Use axiosを使うか、eslintを使うか、を質問しているのですが、どちらもyesで使うことにしました。
UI frameworkもWeb app作るなら欠かせない、API接続のaxiosも一緒に入れることができ、createコマンドだけで環境が整うことにただただ感動します

Vue.jsによるformのselectによるリンクメニューの実装

jQueryでformのselectタグによるリンクメニューを実装した場合

<select id="target">
<option value="https://www.yahoo.co.jp/">Yahoo!</option>
<option value="https://www.google.co.jp/">Google</option>
</select>
view raw HTML hosted with ❤ by GitHub
$(document).ready(function(){
$('#target select').change(function() {
location.href = $('#target').val();
});
});
view raw jQuery hosted with ❤ by GitHub

プルダウンを変更した時をonChangeでうけとってlocation.hrefでページを遷移させる、これ。これをVue.jsで実現したい。

Vue.jsによるformのselectによるリンク

Vue.jsでselectフォームを実装する場合、フォーム入力バインディングを使います。

<div id="target">
<select v-model="selected" v-on:change="jump">
<option v-for="option in options" v-bind:value="option.value">
{{ option.text }}
</option>
</select>
</div>
view raw HTML hosted with ❤ by GitHub
new Vue({
el: '#target',
data: {
selected: '',
options: [
{ text: '選択してください', value: '' },
{ text: 'Yahoo', value: 'https://www.yahoo.co.jp/' },
{ text: 'Google', value: 'https://www.google.co.jp/' }
]
},
methods: {
jump: function(e){
location.href = e.target.value;
}
}
})
view raw Vue.js hosted with ❤ by GitHub

v-forを使って繰り返し処理を行い、
v-bindでselectのoptionの設定を行います。

v-modelを使うと、formのdefault値が無視される性質があるため、valueの空をセットしています。

Vue.jsでもjQueryと同じような ajax postを実装したい

Vue.jsでもjQueryと同じような ajax postを実装したい

jQueryでゴリゴリajaxでAPIをたたいていたあの頃。jQueryの$.ajaxは一番お世話になったメソッドかも。

$('#selector').on('click',function(){
$.ajax({
url:'post/hogehoge',
type:'POST',
data:{
'data1': 'hogehoge',
'data2': ''hogehoge,
}
})
.done(function(data){
//成功した時にdataに何か入ってくる
console.log(data);
})
.fail(function(data){
//失敗した時 にdataに何か入ってくる
console.log(data);
});
});

Vue.jsでもそっくりなな形で使えるaxiosがとっても便利。

初めてVue.jsでAjax通信する機会があったんですが、axiosっていうnpmがjQueryのajax postと使い勝手が非常に似ていて使いやすかったのでメモ。書き方がほぼほぼjQueryの$.ajaxです。

npm install
npm install --save-dev vue-axios axios

import Vue from 'vue'
import Axios from 'axios'
import VueAxios from 'vue-axios'
Vue.use(VueAxios, Axios)
//以下コードをVue componentの中でよしなにつかってください
var token = 'csrf_token here'
Axios.post('/post_url',{
article: { body: 'text text', title: 'title title' },
csrf_token: token
})
.then(response => {
//200 status header etc...
// console.log(response)
})
.catch(error => {
// console.log(error.response)
});

postする内容はjson形式で記載します。DBに記録するためのPOSTの場合はバックエンドのフレームワークの仕様に合わせてtokenを設定してください。railsだとauthenticity_tokenをセットする必要があります。

postした後の結果についてもthen catchで受け取ることができます。

部分的に更新したい場合はpostメソッドではなく、Axios.patchになります

get

getの場合は検索パラメータを設定するだけ。簡単

Axios.get('/post_url', {
params: {
// getで指定したいパラメータを記載
id: 123,
name: 'hoge',
}
})
.then(response => {
//200 status header etc...
// console.log(response)
});
view raw Axios get hosted with ❤ by GitHub

Vue.js わずか4行でドラッガバブルなリストを実装する

Vue.jstableタグのソート機能はデフォルトで存在していますよね。

ただ、tableタグ限定だったり、昔jQueryではやったtablesorterだと行をドラッグandドロップで場所を変更できましたが、Vue.jsのプラグインを入れてわずか4行で、ほぼセレクタを入れるだけで実装できるプラグインを紹介します。

npmでインストール

npm install --save-dev vue-sortable
vue.jsはすでによみこんでいるものとします。

gist

import Sortable from 'vue-sortable/vue-sortable.js'
Vue.use(Sortable)
view raw main.js hosted with ❤ by GitHub
<div id="sortable">
<ul class="list-group" v-sortable>
<li class="list-group-item">リスト1</li>
<li class="list-group-item">リスト2</li>
<li class="list-group-item">リスト3</li>
</ul>
</div>
<script>
Vue.use(Sortable)
new Vue({
el: '#sort-table',
})
</script>
view raw sort.html hosted with ❤ by GitHub

基本的にはcomponentのセレクタを指定して、あとはHTMLにソートしたい要素にlist-group-item、それをラップする要素にlist-groupというclassを当てるだけでドラッガバブルになります

 

簡単!