GitHub Actions入門
はじめに
CI/CD周りのツールとして、普段はScrewdriverを使っています。 screwdriver.cd
別のものをちょっと試しみようと思い、いまさらながらGitHub Actionsを試してみます。
GitHub Actionsについて
こちらが公式のガイドです。 GitHub Actionsのドキュメント - GitHub Docs
動かし方
プロジェクトのルート直下に以下の構成でディレクトリを作成し、ymlファイルを配置しておきます。
.github/workflows/
動かし方は、ymlに定義したトリガーに従ってGitHub Actionsが動作します。 たとえばpushをトリガーにActionが実行されるということが可能です。
入門
入門にあたって公式の以下のあたりが良さそうと思ったのでこちらを参考にすすめてみます。 https://docs.github.com/ja/actions/learn-github-actions/understanding-github-actions
まずはGitHub Actionsを動かしてみる。
ガイドを見ながら以下のようなものを作成しました。
name: hello-github-actions on: [push] jobs: hello: runs-on: ubuntu-latest steps: - run: echo 'hello'
動作を書くと以下のものになります。
hello-github-actions
という名前のワークフロー(name)です。
pushをトリガーに(on)hello
というjobが、ubuntuの最新版を使った仮想環境(runs-on)でecho helloするというものになります。
実行結果
以下のように、「Actions」タブにワークフローの結果が表示されます。
さらにこの詳細を確認すると、echo hello
の結果がわかります。
トリガー
GitHub Actionsに定義したjobが起動するトリガーを定義していますがいろいろ設定があるようです。 以下の部分がトリガーになっています。
on: [push]
上記を例にするとリポジトリにpushされたタイミングでjobが動くというトリガーになります。
これ以外のトリガーについては以下のところに記載があります。 https://docs.github.com/ja/actions/learn-github-actions/events-that-trigger-workflows
記載を見るとプルリクエストのタイミングでトリガーすることができたり、 または複数のトリガーを設定することができるようです。 以下がプルリクエストまたはpushをトリガーにするサンプルです。
on: [push, pull_request]
実行環境
本記事内で以下のようにGitHub Actionsを動かす環境をubuntu latestという形で指定していました。
runs-on: ubuntu-latest
上記以外にも色々な環境で動作させることができます。
以下に環境のことについて記載があります。 About GitHub-hosted runners - GitHub Docs
windows、ubuntu、後はmac osのサポートがあるのが面白いところですね。
さらに別のjobを作成
より実用的なサンプルとして、gradleでビルドするkotlin,SpringBootアプリケーションのテストを行うjobを作成してみます。 作成したのは以下になります。
name: gradle-test-actions on: [push] jobs: test: runs-on: ubuntu-latest steps: - name: checkout uses: actions/checkout@v2 - name: setup jdk uses: actions/setup-java@v2 with: java-version: '11' distribution: 'adopt' - name: gradle test run: gradle test
これをpushすると以下のようにactionが実行されます。 ※ここではわざとtestが失敗するコードを書いています。
uses
とwith
というものがあるのでそれぞれ何をするものか確認します。
uses
今回は以下のように2つの指定しています。
uses: actions/checkout@v2
uses: actions/setup-java@v2
いろいろなサンプルを見る中でactions/checkout@v2
というのはほぼ必ずでてくるかなと思います。
用途としてはリポジトリからソースコードをチェックアウトするという理解です。
なのでテストを実行するとか、buildを行うなどをする際にはこのactionsを指定する形になりそうです。
v2というのはこのactionのversion2という意味のようでv1をあえて指定することもあるのか?というのは調べていません。
またsetup-javaについては使うJDKのバージョンを指定することを行っています。その際にwithを使って対象のversionや jdkのディストリビューションを指定することをしています。 ※このgradle buildにあたっての参考はこちら docs.github.com
local実行について
GitHub Actionsを動かす際に実際にGitHub上にイベントが発生した際に動作を試すこと以外に ローカルで動きを試すことができるようなのでこの方法を次の機会に試してみたいと思います。
※以下参考 dev.classmethod.jp
まとめ
GitHub Actionsを動かしてみました。 ここにきて手でactionsのymlを作る方法以外にGitHub上でいろいろなテンプレートから 生成できることに気づきました。 https://github.com/hiro21/sampleaction/actions/new
今回は少しの機能しか見ていないので少しずつ試していきたいと思います。
※以下に試した際のソースをおいています。 github.com
vue.js入門7
はじめに
ここでなchapter3に入っていき、順番に作っていきます。
chapter3
section3-1
コンポーネントについてです。
コンポーネントの概要
以下のような使い方になります。
Vue.component{名前, {設定情報}};
- 第1引数がコンポー年との名前
- 第2引数がコンポーネントの具体的な設定
上記のコンポーネントをHTMLの中に記述することで挿入することができます。
<コンポーネント名 />
実装してみる
以下の実装をしてみます
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Page Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" type="text/css" media="screen" href="main.css" /> <script src="main.js"></script> <script src="https://unpkg.com/vue"></script> </head> <body> <h1>hello component</h1> <div id="app"> <hello/> </div> <script> Vue.component('hello', { template: '<p class="hellp">HelloHello!</p>' }) new Vue({ el: '#app', }) </script> </body> </html>
実際の表示は以下のようになります。
上記のHelloHello!
の部分がコンポーネントに定義された部分になり
これがHTMLに挿入されているのがわかります。
変数をコンポーネントに渡す
用意したタグを表jいするだけでなく、変数に設定したものをコンポーネントに渡すようなことが可能です。
使い方
以下のように関数で定義する使い方になります。
data : function() {return { 変数の情報 }:}
使ってみる
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Page Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" type="text/css" media="screen" href="main.css" /> <script src="main.js"></script> <script src="https://unpkg.com/vue"></script> </head> <body> <h1>variable component</h1> <div id="app"> <hello/> </div> <script> Vue.component('hello', { data: function() { return { message: 'add message' } }, template: '<p class="hello">{{message}}</p>' }); new Vue({ el: '#app', }); </script> </body> </html>
属性の利用
propsを使う方法についてです。 記述としては以下のようになります。
props: [名前1, 名前2, ........]
特徴としては以下の通りです。 - 配列を値に持つプロパティである。 - 配列にはタグに用意される属性の名前をまとめておく - templateのテンプレート内で使うことができる
使ってみる
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Page Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" type="text/css" media="screen" href="main.css" /> <script src="main.js"></script> <script src="https://unpkg.com/vue"></script> </head> <body> <h1>hello component</h1> <div id="app"> <div><hello name="dog"/></div> <div><hello name="cat"/></div> </div> <script> Vue.component('hello', { props:['name'], template: '<p class="hello">Hello {{name}}</p>' }) new Vue({ el: '#app', }) </script> </body> </html>
pointは以下の部分になります。
- componentの第2引数に用意しているpropsのところ
- propsに[name
]と指定することで、helloタグにname属性が用意される
- テンプレートに{{name}}という形で変数を入れることができる
タイプの指定
どういったタイプの値が設定されるかという指定をしたい場合に以下のようにオブジェクトとして 設定することができます。
props: {名前: タイプ, 名前: タイプ, ...}
実装例
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Page Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" type="text/css" media="screen" href="main.css" /> <script src="main.js"></script> <script src="https://unpkg.com/vue"></script> </head> <body> <h1>hello component</h1> <div id="app"> <div><hello name="dog"/></div> <div><hello name="cat"/></div> </div> <script> Vue.component('hello', { props:{ name: String}, template: '<p class="hello">Hello {{name}}</p>' }) new Vue({ el: '#app', }) </script> </body> </html>
以下抜粋します。propsのところにStringを指定する形にしています。
props:{ name: String},
上記の型にはStringの他にもNumber、Boolean、Array、Objectなどが用意されています。
section3-1まとめ
以下に見てきました。 - componentの概要 - componentで変数を使う方法 - 属性を使う - 型も定義可能
次はsection3-2について見ていきます。
dockerのメモ その2
はじめに
dockerのメモその2です。 前のメモではdockerイメージをdockerhubから取得してきてそのコンテナを起動してみたという感じでした。 今回はDockerfileを作成し、自分でDockerimageを作成することをやっていきます。
Dockerfileのサンプル
実際に作成されているDockerfileを見てみたいと思います。 ここではdockerhub上にあるDockerfileを例にしてみたいと思います。
前回に行ったMysqlを対象にすると以下がimageとしてリンクされていました。 mysql/Dockerfile.debian at c506174eab8ae160f56483e8d72410f8f1e1470f · docker-library/mysql · GitHub
Dockerfileを作成する
試しにlinuxを起動し、そのコンテナに入ってみるというのを目指していきます。 ファイル名はDockerfileという名前で作ります。
FROM
まずはFROMでベースとなるイメージを指定します。 以下はubuntuの最新版を指定するサンプルになります。
FROM ubuntu:latest
build
Dockerfileを作成したらdocker buildコマンドを使って docker imageを生成します。
以下はカレントディレクトリにDockerfileがある状態で実行するサンプルになります。
docker build .
以下のようなログがでます。最後のところでイメージIDがでます。
=> exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:0d450123e3e93cd5abb3898071a7ba6c114ba711ca115be3eecdb7398acc726e 0.0s
実行した後、Docker imageが作成されているか確認するために以下を実行します。 先程のログで確認できた0d450123xxxというIMAGE IDが確認できます。
REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 0d450123e3e9 11 hours ago 72.8MB
docker imageに名前をつける。
以下のようにすると名前をつけることができます。 (-tの引数に設定しているtestが名前)
docker build -t test .
上記コマンド後、docker imagesで確認すると以下のようになります。
docker images REPOSITORY TAG IMAGE ID CREATED SIZE test latest 0d450123e3e9 11 hours ago 72.8MB
docker imageをrunする
以下コマンドで実行します。
docker run -it test bash
上記の実行が成功するとコンテナの中に入り、実際にbashでコマンド入力ができる状態になっていることがわかります。
もうちょっといろいろやるDockerfileを作成
以下のようにDockerfileを修正します。
FROM ubuntu:latest RUN apt-get update && apt-get install -y \ vim RUN touch test.txt CMD ["/bin/bash"]
やっていることを書くと ubuntuの最新のイメージで apt-getをupdateしてからvimをインストール、 そしてtest.txtを作成し最後に/bin/bashで起動した状態にするという感じになります。 次の項目でFROMとか、RUNとか、CMDの行っていることを書いていきます。
Dockerfileのコマンドの整理
以下のコマンドのやっていることを書いていきます。 * FROM * RUN * CMD
FROM
役割はベースになるイメージを設定します。 本記事ではubuntuを指定したがalpineのイメージを指定するのも よくあるようです。
RUN
こちらはlinuxのコマンドを実行することができます。 例えばファイルを作成するなら以下のようなコマンドになります。 (test.txtを作成するコマンド)
RUN touch test.txt
このRUNを使うことで好きなようにカスタマイズすることができます。 注意点としてはRUNコマンドを実行するごとにLayerが作成されることになり、 これはDockerimageのサイズが大きくなることになります。
そのためLayer数を少なくすることはDockerimageを作成する中で重要になります。 対応としてはコマンドを&&でつなげることでLayerの増加を防ぐことができます。
CMD
コンテナのデフォルトのコマンドを指定することができます。 よくあるのはbin/bashを指定するような実装で以下のようなものです。
CMD ["/bin/bash"]
またDockerfileの最後に1つ書くという感じのようです。
まとめ
今回は自分でDockerfileを作成しDockerimageを作成し、以下のことについて 取り組みました。
- Dockerfileという名前でファイルを作成する
- FROMでイメージを指定する
- RUNでコマンドを実行する
- CMDでコンテナのデフォルトのコマンドを指定する
vue.js入門6
はじめに
vue.jsの入門6です。 今回は、section2-3の続きで対象は以下の内容になります。
- templateタグ
- v-for
templateタグ
templateタグとは
複数のタグをまとめておくのに使うようなものです。 実際にはタグでくくられることになりますが、このタグ自身は表示されないものです。
実装
以下にtemplateタグを使った実装をしてみます。
<!DOCTYPE html> <html> <head> <title>v-html template</title> <script src="https://unpkg.com/vue"></script> </head> <body> <h1>template test</h1> <div id="app"> <template v-if="flag"> <p>表示その1</p> </template> <template v-else> <p>表示その2</p> <ui> <li>apple</li> <li>banana</li> </ui> </template> </div> <button onclick="changeTemplate();"> change </button> <script> var data = { flag: true } new Vue({ el: '#app', data: data }) function changeTemplate() { data.flag = !data.flag; } </script> </body> </html>
画面の表示
初期表示
ボタンを押すと
以下のようにtemplateタグのv-elseに囲まれた部分のHTMLに切り替わりました。
HTMLの要素は?
ここでタグが表示されていないかを確認するためにHTMLの要素を覗いてみます。 以下のようにタグは見当たりません。
v-for
構文
以下のような構文になります。
v-for="変数 in 配列"
実装
ここでv-forを使った実装をしてみます。
<!DOCTYPE html> <html> <head> <title>v-html</title> <script src="https://unpkg.com/vue"></script> </head> <body> <h1>v-for test</h1> <div id="app"> <ui v-for="item in items"> <li>{{item.name}}</li> </ui> </div> <script> var data = { items: [ { name: "apple" }, { name: "banana" }, { name: "rice" } ] } new Vue({ el: '#app', data: data }) </script> </body> </html>
画面を表示
以下のように表示されました。 v-forの部分が期待どおり動き、リスト表示されました。
さらにv-forでインデックス番号を取得する
v-forしたときにインデックスを取得する方法もあります。
構文
先程のv-forから少し変わる感じで以下のようになります。
v-for="(要素,index) in 配列"
実装
実装は以下のようになります。
<!DOCTYPE html> <html> <head> <title>v-html</title> <script src="https://unpkg.com/vue"></script> </head> <body> <h1>v-for index test</h1> <div id="app"> <ui v-for="(item, i) in items"> <li>{{i}}番目{{item.name}}</li> </ui> </div> <script> var data = { items: [ { name: "apple" }, { name: "banana" }, { name: "rice" } ] } new Vue({ el: '#app', data: data }) </script> </body> </html>
ちょっと間違えたのがindexを取得する部分で以下のような間違えをしました。
<ui v-for="(item, i) in items"> <li>{{item.i}}番目{{item.name}}</li> </ui> ※item.iというようにインデックスを取ろうとしていますがこれだと取れない
以下のようにするととれるという感じです。
<ui v-for="(item, i) in items"> <li>{{i}}番目{{item.name}}</li> </ui> ※indexは要素.indexではなく、indexのみで取れる
画面表示
以下のようにindex0から表示されることを確認しました。
まとめ
section2-3のまとめです。全体としては以下のことを実践しました。
- {{}}を使った
- 変数が使えるv-bind
- v-if、v-forという制御がある
次回はchapter3の内容をやっていきたいと思います。
dockerのメモ その1
はじめに
dockerを試している中でわかったことをメモしていきます。
環境構築でわかったこと
最初にやったことは以下である。 * docker hubの登録 * dockerのインストール
docker hubの登録
docker hubはdockerimageを登録するサービスのことである。 よくある使い方としては誰かが作成したイメージを使うことがメインとなると思う。 自分で他の人が使うようなイメージを作成した場合はここに登録すると良い。
dockerのインストール
www.docker.com インストールとdockerのコマンドを使うことができるようになる。
dockerの整理
いろいろあるが例えば以下のようなところが便利である。 環境ごとに差異がある状態を無くすことができる。
- ローカル環境でAさんとBさんの環境を同じにする
- テスト環境でも同じ状態にする
- さらには本番環境でも同じ状態にする
上記によってある環境では動いたのに本番環境では動かない!という状態を無くすことができる。 またこれを高速に行うことができるというのも良い点である。
dockerを使う
ここでは以下のコマンドを使ってみる。 * docker login * docker pull * docker images * docker run * docker ps
docker login
これはdocker registryにログインするために行う。 これをやることでこの後に実施するdocker pullでdocker imageを取得することができるようになる。
docker pull
docker pullコマンドを実行することでdocker imageを取得することができる。 ここでは試しにmysqlのイメージを取得してみる。 docker registoryとしては以下を対象にする。 hub.docker.com
コマンドは以下の通り
docker pull mysql
しばし待つとpullが完了する。
docker images
pullができたか確認する。 docker imagesコマンドを使うと今保持しているdocker imageをlist表示してくれる。 手元では以下のようにmysqlのimageが存在することが確認できた。
docker run
imageが取得できたらそのimageを元にcontainerを起動する。 そのためのコマンドがdocker runになる。 ここではmysqlを起動するために以下のコマンドを実行する。
docker run mysql
実行したところ以下のようにERRORが出た
2021-08-25 10:15:59+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.26-1debian10 started. 2021-08-25 10:15:59+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' 2021-08-25 10:15:59+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.26-1debian10 started. 2021-08-25 10:15:59+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified You need to specify one of the following: - MYSQL_ROOT_PASSWORD - MYSQL_ALLOW_EMPTY_PASSWORD - MYSQL_RANDOM_ROOT_PASSWORD
初回の起動時にはなにやらoptionをつける必要がありそうである。
docker hubにある、以下のページにどのように使うか記載があった。 Docker Hub
抜粋すると以下のようなコマンドが書かれている。
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
上記のコマンドにある色々なoptionに何を指定するのかというのも同ページに以下のように記載されていた。
... where some-mysql is the name you want to assign to your container, my-secret-pw is the password to be set for the MySQL root user and tag is the tag specifying the MySQL version you want. See the list above for relevant tags.
※機会翻訳の結果は以下の通り
ここで、some-mysqlはコンテナに割り当てる名前、my-secret-pwはMySQL rootユーザーに設定するパスワード、tagは必要なMySQLバージョンを指定するタグです。関連するタグについては、上記のリストを参照してください。
上記のことからoptionに指定するものを検討する。 --name:sample-mysql -e :root -d:設定しない
上記の設定をすると実行するコマンドは以下のようになるのでこれを実行する。
docker run --name sample-mysql -e MYSQL_ROOT_PASSWORD=root mysql
上記でmysqlの起動が確認できた。
docker ps
ここで実際にmysqlのプロセスが動いているか確認をしたい。 その際はdocker psコマンドを使うと確認できる。
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8d8f694faafc mysql "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp, 33060/tcp sample-mysql
上記のようにdocker runのときに指定したsample-mysqlという名前のcontainerが確認できた。
containerの中に入る
runしたcontainerの中に入る方法としてexecコマンドを使う方法がある。 以下は先程、runしたmysqlのcontainerに入りbashのshを起動しておく方法である。
docker exec -it sample-mysql bash root@8d8f694faafc:/#
上記のようにrootでログインしていることがわかる。
さらにmysqlに接続を試み接続が成功した。
mysql -u root -p -h 127.0.0.1 Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 9 Server version: 8.0.26 MySQL Community Server - GPL Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
まとめ
今回はdocker hubからimageをpullし、containerを立ち上げ、 そのcontainerに入ることを行うまでのことを実施した。
vue.js入門5
はじめに
今回はSection2-3(その1)をやっていきたいと思います。 内容としてはテンプレート構文になります。
テンプレート構文について
今までの部分で実装していた中の以下の部分がテンプレート構文になります。
{{ これがテンプレート構文 }}
上記以外にも使えるものがあります。
いろいろな構文
HTMLのコードを出力する(v-html)
{{}}ではHTMLのタグをHTMLとして出力できません。 そのままタグのテキストとして表示される仕様のようです。
HTMLとして出力する方法としてv-htmlを使います。
例
実装
ここで実際にコードを書いてみます。
<!DOCTYPE html> <html> <head> <title>v-html Vue app</title> <script src="https://unpkg.com/vue"></script> </head> <body> <h1>v-html test</h1> <div id="app"> <p v-html="message"></p> </div> <script> var data = {message: '<h2 style="color:blue">v-html data</h2>'} new Vue({ el: '#app', data: data }) </script> </body> </html>
抜粋
以下の部分がv-htmlの部分です。
// 宣言しているところ <p v-html="message"></p> // テンプレートに設定しているJavaScriptの変数の値 var data = {message: '<h2 style="color:blue">v-html data</h2>'}
上記のJavaScriptの変数に入れている文字列がHTMLタグになっています。 このHTMLがそのまま表示されることが期待されます。 これを次項の画面表示で確認します。
画面表示
上記のようにv-html dataが青文字で表示されているので、HTMLタグが設定されていそうです。
HTMLの表示
念の為、開発者ツールでHTMLタグになっているか確認します。 以下のようにh2タグでHTMLが出力されているので期待どおりになっていることがわかりました。
実装その2
次にv-htmlを使った動的なHTMLを試します。
実装例
<!DOCTYPE html> <html> <head> <title>v-html Vue app</title> <script src="https://unpkg.com/vue"></script> </head> <body> <h1>v-html test</h1> <div id="app"> <ol v-html="dynamicdata"></ol> </div> <input type="text" onInput="insertTag(event);"> <button onclick="clickEvent()"> add </button> <script> var data = {dynamicdata: '<li>dynamic html element</li>'} new Vue({ el: '#app', data: data }) function insertTag(event) { data.tmp = event.target.value; } function clickEvent() { data.dynamicdata += '<li>' + data.tmp + '</li>' } </script> </body> </html>
HTMLの表示
最初に表示される画面
入力してaddボタンを押したあと
testと入力してaddボタンを押した場合、以下のようになります。
v-bind
属性に値を設定するという内容になります。
実装例
どういうことか、実際に実装してみて確かめてみます。
コード
<!DOCTYPE html> <html> <head> <title>v-html Vue app</title> <script src="https://unpkg.com/vue"></script> </head> <body> <h1>v-html test</h1> <div id="app"> <p v-bind:style="style">{{ message }}</p> </div> <input type="number" onChange="changeFont(event);" value="10"> <script> var data = { message:"bind-test", style: 'color:blue;font-size:5px;' } new Vue({ el: '#app', data: data }) function changeFont(event) { data.style = 'color:red;font-size:' + event.target.value + 'pt;' } </script> </body> </html>
画面の表示
最初の表示
入力フィールドに20を入力した後の画面
ここでp-bindの箇所がchangeFontメソッドで指定された内容で変更されたことがわかります。
実装のポイント
v-bindの宣言部分
以下の部分がv-bindの部分です。
v-bind:style="style"
初期値
JavaScriptの以下の部分で設定しています。
var data = { message:"bind-test", style: 'color:blue;font-size:5px;' } new Vue({ el: '#app', data: data })
動的な値の変更
以下の部分で実現しています。 入力箇所(onChangeイベントでJavaScriptのメソッド呼び出しをしています)
<input type="number" onChange="changeFont(event);" value="10">
上記から呼び出されるJavaScriptのメソッドです
function changeFont(event) { data.style = 'color:red;font-size:' + event.target.value + 'pt;' }
ここでstyle属性にcolorがredでfont-sizeはevent.targetのvalueを設定するという動作になります。 ※event.target.valueはイベントが発生した対象の値が入る
オブジェクト構文
以下の形についてです。
v-bind:class="{ class名: 変数 }"
これを使うことで外部からON/OFFの切り替えができるようになります。
実装例
<!DOCTYPE html> <html> <head> <title>v-html Vue app</title> <script src="https://unpkg.com/vue"></script> </head> <body> <style> .red { font-size:20px; color:red; } .green { font-size:20px; color:green; } </style> <h1>v-html object test</h1> <div id="app"> <p v-bind:class="{ red:isRed, green:isGreen }">{{ message }}</p> </div> <button onclick="modColor();"> mod </button> <script> var data = { message:"objectTest!", isRed:false, isGreen:true } new Vue({ el: '#app', data: data }); function modColor() { data.isRed = !data.isRed data.isGreen = !data.isGreen } </script> </body> </html>
画面表示
初期表示
最初に以下のように表示されます。
modボタン押下
文字の色が変わります。
オブジェクトでまとめて操作する
実装例
<!DOCTYPE html> <html> <head> <title>v-html Vue app</title> <script src="https://unpkg.com/vue"></script> </head> <body> <style> .red { font-size:20px; color:red; } .green { font-size:20px; color:green; } </style> <h1>v-html object test</h1> <div id="app"> <p v-bind:class="classes">{{ message }}</p> </div> <button onclick="modColor();"> mod </button> <script> var classObj = { red: true, greed: false }; var data = { message: 'objectTest!', classes: classObj } new Vue({ el: '#app', data: data }); function modColor() { classObj.red = !classObj.red; classObj.green = !classObj.green; } </script> </body> </html>
画面表示
初期表示
ボタンクリック後
まとめ
ちょっと長くなったので一旦ここまでで終わりにします。 ここではテンプレート構文の以下を使ってみました。
- vhtmlを使った実装
- vbindを使った実装
- v-bind:style
- v-bind:class
次回はv-ifを使っていくところから始めます。
vue.js入門4
はじめに
Vue.jsの入門その4です。 今回は、chapter2のsection2です。
render入門
ここではrenderの入門をします。
renderの実装
Vueオブジェクトを生成する部分に着目すると以下の部分です。
// 全体 new Vue({ el: '#app', data: data, render: (element) => { return element("p", data.message); } // この部分 render: (element) => { return element("p", data.message); }
HTMLの確認
以下のようにPタグが挿入されています。
renderの属性の設定
renderの第2引数に属性を設定することができるようです。 試しに以下のように第2引数にstyleを設定してみます。
new Vue({ el: '#app', data: data, render: (element) => { return element( "p", {'style':'color:blue;'}, data.message ); } }) // この部分の第2引数です。 return element( "p", {'style':'color:blue;'}, data.message );
画面表示
以下のようにcolor:blueとした設定が反映されました。
renderで子ノードの組み込み
HTMLの要素で子要素が必要な場合に以下のような実装をすることで作ることができます。
new Vue({ el: '#app', data: data, render: (element) => { return element( "ol", { 'style':'color:red;'}, [ element("li", "test 1"), element("li", "test 2") ] ); } }) // この部分です(第3引数の配列のところ) render: (element) => { return element( "ol", { 'style':'color:red;'}, [ element("li", "test 1"), element("li", "test 2") ] ); }
renderのelementのここまでのまとめ
ここまではおおよそ以下のような形で設定してきました。
element(HTMLのタグ,(option)css,設定する値(HTMLも設定できる))
※第2引数は省略することができます。
複雑な実装
前述した実装をさらに複雑にする必要がある場合、この実装だとメンテナンスが大変になります。 そんなときにJavaScriptで効率的に作成することが可能です。
例
<body> <h1>Vue.js</h1> <div id="app"> {{ message }} </div> <hr> <button onClick="doAction();"> click </button> <script> var data = { message: 'hello', items: ['test1','test2','test3'] }; new Vue({ el: '#app', data: data, render: (element) => { var pElement = element( "p", {'style':'color:blue;'}, data.message ); var li = data.items.map(item => element('li', item)); var ol = element("ol", li); var div = element("div", [pElement, ol]); return div } }) function doAction() { // data.message = "click"; var insertData = ['new1', 'new2', 'new3', 'new4']; data.message = 'clicked'; for (n in data.items) { data.items[n] = insertData[n]; } } </script> </body>
まとめ
renderを使って{{}}の中に文字を入れたりHTMLを動的に入れたりという機能を試してみました。 また次以降のsectionに取り組んでいきます。