Vue3の基本1(CDNからscriptファイルを読み込んでhtmlファイル内でVueアプリケーションを作成)

目次

(参考資料)
・Vue3 日本語ドキュメント
 https://v3.ja.vuejs.org/
・Vue.js3超入門(掌田津耶乃著)秀和システム

1.Vueの動作環境
(1)動作環境
 ・Windows 10 Pro
 ・XAMPP Control Panel v3.2.4
(2)Node.jsのインストール
 Node.jsはJavaScript実行環境でパッケージ管理ツールnpm(Node Package Manager)が組み込まれています。
下記のサイトにアクセスしてダウンロードします。https://nodejs.org/ja/

Node.jsのバージョンは偶数が長期サポートの安定版。
任意のバージョンをダウンロードしたいときは下記のページ。
https://nodejs.org/ja/download/releases/

Version16.13.0 LTSをダウンロード
・ファイル名:node-v16.13.0-x64.msiを実行

ネイティブモジュール用ツールオプションはデフォルトのままチェックOFF

・動作を確認します
 > node –version

・VueCLIのインストール
 VueCLIはVue開発のためのコマンドツールです。
 > npm i -g @vue/cli-service-global

(3)プロトタイプアプリケーションの作成
・フォルダを作ります。
 C:\Users\・・・\Desktop\vue_work
・ app.vueファイルを作成します。
 app.vue

<template>
  <div id="app">
    <h1>Hello!</h1>
    <p>This is message...</p>
  </div>
</template>

・app.vueファイルを置いたフォルダに移動して次のコマンドを実行します。
 > vue serve
 またはファイルを指定して
 > vue serve app.vue

・ブラウザでアクセス

・Webサーバの停止
 Ctrl+C

2.プロジェクトの作成
(1)VueCLIコマンドを使ったプロジェクトの作成
 > vue create (プロジェクト名)

 > vue create hello_app
 Default(Vue3)・・・を選択

パッケージマネージャー NPMを選択

(2)プロジェクトの実行
 > cd hello_app
 > npm run serve

(3)プロジェクトフォルダの内容

(4)プロジェクトのビルド
 > npm run build

distフォルダが作成され、この中に公開するファイルが一式まとめられている

XAMPPのApatchサーバを起動し、distフォルダ内のファイル、フォルダをhtdocs配下に置く。

ブラウザでhttp://localhost:80にアクセスする

3.Vue3の基本
3.1 Vue3のオブジェクトからの{{プロパティ}}の表示
 Vueオブジェクトがマウントされたタグ内にある{{プロパティ}}にはVueオブジェクトで定義されたプロパティの値が入ります。またこの値はオブジェクト内の値がリアルタイムにチェックされ、値が更新されると、自動的に{{}}の表示も更新されます。

sample1
index.html

<!DOCTYPE html>
<html>
<head>
  <title>My first Vue app</title>
  <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
  <h1>Vue3</h1>
  <div id="app">
  {{ message }}
  </div>

  <script>
  const appdata = {
    data() {
      return {
        message: 'Hello Vue!'
      }
    }
  }

  Vue.createApp(appdata).mount('#app')
  </script>
</body>
</html>

3.2 v-htmlによるHTML要素の出力
 タグの中にv-html属性を使うことで、Vueオブジェクト側で用意したHTMLのコードで画面に表示できます。
 タグには、<div v-html=”変数名”></div>とし、
Vueオブジェクトのdataプロパティの中で”変数名”にテンプレートリテラルを設定します。
 テンプレートリテラルはプレースホルダー(${変数名}と書き、予め用意した変数をはめ込める)が使えます。

sample2
index.html

<!DOCTYPE html>
<html>
<head>
  <title>My first Vue app</title>
  <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
  <h1>Vue3</h1>
  <div id="app">
    <div v-html="message"></div>
  </div>
  
  <script>
  const list = ['One', 'Two', 'Three']
  const appdata = {
    data() {
      return {
        message: `<ul>
          <li>${list[0]}</li>
          <li>${list[1]}</li>
          <li>${list[2]}</li>
        </ul>`
      }
    }
  }

  let app = Vue.createApp(appdata)
  app.mount('#app')
  </script>
</body>
</html>

3.3 v属性によるタグの属性の設定
 タグの中に「v-bind:属性名=”設定する値”」を記述することで、Vueオブジェクトからタグの属性を設定することができます。
(1)Vueオブジェクトからのスタイルの設定
タグの中で「v-bind:style=”変数”」で設定します。または「v-bind:style=”オブジェクト名”」としてVueインスタンスにdataプロパティの中にオブジェクトを用意しておくこともできます。
sample3
index.html

<!DOCTYPE html>
<html>
<head>
  <title>My first Vue app</title>
  <script src="https://unpkg.com/vue@next"></script>
</head>
<body>

  <div id="app">
    <p v-bind:style="style">{{ message }}</p>
  </div>
  
  <script>
  const appdata = {
    data() {
      return {
        message : null,
        style:'font-size:32pt; color:red;'
      }
    },
    mounted() {
      this.message = 'This is sample page.'
    }
  }

  let app = Vue.createApp(appdata)
  app.mount('#app')
  </script>
</body>
</html>

(2)Vueオブジェクトからのクラスの設定
タグの中で「v-bind:class={クラス名:”変数”}」で設定します。または「v-bind:class=”オブジェクト名”」としてVueインスタンスにdataプロパティの中にオブジェクトを用意しておくこともできます。
sample4
index.html

<!DOCTYPE html>
<html>
<head>
  <title>My first Vue app</title>
  <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
  <style>
  .red {
      color:red;
  }
  .blue {
      color:blue;
  }
  </style>
  <div id="app">
    <p v-bind:class="{red:isRed, blue:isBlue}">
      {{ message }}
    </p>
  </div>
  
  <script>
  const appdata = {
    data() {
      return {
        message : null,
        isRed: true,
        isBlue: false
      }
    },
    mounted() {
      this.message = 'This is sample page.'
      setInterval(()=>{
        this.isBlue = !this.isBlue
        this.isRed = !this.isRed
      },1000)
    }
  }

  let app = Vue.createApp(appdata)
  app.mount('#app')
  </script>
</body>
</html>

1秒毎に文字色が赤、青交互に変わります。

(3)v-ifによる条件付きレンダリング
タグの中で「v-if=”条件”」で設定します。
sample5
index.html

<!DOCTYPE html>
<html>
<head>
  <title>My first Vue app</title>
  <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
  <style>
  .red {
      color:red;
  }
  .blue {
      color:blue;
  }
  </style>
  <div id="app">
    <p v-if="isRed" class="red">
       {{ message }}
    <p v-else class="blue">
       {{ message }}
    </p>
  </div>
  
  <script>
  const appdata = {
    data() {
      return {
        message : null,
        isRed: true,
        isBlue: false
      }
    },
    mounted() {
      this.message = 'This is sample page.'
      setInterval(()=>{
        this.isBlue = !this.isBlue
        this.isRed = !this.isRed
      },1000)
    }
  }

  let app = Vue.createApp(appdata)
  app.mount('#app')
  </script>
</body>
</html>

<タグ v-if=”条件”>・・・</タグ>
<タグ v-else>・・・</タグ>
のとき、条件のtrue/falseでどちらかのタグが表示されます。
 1秒毎にclass属性を変えて、文字色が赤、青交互に変わるようにしています。

(4)HTMLのタグを<template>タグでまとめる
 複数のタグを<template>タグでまとめることで、v-ifの条件によって、複数のタグを切り替えることができます。<template>タグは表示されません。

sample6
index.html

<!DOCTYPE html>
<html>
<head>
  <title>My first Vue app</title>
  <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
  <div id="app">
    <template v-if="isRed">
     <p v-bind:style="style1">{{ message }}</p>
    </template>   
    <template v-else>
     <p v-bind:style="style2">{{ message }}</p>
    </template>
  </div>
  
  <script>
  const appdata = {
    data() {
      return {
        message : null,
        style1:'font-size:32pt; color:red;',
        style2:'font-size:48pt; color:blue;',
        isRed: true,
        isBlue: false
      }
    },
    mounted() {
      this.message = 'This is sample page.'
      setInterval(()=>{
        this.isBlue = !this.isBlue
        this.isRed = !this.isRed
      },1000)
    }
  }

  let app = Vue.createApp(appdata)
  app.mount('#app')
  </script>
</body>
</html>

1秒毎に<template>タグの条件を変えて、文字スタイルが交互に変わるようにしています。

(5)v-forによる配列データのレンダリング
<タグ v-for=”変数” in 配列> ・・・表示内容・・・</タグ>
の形で記述します。

sample7
index.html

<!DOCTYPE html>
<html>
<head>
  <title>My first Vue app</title>
  <script src="https://unpkg.com/vue@next"></script>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
  <div id="app">
    <p>{{ message }}</p>
    <table class="table">
        <tr>
          <th>Name</th>
          <th>Mail</th>
          <th>Tel</th>
        </tr>
        <tr v-for="item in items">
        <td>{{item.name}}</td>
        <td>{{item.mail}}</td>
        <td>{{item.tel}}</td>
      </tr>
    </table>
  </div>
  
  <script>
  const appdata = {
    data() {
      return {
        message :"データの一覧表示",
        items:[
          {name:'Suzuki', mail:'suzuki@com', tel:'123-456'},
          {name:'Yamasita', mail:'yamasita@com', tel:'456-789'},
          {name:'Tanaka', mail:'tanaka@com', tel:'789-123'},
        ]
      }
    }
  }

  let app = Vue.createApp(appdata)
  app.mount('#app')
  </script>
</body>
</html>

v-forは配列から要素を取り出し
<タグ v-for=”取り出した要素を入れる変数,インデックス” in 配列>・・・表示内容・・・</タグ>
の形で記述することで第2引数として配列のインデックスを取り出せます。

sample8
index.html

<!DOCTYPE html>
<html>
<head>
  <title>My first Vue app</title>
  <script src="https://unpkg.com/vue@next"></script>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
  <div id="app">
    <p>{{ message }}</p>
    <table class="table">
        <tr>
          <th>ID</th>
          <th>Name</th>
          <th>Mail</th>
          <th>Tel</th>
        </tr>
        <tr v-for="(item,id) in items">
        <td>{{id}}</td>
        <td>{{item.name}}</td>
        <td>{{item.mail}}</td>
        <td>{{item.tel}}</td>
      </tr>
    </table>
  </div>
  
  <script>
  const appdata = {
    data() {
      return {
        message :"データの一覧表示",
        items:[
          {name:'Suzuki', mail:'suzuki@com', tel:'123-456'},
          {name:'Yamasita', mail:'yamasita@com', tel:'456-789'},
          {name:'Tanaka', mail:'tanaka@com', tel:'789-123'},
        ]
      }
    }
  }

  let app = Vue.createApp(appdata)
  app.mount('#app')
  </script>
</body>
</html>

(6)v-forによるオブジェクトデータのレンダリング
 <タグ v-for=”(値,キー)” in オブジェクト>・・・表示内容・・・</タグ>の形で記述します。

sample9
index.html

<!DOCTYPE html>
<html>
<head>
  <title>My first Vue app</title>
  <script src="https://unpkg.com/vue@next"></script>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
  <div id="app">
    <p>{{ message }}</p>
    <table class="table">
        <tr>
          <th>ID</th>
          <th>Name</th>
          <th>Mail</th>
          <th>Tel</th>
        </tr>
        <tr v-for="(item,key) in items">
        <td>{{key}}</td>
        <td>{{item.name}}</td>
        <td>{{item.mail}}</td>
        <td>{{item.tel}}</td>
      </tr>
    </table>
  </div>
  
  <script>
  const appdata = {
    data() {
      return {
        message :"データの一覧表示",
        items:{
          Suzuki:{mail:'suzuki@com', tel:'123-456'},
          Yamasita:{mail:'yamasita@com', tel:'456-789'},
          Tanaka:{mail:'tanaka@com', tel:'789-123'},
        }
      }
    }
  }

  let app = Vue.createApp(appdata)
  app.mount('#app')
  </script>
</body>
</html>

4.コンポーネントの基本
4.1 コンポーネントの作成と利用
 コンポーネントは、JavaScript側とHTML側(テンプレート)をひとまとめにして部品化して再利用できるようにしたものです。
 コンポーネントの作成は、Vueアプリケーション.component(名前,{設定情報})
 HTMLの中で使うときは、コンポーネントの名前のタグを記述します。
 <コンポーネント />

sample10
「Hello component!」を表示するコンポーネントを作成します。下記の順番で実装します。
①Vueアプリケーション(オブジェクト)を作成する
let app = Vue.createApp(appdata)
②アプリケーションにコンポーネントを組み込む
app.component(‘hello’, {
 template:'<p>Hello component! </p>’
 })
③HTMLにアプリケーションを組み込む
app.mount(‘#app’)

index.html

<!DOCTYPE html>
<html>
<head>
  <title>My first Vue app</title>
  <script src="https://unpkg.com/vue@next"></script>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
  <div id="app">
    <p>{{ message }}</p>
    <hello/>
  </div>
  
  <script>
  const appdata = {
    data() {
      return {
        message : 'コンポーネントを表示します'
      }
    }
  }

  let app = Vue.createApp(appdata)

  app.component('hello', {
    template: '<p> Hello component! </p>'
  })

  app.mount('#app')
  </script>
</body>
</html>

4.2 変数をコンポーネントに渡す
 コンポーネントのdataプロパティに変数を定義することでコンポーネントに変数をわたすことができ、テンプレートの外で変数の値を設定できます。
 
sample11
index.html

<!DOCTYPE html>
<html>
<head>
  <title>My first Vue app</title>
  <script src="https://unpkg.com/vue@next"></script>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
  <div id="app">
    <p>{{ message }}</p>
    <hello/>
  </div>
  
  <script>
  const appdata = {
    data() {
      return {
        message : 'コンポーネントを表示します'
      }
    }
  }

  let app = Vue.createApp(appdata)

  app.component('hello', {
    data:function(){     //短縮形 data(){
      return {
        message : 'helloコンポーネント'
      }
    },
    template: '<p> {{message}} </p>'
    })

  app.mount('#app')
  </script>
</body>
</html>

4.3 コンポーネントのタグに属性をもたせる
 コンポーネントのタグに属性を設定してテンプレートで使えるようにするためには、コンポーネントに”props”プロパティを用意します。
 props:[名前1,名前2,・・・]

sample12
 コンポーネントのタグの属性に設定した文字列をテンプレートに表示します。

<!DOCTYPE html>
<html>
<head>
  <title>My first Vue app</title>
  <script src="https://unpkg.com/vue@next"></script>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
  <div id="app">
    <p>{{message}}</p>
    <hello name="Suzuki" />
  </div>
  
  <script>
  const appdata = {
    data() {
      return {
        message : 'コンポーネントを表示します'
      }
    }
  }

  let app = Vue.createApp(appdata)

  app.component('hello', {
      props:['name'],
      template: '<p> Hello component! {{name}} </p>'
  })
  
  app.mount('#app')
  </script>
</body>
</html>

sample13
 props:[‘name’]の配列は、変数の型や初期値を指定したいときは、オブジェクトとして
 props:{
  name:{
   type:String,
   default:”}
  },
 }
とすることもできます。

index.html

<!DOCTYPE html>
<html>
<head>
  <title>My first Vue app</title>
  <script src="https://unpkg.com/vue@next"></script>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
  <div id="app">
    <p>{{message}}</p>
    <hello name="Suzuki" />
  </div>
  
  <script>
  const appdata = {
    data() {
      return {
        message : 'コンポーネントを表示します'
      }
    }
  }

  let app = Vue.createApp(appdata)

  app.component('hello', {
      props:{
         name:{
            type:String,
            default:''
         }
      },
  
      template: '<p> Hello component! {{name}} </p>'
  })
  
  app.mount('#app')
  </script>
</body>
</html>

4.4 コンポーネントのタグの属性の設定
 前述のようにVueオブジェクトにマウントされたHTMLのタグにv-bindで属性の設定ができたように、コンポーネントでもv-bindで属性の設定ができます。
(1)コンポーネントのタグにv-bindによる属性の設定
 sample14
 配列から取り出したデータをv-bindでname属性に設定し、
テンプレートに表示します。

<!DOCTYPE html>
<html>
<head>
  <title>My first Vue app</title>
  <script src="https://unpkg.com/vue@next"></script>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
  <div id="app">
    <p>{{message}}</p>
    <hello v-for="item in data" v-bind:name="item" />
  </div>
  
  <script>
  const appdata = {
    data() {
      return {
        message : 'コンポーネントを表示します',
        data:['Suzuki','Yamasita','Yamamoto']
      }
    }
  }

  let app = Vue.createApp(appdata)

  app.component('hello', {
      props:['name'],
      template: '<p> Hello component! {{name}} </p>'
  })
  
  app.mount('#app')
  </script>
</body>
</html>

(2)inputタグにv-modelの設定
 inputタグに設定されたv-model属性は、入力された値をVueオブジェクトの変数にバインドする働きをします。
 sample15
 index.html

<!DOCTYPE html>
<html>
<head>
  <title>My first Vue app</title>
  <script src="https://unpkg.com/vue@next"></script>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
  <div id="app">
    <p>{{message}}</p>
    <div><hello v-bind:name="name" /></div>
    <div><input type="text" v-model="name" ></div>
  </div>
  
  <script>
  const appdata = {
    data() {
      return {
        message : 'コンポーネントを表示します',
        name:"suzuki"
      }
    }
  }

  let app = Vue.createApp(appdata)

  app.component('hello', {
      props:['name'],
      template: '<p> Hello component! {{name}} </p>'
  })
  
  app.mount('#app')
  </script>
</body>
</html>

(3)コンポーネントのタグにv-onの設定
 v-on属性を使うことでイベントに値をバインドして、Vueオブジェクトで扱うことができます。
 sample16
 ボタンを押す毎に数字をインクリメントして、カウンタ表示します。
 index.html

<!DOCTYPE html>
<html>
<head>
  <title>My first Vue app</title>
  <script src="https://unpkg.com/vue@next"></script>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
  <div id="app">
    <p>{{message}}</p>
    <hello/>
  </div>
  
  <script>
  const appdata = {
    data() {
      return {
        message : 'コンポーネントを表示します',
        name:""
      }
    }
  }

  let app = Vue.createApp(appdata)

  app.component('hello', {
      data(){
        return{
          counter:0,
        }
      },
      template: '<p v-on:click="counter++"> counter! {{counter}} </p>'
  })
  
  app.mount('#app')
  </script>
</body>
</html>

(4)イベント処理をメソッドにまとめる
 上記(3)では 「v-on:click=”counter++”」として直接、値(式)を記述しましたが、ここではこの式をメソッドから呼ぶようにします。 
 sample17
 ボタンを押す毎に数字をインクリメントして、カウンタ表示します。

<!DOCTYPE html>
<html>
<head>
  <title>My first Vue app</title>
  <script src="https://unpkg.com/vue@next"></script>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
  <div id="app">
    <p>{{message}}</p>
    <hello/>
  </div>
  
  <script>
  const appdata = {
    data() {
      return {
        message : 'コンポーネントを表示します',
        name:""
      }
    }
  }

  let app = Vue.createApp(appdata)

  app.component('hello', {
      data(){
        return{
          counter:0,
        }
      },
      methods:{
        countup(){
          this.counter++;
        }
      },
      template: '<p v-on:click="countup"> counter! {{counter}} </p>'
  })
  
  app.mount('#app')
  </script>
</body>
</html>

・メソッドで変数を扱うとき、このオブジェクトの変数であることを示すため「this.counter++;」のようにthisを付けます。

4.5 算術プロパティ
 methodsプロパティとcomputedプロパティ(算術プロパティ)には関数式を定義できますが、算術プロパティは依存する値が更新された時に実行されます。
 上記ではイベントでメソッドを呼び出して値を更新しましたが、算術プロパティにcountup()を定義したときはカウントアップしません。

4.6 ローカルコンポーネント
 上記では、
(アプリケーション).component(‘hello’,{ data、method、templateなどのプロパティの定義})で定義したグローバルコンポーネントは全て読み込まれます。これに対してローカルコンポーネントで定義することで、必要なコンポーネントのみ読み込んで使うことができます。

sample18
 sample17をローカルコンポーネントとして書き換えたコードです。
 sample17では、app.component(‘hello’・・・)でVueオブジェクトに組み込んでいた(グローバルコンポーネント)をアプリケーション変数にcomponentsプロパティで登録してローカルコンポーネントとして登録します。

<!DOCTYPE html>
<html>
<head>
  <title>My first Vue app</title>
  <script src="https://unpkg.com/vue@next"></script>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
  <div id="app">
    <p>{{message}}</p>
    <hello/>
  </div>
  
  <script>
  const appdata = {
    data() {
      return {
        message : 'コンポーネントを表示します',
        name:""
      }
    },
    components:{
      hello:{
        data(){
          return{
            counter:0,
          }
        },
        methods:{
          countup(){
            this.counter++;
          }
        },
        template: '<p v-on:click="countup"> counter! {{counter}} </p>'
      }
    }
  }

  let app = Vue.createApp(appdata)

  app.mount('#app')
  </script>
</body>
</html>

The end

Vue.jsの基本5(ここまでのまとめ)

目次

本項ではVue.js v.2について扱います。
Vue.js v.2 日本語ドキュメント
https://jp.vuejs.org/v2/guide/

1.Vueの動作環境
(1)動作環境
 ・Windows 10 Pro
 ・XAMPP Control Panel v3.2.4
(2)Vueの導入
 Vueは下記のcdnからコードを読み込んで使用します。
・開発版(コンソールへの警告文が含まれている)<script src=”https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js”></script>

・本番版(サイズと高速化のため最適化されている)<script src=”https://cdn.jsdelivr.net/npm/vue@2.6.14″></script>

(3)動作確認方法
 Webサーバ(XAMPP)のドキュメントルート(”C:/xampp/htdocs”)にindex.html、javascript(.js)などのファイルを置き、XAMPPのApacheを起動してブラウザ(http://localhost)で確認します。

2.Vuejsの機能を含んだサンプルプログラム
下記のサンプルでは、Vuejsの機能として、
・イベントハンドリング(v-on:click)
・条件付きレンダリング(v-if)
・双方向バインディング(v-model)
・リストレンダリング(v-for)
・スタイルのバインディング(v-bind:style)
・クラスのバインディング(v-bind:class)
・コンポーネント( props、$emit(‘カスタムイベント’))
について動作を確認しました。

3.サンプルプログラムの概要

4.サンプルプログラム

index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <style>
    .class-a{color:green}
  </style>
  
</head>
<body>
  <div id="app">
    <p>■イベントハンドリングの例</p>
    <input
      type="button" value="push" @click="increment" />
    <p>{{count}}</p>
    <p>■条件付きレンダリング</p>
    <p v-if="count >=5">5回以上押下</p>
    <p v-else>5回未満</p>
    <p>■双方向バインディング</p>
    <input v-model="name" type="text" name="name"/>
    <p>入力したテキスト:{{name}}</p>
    <p>■リストレンダリング</p>
    <ul>
      <li v-for="(item,i) in member"
          v-bind:key='i'
      >{{item}}</li>
    </ul>
    <p>■スタイルのバインディング</p>
    <div v-bind:style="styleSample">
      <p>文字色:{{color}}</p>
    </div>
    <p>■クラスのバインディング(直接オブジェクトで指定)</p>
    <div v-bind:class="{'class-a':classA}">クラスのバインディング</div>
    <p>■クラスのバインディング(dataのオブジェクトで指定)</p>
    <div v-bind:class="classObj">クラスのバインディング</div>
    <p>■コンポーネント 選択したコンポーネントでメッセージが変わります</p>
    <p>メッセージ:{{title}}</p>
    <p v-on:click="onSelectroot">選択:Rootコンポーネント</p>
	<t-component
	   v-bind:componame="componame"
	   v-on:clicktitle="onSelectcompo()"
    ></t-component>
  </div>
  
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

・v-forの使い方
Vueインスタンスのデータを使ってレンダリングする。変数1、変数2はv-forの中でだけ使われる。
(1)データが配列のとき
<タグ名 v-for=”(変数1、変数2) in 配列の変数”>・・・<タグ名>
変数1には配列の要素、変数2には配列のindexが入る。
このindexをv-bind:key=”変数2”でkey属性に指定するようにする。

(2)データがオブジェクトのとき
<タグ名 v-for=”(変数1、変数2、変数3) in オブジェクト名”>・・・<タグ名>
オブジェクトを{プロパティ名:値}とすると、
変数1には値、変数2にはプロパティ名、変数3にはindexが入る。

(3)データがオブジェクトの配列のとき
<タグ名 v-for=”(変数1、変数2、変数3) in 配列の変数”>・・・<タグ名>
オブジェクトを[{プロパティ名:値},{プロパティ名:値},・・・]とすると、変数1には配列の要素(オブジェクト)、変数2には配列のindexが入る。
このindexをv-bind:key=”変数2”でkey属性に指定するようにする。
オブジェクト内のプロパティは、「変数名.プロパティ名」の書式でアクセスする。

main.js

//Vueインスタンス生成の前にコンポーネント定義を先に書かないと"ReferenceError"になる
const tComponent = Vue.component('t-component',{
  //親から受け取るデータを設定
  props: {
     componame: {
       type: String,
       default:""
     }
    },
 
  //親へのイベント通知の書き方
  //$emit(イベント名,[親コンポーネントに渡すデータ]):
  template: `
    <div
      class="title-box"
      v-on:click="$emit('clicktitle')"
    >選択:{{componame}}</div>`
});

//Vueインスタンスの作成
var app = new Vue({
  //Vueインスタンスを結びつけるHTML要素を指定
  el: '#app',
  //使用するコンポーネントの登録
  component:{
    't-component':tComponent,
  },
  //Vuejsで扱うデータを入れておくところを定義
  data:function(){  //Vuejsで扱うデータを入れておくところ
    return{         //データはオブジェクトを返す関数として定義(※1)
      title:"Hello", //①
      componame:"tComponent",
      name:"name",  //④
      count:0,  //③
      //message:"Hello Vuejs",
      member:['cat','dog','bard'],  //⑤
      color:'#f00',  //⑥
      classA:true,  //⑦
      classObj:{
        'class-a':true
      },
    };
  },
  //算出プロパティの定義
  computed:{
    styleSample(){  //⑥
     return `color:${this.color}`
    }
  },
  //メソッドの定義
  methods:{
    increment(){      //②
      this.count++;
    },
    onSelectcompo() {  //⑧カスタムイベントで実行するメソッド
      this.title="子コンポーネントの要素が選択されました";
    },
    onSelectroot() {  
      this.title="Rootコンポーネントの要素が選択されました";
    }
  }
});

5.ブラウザで表示例
・イベントハンドリング(v-on:click)
・条件付きレンダリング(v-if)

・双方向バインディング(v-model)

・リストレンダリング(v-for)

・スタイルのバインディング(v-bind:style)

・クラスのバインディング(v-bind:class)

・コンポーネント( props、$emit(‘カスタムイベント’))

The end

Vue.jsの基本3(Vueの機能確認2)

目次

本項ではVue.js v.2のドキュメントに従い、言語の仕様を試します。
Vue.js v.2 日本語ドキュメント
https://jp.vuejs.org/v2/guide/

1.Vueの動作環境
(1)動作環境
 ・Windows 10 Pro
・XAMPP Control Panel v3.2.4
(2)Vueの導入
 Vueは下記のcdnからコードを読み込んで使用します。
・開発版(コンソールへの警告文が含まれている)<script src=”https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js”></script>
・本番版(サイズと高速化のため最適化されている)<script src=”https://cdn.jsdelivr.net/npm/vue@2.6.14″></script>

(3)動作確認方法
 Webサーバ(XAMPP)のドキュメントルート(”C:/xampp/htdocs”)にindex.html、javascript(.js)などのファイルを置き、XAMPPのApacheを起動してブラウザ(http://localhost)で確認します。

2.算出プロパティ
(1)算出プロパティ
 算出プロパティでテンプレートで使うロジックを作成します。
sample12
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-12">
    <p>Original message: "{{ message }}"</p>
    <p>Computed reversed message: "{{ reversedMessage }}"</p>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

var app12=new Vue({
  el: '#app-12',
  data: {
    message:"Hello"
  },
  computed: {
    // 算出 getter 関数
    reversedMessage: function () {
      // `this` はapp12インスタンスを指します
      return this.message.split('').reverse().join('')
    }
  }
})

 ここで宣言した算出プロパティreversedMessageはプロパティapp12.reversedMessage に対するgetter 関数として利用されます。
 app12.reversedMessage の値は、常にapp12.messageの値に依存しているので、app12.messageの値が変わるとapp12.reversedMessage の値も変わります。

(2)メソッド
 上記(1)の算出プロパティをメソッドに変えても同じ結果が実現できます。
sample13
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-13">
    <p>Original message: "{{ message }}"</p>
    <p>Computed reversed message: "{{ reversedMessage() }}"</p>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

・ここではreversedMessageはメソッドなので()を付けて、reversedMessage()とします。

main.js

var app13=new Vue({
  el: '#app-13',
  data: {
    message:"Hello"
  },
  methods: {
     reversedMessage: function () {
     return this.message.split('').reverse().join('')
    }
  }
})

3.クラスとスタイルのバインディング
 v-bind:class にオブジェクトを渡すことでクラスを動的に切り替えることができます:<p v-bind:class=”{クラス名: 真偽値, クラス名: 真偽値, …}”>
sample14
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div
    class="static"
    v-bind:class="{ active: isActive, 'text-danger': hasError }"
  ></div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

・’text-danger’のように、クラス名にハイフンを含む場合は”(シングルクォート)で囲む。

main.js

var app14=new Vue({
  el: '.static',
   data: {
     isActive: true,
     hasError: false
   }
})

データプロパティの真偽値を変えることで、クラスを切り替えることができます。

4.条件付きレンダリング
(1)2つのブロックの切り換え
 v-if ディレクティブは、ブロックを条件に応じて描画したい場合に使用されます。ブロックは、ディレクティブの式が真を返す場合のみ描画されます。
sample15
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-15">
    <h1 v-if="awesome">Vue is awesome!</h1>
    <h1 v-else>Oh no 😢</h1>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

var app15=new Vue({
  el: '#app-15',
  data: {
     awesome: true
   }
})

コンソールから「app15.awesome=false」を入力

(2)3つ以上のブロックの切り換え
sample16
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-16">
    <h1 v-if="type==='A'">Type is A</h1>
    <h1 v-else-if="type==='B'">Type is B</h1>
    <h1 v-else>Type Not A/B/C</h1>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

var app16=new Vue({
  el: '#app-16',
  data: {
     type:"A"
   }
})

コンソールから「app16.type=”B”」を入力

コンソールから「app16.type=”C”」を入力

コンソールから「app16.type=”D”」を入力

5.リストレンダリング
(1)v-forで配列に要素をマッピングする
 配列に基づいて、アイテムのリストを描画するために、v-for ディレクティブを使用することができます。v-for ディレクティブは item in items の形式で、ソースデータの配列itemsから配列要素を反復してitemに入れます。
sample17
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <ul id="app-17">
    <li v-for="item in items" :key="item.message">
      {{ item.message }}
    </li>
  </ul>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

var app17=new Vue({
  el: '#app-17',
  data: {
    items: [
      { message: 'Foo' },
      { message: 'Bar' }
    ]
  }
})

(2)オブジェクトのプロパティに対してv-for を使って反復処理
 オブジェクトのプロパティに対して、v-for を使って反復処理することができます。
sample18
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <ul id="app-18">
    <li v-for="item in object">
      {{ item }}
    </li>
  </ul>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

var app18=new Vue({
  el: '#app-18',
  data: {
    object: {
      title: 'How to do lists in Vue',
      author: 'Jane Doe',
      pubslishedAt: '2016-04-10'
    }
  }
})

6.イベントハンドリング
(1)イベントハンドラ
 v-on ディレクティブを使うことでイベント発生時の JavaScript の実行が可能になります。
sample19
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-19">
    <button v-on:click="counter += 1">Add 1</button>
    <p>The button above has been clicked {{ counter }} times.</p>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

var app19=new Vue({
  el: '#app-19',
  data: {
    counter: 0    
  }
})

(2)メソッドイベントハンドラ
 上記(1)ではv-on 属性の値に JavaScript 式を記述しましたが、ここではメソッドを呼び出す形に改造します。
sample20
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-20">
    <button v-on:click="countup">Add 1</button>
    <p>The button above has been clicked {{ counter }} times.</p>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

var app20=new Vue({
  el: '#app-20',
  data: {
    counter: 0
  },
  methods: {
countup:function(){
 //このインスタンスを示すthisを付ける
      this.counter += 1
    }
  }
})

呼出し時

「Add 1」ボタン押下

7.フォーム入力バインディング
 formのinput要素やtextarea要素、select要素に双方向 データバインディングを作成するにはv-modelディレクティブを使用することができます。
(1)テキストの入力と表示
<input v-model=”message” ・・・>
sample21
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-21">
	<input v-model="message" placeholder="edit me">
	<p>Message is: {{ message }}</p>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

var app21=new Vue({
  el: '#app-21',
  data: {
    message : ''
  }
})

(2)複数行テキストの入力と表示
<textarea v-model=”message” ・・・></textarea>
sample22
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-22">
    <span>Multiline message is:</span>
    <p>{{ message }}</p>
    <br>
    <textarea v-model="message" placeholder="add multiple lines"></textarea>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

var app22=new Vue({
  el: '#app-22',
  data: {
    message : ''
  }
})

(3)チェックボックス
 単体のチェックボックスはboolean値で初期値をchecked:falseとする。
sample23
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-23">
    <input type="checkbox" id="checkbox" v-model="checked">
    <label for="checkbox">{{ checked }}</label>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

var app23=new Vue({
  el: '#app-23',
  data: {
    checked : false
  }
})

8.コンポーネントの基本
(1)コンポーネントの作成と利用
sample24
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-24">
	<button-counter></button-counter>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

// button-counter と呼ばれる新しいコンポーネントを定義します
Vue.component('button-counter', {
  data: function () {
    return {
      count: 0
    }
  },
  template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'
})

var app24=new Vue({
  el: '#app-24',
})

・コンポーネントの data オプションは、各インスタンスが返されるデータオブジェクトの独立したコピーを保持できるように、関数でなければなりません。

(2)プロパティを使用した子コンポーネントへのデータの受け渡し
 props オプションを使用して、このコンポーネントが受け入れるプロパティのリストに含めることで、HTML要素からカスタム属性としてデータを渡すことができる。
sample24_2(HTMLのカスタム属性でデータを渡す例)
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app">
    <blog-post title="My journey with Vue"></blog-post>
    <blog-post title="Blogging with Vue"></blog-post>
    <blog-post title="Why Vue is so fun"></blog-post>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

Vue.component('blog-post', {
  props: ['title'],
  template: '<h3>{{ title }}</h3>'
})

new Vue({
  el: '#app',
})

sample24_3(Vueインスタンスのデータを読み込んで渡す例)
 Vueインスタンスの配列データをv-forで読み込んだオブジェクトをv-bind を使って動的にプロパティを渡すことができる。
 index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app">
    <blog-post
      v-for="post in posts"
      v-bind:key="post.id"
      v-bind:title="post.title">
    </blog-post>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

Vue.component('blog-post', {
  props: ['title'],
  template: '<h3>{{ title }}</h3>'
})

new Vue({
  el: '#app',
  data: {
    posts: [
      { id: 1, title: 'My journey with Vue' },
      { id: 2, title: 'Blogging with Vue' },
      { id: 3, title: 'Why Vue is so fun' }
    ]
  }
})

(3)コンポーネントの再利用

sample25
Index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-25">
	<button-counter></button-counter>
    <button-counter></button-counter>
    <button-counter></button-counter>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

9.コンポーネントの登録
(1)コンポーネントの登録
 コンポーネントの登録は Vue.component の第一引数にコンポーネント名を書き、次の様式で書く。
 Vue.component(‘my-component-name’, { /* … */ })
 コンポーネント名を定義する時、ケバブケース(文字の区切りにハイフンを使う)とパスカルケース(最初の文字を大文字にしたキャメルケース)の両方が使える。ケバブケースではコンポーネントの登録とカスタム要素の参照ともにケバブケースを使う。

(2)グローバル登録とローカル登録 
 Vue.componentだけを使ってコンポーネントを作成するとグローバルコンポーネントとなり全てのルートVueインスタンス(new Vue)のテンプレート内で使用できますが、使用しないときも最終ビルドに含まれてJavaScriptのファイルサイズを不要に増加させてしまいます。
 ローカル登録することでJavaScriptのファイルサイズを不要に増加させることを防ぐことができます。
 ローカル登録ではコンポーネントを素のJavaScript オブジェクトとして定義して、Vueインスタンスのcomponentsオプション内に使いたいコンポーネントを定義します。

sample26(コンポーネントのグローバル登録)
 index.htmlファイル

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-26">
    <ol>
      <component-a></component-a>
      <component-b></component-b>
      <component-c></component-c>
    </ol>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

// コンポーネントの定義
Vue.component('component-a', {
  template: '<li>This is a COMPONENT A</li>'
})
Vue.component('component-b', {
  template: '<li>This is a COMPONENT B</li>'
})
Vue.component('component-c', {
  template: '<li>This is a COMPONENT C</li>'
})

var app26=new Vue({
  el: '#app-26',
})

sample27(コンポーネントのローカル登録)
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-27">
    <ol>
      <component-a></component-a>
      <component-b></component-b>
      <component-c></component-c>
    </ol>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

// コンポーネントの定義
var ComponentA = {
  template: '<li>This is a COMPONENT A</li>'
}
var ComponentB = {
  template: '<li>This is a COMPONENT B</li>'
}
var ComponentC = {
  template: '<li>This is a COMPONENT C</li>'
}

var app27=new Vue({
  el: '#app-27',
  components: {
    'component-a': ComponentA,
    'component-b': ComponentB,
    'component-c': ComponentC
  }
})

The end

Vue.jsの基本2(Vueの機能確認1)

目次

本項ではVue.js v.2のドキュメントに従い、言語の仕様を試します。
Vue.js v.2 日本語ドキュメント
https://jp.vuejs.org/v2/guide/

1.Vueの動作環境
(1)動作環境
 ・Windows 10 Pro
・XAMPP Control Panel v3.2.4
(2)Vueの導入
 Vueは下記のcdnからコードを読み込んで使用します。
・開発版(コンソールへの警告文が含まれている)<script src=”https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js”></script>

・本番版(サイズと高速化のため最適化されている)<script src=”https://cdn.jsdelivr.net/npm/vue@2.6.14″></script>

(3)動作確認方法
 Webサーバ(XAMPP)のドキュメントルート(”C:/xampp/htdocs”)にindex.html、javascript(.js)などのファイルを置き、XAMPPのApacheを起動してブラウザ(http://localhost)で確認します。

下記のドキュメントに従い、Vueの機能を試しました。
 Vue.js 日本公式サイト
 https://jp.vuejs.org/

2.宣言的レンダリング
(1)要素のバインディング
Vueインスタンスからhtmlの要素を書き換える。
sample1
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app">
     {{ message }}
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
})

Vueアプリケーションは、自身を単一の DOM 要素 (上の例では #app要素) にアタッチし、HTMLにレンダリングします。 これらは Vueインスタンスの中で行われ、HTMLの要素を直接書き換えることなく、Vueインスタンスのmessageプロパティによって要素の値を変えることができます。
 コンソールから、「app.message = ‘new message’」を入力することで、htmlの要素の値が変わります。

(2)要素の属性のバインディング
Vueインスタンスからhtmlの要素の属性を書き換えます。
sample2
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-2">
    <span v-bind:title="message">
      Hover your mouse over me for a few seconds
      to see my dynamically bound title!
    </span>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

var app2 = new Vue({
  el: '#app-2',
  data: {
    message: 'You loaded this page on ' + new Date().toLocaleString()
  }
})

・htmlのv-bind属性はディレクティブと呼ばれ、描画されたDOM に特定のリアクティブな振舞いを与えます。ここでは「この要素のtitle属性をVueインスタンスのmessageプロパティによって更新して保存する」を宣言しています。
 ここでコンソールから「app2.message = ‘some new message’」 を入力すると一度束縛されたHTML(ここではtitle 属性)が更新されます。

3.ディレクティブ
  DOM要素に対して何かを実行することをライブラリに伝達するマークアップ中の特別なトークンです。
(1)条件分岐(v-ifディレクティブ)
sample3
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-3">
    <span v-if="seen">Now you see me</span>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

var app3 = new Vue({
  el: '#app-3',
  data: {
    seen: true
  }
})

ここでコンソールから「app3.seen = false」 を入力するとhtmlの要素が消える。

(2)ループ(v-for ディレクティブ)
 v-for ディレクティブを使い、アイテムのリストを配列内のデータを使って表示します。
sample4
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-4">
    <ol>
      <li v-for="todo in todos">
        {{ todo.text }}
      </li>
    </ol>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

var app4 = new Vue({
  el: '#app-4',
  data: {
    todos: [
      { text: 'Learn JavaScript' },
      { text: 'Learn Vue' },
      { text: 'Build something awesome' }
    ]
  }
})

Vueインスタンスのtodosプロパティにアイテムを追加することでリストに新しいアイテムが追加されます。
 コンソールから「app4.todos.push({ text: ‘New item’ }) 」と入力する。

(3)ユーザー入力の制御(v-on ディレクティブ)
 v-on ディレクティブを使ってイベントリスナを加え、Vue インスタンスのメソッドを呼び出すことで要素に対して処理を行います。
sample5
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-5">
    <p>{{ message }}</p>
    <button v-on:click="reverseMessage">Reverse Message</button>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

var app5 = new Vue({
  el: '#app-5',
  data: {
     message: 'Hello Vue.js!'
  },
  methods: {
    reverseMessage: function () {
      this.message = this.message.split('').reverse().join('')
    }
  }
})

(4)双方向バインディング(v-modelディレクティブ)
 v-modelディレクティブを使い、フォームから入力した値をhtml要素に反映します。
sample6
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-6">
    <p>{{ message }}</p>
    <input v-model="message">
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

var app6 = new Vue({
  el: '#app-6',
  data: {
     message: 'Hello Vue!'
  }
})

フォームで入力した値でVueインスタンスのプロパティが更新され、htmlの要素を書き換えます。

4.コンポーネントによる構成
  Vueにおいては、「コンポーネント」はあらかじめ定義されたオプションを持つVueインスタンスで、他のコンポーネントのテンプレートからこのコンポーネントを利用することができます。
(1)コンポーネントの作成
sample7
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-7">
    <ol>
      <!-- todos 配列にある各 todo に対して todo-item コンポーネントのインスタンスを作成する -->
      <todo-item></todo-item>
    </ol>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

// todo-item と呼ばれる新しいコンポーネントを定義
Vue.component('todo-item', {
  template: '<li>This is a todo</li>'
})

var app7 = new Vue({
  el: '#app-7',
})

・コンポーネントはVue.component(‘コンポーネント名’, {
オプション:値})で作成します。
・コンポーネントは、DOM 要素 (上の例では #app-7要素) にアタッチするVueインスタンスを作成することでテンプレートから利用できます。

(2)親から子のコンポーネントへデータを渡す
 親コンポーネントでpropsにデータを渡すと子コンポーネントでpropsからデータを受けることができる。
sample7
index.html

<body>
  <div id="app-7">
    <ol>
      <!--
        各 todo-item の内容を表す todo オブジェクトを与えます。
        これにより内容は動的に変化します。
        また後述する "key" を各コンポーネントに提供する必要があります。
      -->
      <todo-item
        v-for="item in groceryList"
        v-bind:todo="item"
        v-bind:key="item.id"
      ></todo-item>
    </ol>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

・v-bind: (prop名)=”(データの値)”でデータを設定する。

main.js

Vue.component('todo-item', {
  //propsの名前を指定
  props: ['todo'],
  template: '<li>{{ todo.text }}</li>'
})

var app7 = new Vue({
  el: '#app-7',
  data: {
    groceryList: [
      { id: 0, text: 'Vegetables' },
      { id: 1, text: 'Cheese' },
      { id: 2, text: 'Whatever else humans are supposed to eat' }
    ]
  }
})

・propsの名前でデータを取り出して、テンプレートに出力する。

5.Vueインスタンスの作成
  全てのVueアプリケーションは、Vue関数で新しいVueインスタンスを作成することによって起動されます。
var (インスタンス名) = new Vue({
// オプションオブジェクト
})
 Vueインスタンスはdataオブジェクトの全てのプロパティの値に一致するようにビューを更新します。

sample8
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-8">
    <p>{{ foo }}</p>
    <!-- これは `foo` を更新しなくなります! -->
    <button v-on:click="foo = 'baz'">Change it</button>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

var obj = {
  foo: 'bar'
}

//プロパティの変更を防ぐ
object.freeze(obj)

var app8 = new Vue({
  el: '#app-8',
  data: obj
})

「Change it」ボタンを押しても表示は変わらない。

object.freeze(obj)を無効にすると、「Change it」ボタンを押すと表示が変わる。

6.インスタンスライフサイクルフック
Veuインスタンスはいくつかのライフサイクルフック(lifecycle hooks) 関数を実行します。
 例えばcreatedフックはインスタンス生成後、コードが実行されたときに実行し、updatedフックはデータ変更後、仮想DOMが再描画したとき実行します。

sample9
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-9">
  ライフサイクルフック<br>
  {{a}}
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

var app9=new Vue({
  el: '#app-9',
  data: {
    a: 1
  },
  created: function () {
    // `this` は vm インスタンスを指します
    console.log('created a is: ' + this.a)
  },
  
  updated: function () {
    console.log('update a is: ' + this.a)
  
  }
})

7.テンプレート構文
”Mustache”構文(二重中括弧)を利用したテキスト展開 {{ msg }}では対応するオブジェクトのmsgプロパティの値に置き換えられ、msgプロパティの値の変更の都度、更新されます。
sample110
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-10">
    <span >This will never change: {{ msg }}</span>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

var app10=new Vue({
  el: '#app-10',
  data: {
    msg:"Hello"
  }
})

v-once ディレクティブを使用することで、データ変更時の更新を行わないようにできます。

sample11
index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js App</title>
  <link href="main.css" rel="stylesheet">
</head>
<body>
  <div id="app-11">
    <span v-once>This will never change: {{ msg }}</span>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  <script src="main.js"></script>
</body>
</html>

main.js

var app11=new Vue({
  el: '#app-11',
  data: {
    msg:"Hello"
  }
})

下記の項目については次回以降とします。
8.算出プロパティとウォッチャ
9.クラスとスタイルのバインディング
10.条件付きレンダリング
11.リストレンダリング
12.イベントハンドリング
13.フォーム入力バインディング
14.コンポーネントの基本
15.コンポーネントの登録
16.プロパティ
17.カスタムイベント
18.スロット
19.動的 & 非同期コンポーネント
20.特別な問題に対処する
21.Enter/Leave とトランジション一覧
22.状態のトランジション
23.ミックスイン
24.カスタムディレクティブ
25.描画関数とJSX
26.プラグイン
27.フィルター
28.単一ファイルコンポーネント
29.テスト
30.TypeScript のサポート
31.プロダクション環境への配信
32.ルーティング
33.状態管理
34.サーバサイドレンダリング
35.セキュリティ

The end

Vue.jsの基本1(開発環境~コンポーネントの作成とWebサーバへのデプロイ)

目次

1.Vue.jsとは
(1)概要
 Vue(Vue.js)はユーザインタフェース構築のためのJavaScriptフレームワーク。

Vue.js 日本公式サイト
https://jp.vuejs.org/

(2)特徴
・HTMLをコンポーネント化することで再利用可能。
・Vue.jsに同期させて画面を更新できる。
・SPA(Single Page Application)の単一のページを部分的に差分のみの画面描画ができる。

2.Vueの開発環境
(1)ホストOS
 Windows 10 Pro
 XAMPP Control Panel v3.2.4(ローカル環境テスト用)
(2)仮想環境(VirtualBox)
 ・ゲストOS:CentOs8(Red Hat 64-bit)
 ・Node.js:v14.18.1($ node –version)
 ・npm:6.14.11($ npm –version)

(3)Vueライブラリのインストール
 $ npm install vue
 Vueのバージョン確認
 $ npm list vue

(4)Vue CLIのインストール
 $ npm install -g @vue/cli

3.HTMLページで部分的にVue.jsの利用
ここでは下記のVueライブラリを読み込む。
・開発版<script src=”https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js”></script>

・本番版<script src=”https://cdn.jsdelivr.net/npm/vue@2.6.14″></script>

また、サンプルは下記のサイトに掲載されているものを参考とした。

Vue.js 日本公式サイト

https://jp.vuejs.org/

Webサーバ(XAMPP)のドキュメントルート(”C:/xampp/htdocs”)にindex.htmlファイルを置き、XAMPPのApacheを起動してブラウザ(http://localhost)で確認した。

(1)サンプル1
 テキストのバインディング
 index.html

<div id="app">
 <h2>{{product}} are in stock.</h2>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
 const app=new Vue({
   el:'#app',
   data:{
     product:'Boots'
     }
 })
</script>

・Vueアプリケーションは、Vueインスタンスを作成(new Vue(オプション))することで起動される。
・オプション(Vue.jsのAPI)の種類
 el:mountする要素
 data:アプリケーションで使用するデータ
 computed:算出プロパティ
 methods:アプリケーションで使用するメソッド

ライフサイクルフック
 beforeCreate:インスタンスの初期化前に実行
 created:インスタンスの初期化後に実行、
   プロパティdataにアクセスできる。
 beforeMount:elementへのマウント前に実行
 mounted:elementへのマウント後に実行
 beforeUpdate:プロパティ更新時の再描画前に実行
 updated:データ更新時の再描画後に実行
 beforeDestroy:インスタンスが破棄される前に実行
 destroyed:インスタンスが破棄された後に実行

(2)サンプル2
 テキストのバインディングと繰り返し描画
 index.html

<div id="app">
 <ul>
   <li v-for="product in products">
     {{product}}
   </li>
 </ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
 const app=new Vue({
   el:'#app',
   data:{
     products:[
        'Boots',
        'Jacket',
        'Hiking Socks'
       ]
     }
 })
</script>

(3)サンプル3
 ライフサイクルフック関数created(インスタンスが生成された後に実行)でコンソールにインスタンスの値を出力する。
 index.html

<div id="app">
 <h2>{{product}} are in stock.</h2>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<!--
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14"></script>
-->
<script>
 const app=new Vue({
   el:'#app',
   data:{
     product:'Boots'
   },
   //ライフサイクルフック関数created:インスタンスが生成された後に実行
   created: function () {
   // `this` は appインスタンスを指す
    console.log('product is: ' + this.product)
   }
 })
</script>

4.Vue CLIによるプロジェクト作成
(1)Vue CLIコマンド実行
 $ vue ui
(2)ブラウザでVue CLI UIの画面を開く(5分程度かかる)
 http://localhost:8000

(3)新しいプロジェクトを作成
 プロジェクトマネージャで「作成」タブを選び、お好きなディレクトリを指定して、「ここに新しいプロジェクトを作成する」を選択。

「プロジェクト作成中・・・」で約5分程度で終了

左のタブの一番下の「タスク」、その中のserveを選択し、「タスクの実行」ボタンをクリック。

実行が終了したら、「アプリを開く」で最初の画面が確認できる。

VueCLIで作成したプロジェクトのファイル

「public/index.html」

<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>

「src/main.js」

import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')

vueファイルは1ファイルが1つのVue要素=コンポーネントとして、再利用し易いようになっている。また、vueファイルは、template、script、styleの3つの部分から構成されている。

「src/app.vue」

<template>
  <div id="app">
    <img alt="Vue logo" src="./assets/logo.png">
    <HelloWorld msg="Welcome to Your Vue.js App"/>
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'

export default {
  name: 'App',
  components: {
    HelloWorld
  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

「src/components/HelloWorld.vue」

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <p>
      For a guide and recipes on how to configure / customize this project,<br>
      check out the
      <a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
    </p>
    <h3>Installed CLI Plugins</h3>
    <ul>
      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
    </ul>
    <h3>Essential Links</h3>
    <ul>
      <li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
      <li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
      <li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
      <li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
      <li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
    </ul>
    <h3>Ecosystem</h3>
    <ul>
      <li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
      <li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
      <li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
      <li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
      <li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
    </ul>
  </div>
</template>
<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: String
  }
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {
  margin: 40px 0 0;
}
ul {
  list-style-type: none;
  padding: 0;
}
li {
  display: inline-block;
  margin: 0 10px;
}
a {
  color: #42b983;
}
</style>

ローカルサーバの起動をする
# npm run serve

仮想マシンのローカルブラウザで接続

ビルドする
# npm run build
distフォルダが作成される

distフォルダのファイルをWebサーバ(XAMPP)のドキュメントルート(”C:/xampp/htdocs”)の中に置く。

XAMPPのApacheを起動し、ブラウザからWebサーバに接続する。

PCのブラウザからhttp://localhostに接続

The end

Angularの基本2(コンポーネントとルーティングモジュールの作成)

目次

1.Angularの開発環境
(1)ホストOS
 Windows 10 Pro
(2)仮想環境(VirtualBox)
 ・ゲストOS:CentOs8(Red Hat 64-bit)
 ・Node.js:v14.18.1($ node –version)
 ※Nodejsのv16.13.0はAngular CLIでサポートされていないため、v14.18.1に変更した。
 ・npm:6.14.11($ npm –version)
 ・Angular CLI:12.2.12($ ng –version)

2.Angularアプリケーションの作成
 Menu、Menue1、Menu2のコンポーネントを作成し、Menuの画面からMenu1、又はMenu2を呼び出す。また、Menu1とMenu2には「back」を選択することでMenuに戻る。

2.1 プロジェクトの作成
(1)Angular CLI コマンドを実行
 ng new
 $ ng new angular-sample1
 ? Would you like to add Angular routing? Yes
 ? Which stylesheet format would you like to use? CSS
 ※プロジェクト名はsample-1は無効、sample1は有効。
(2)Angularサンプル画面の表示
 project-nameのフォルダで下記コマンドを実行する。
 $ ng serve –host 0.0.0.0 –port 8080

・仮想マシンのブラウザで下記urlに接続
http://127.0.0.1:8080

2.2 コンポーネントの作成
(1)ターミナルウィンドウから、アプリケーションを含むディレクトリに移動
(2)Angular CLI コマンドを実行
  ng generate component <component-name>
$ ng generate component menu
$ ng generate component menu1
$ ng generate component menu2

src/app/に追加したコンポーネントの名前のフォルダが作成される
・コンポーネントファイル .component.ts
・テンプレートファイル .component.html
・CSS ファイル .component.css
・テスト仕様ファイル .component.spec.ts

(3)コンポーネントとテンプレートの作成
「menu.component.html」

<div class="menu">
  <ul>
     <li><a routerLink="/menu1">Menu1</a></li>
     <li><a routerLink="/menu2">Menu2</a></li>
  </ul>
</div>

「menu.component.ts」

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-menu',
  templateUrl: './menu.component.html',
  styleUrls: ['./menu.component.css']
})
export class MenuComponent implements OnInit {

  constructor() { }

  ngOnInit(): void {  }

}

「menu1.component.html」

<p>{{title}}</p>
<li><a routerLink="/">back</a></li>

「menu1.component.ts」

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-menu1',
  templateUrl: './menu1.component.html',
  styleUrls: ['./menu1.component.css']
})
export class Menu1Component implements OnInit {
  title:string; //追加
  constructor() {
      this.title='This is a menu1 of angular-sample1';  //追加
    }

  ngOnInit(): void {
  }

}

「menu2.component.html」

<p>{{title}}</p>
<li><a routerLink="/">back</a></li>

「menu2.component.ts」

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-menu2',
  templateUrl: './menu2.component.html',
  styleUrls: ['./menu2.component.css']
})
export class Menu2Component implements OnInit {
    title:string;  //追加
  constructor() {
        this.title='This is a menu2 of angular-sample1';  //追加
   }

  ngOnInit(): void {
  }

}

(4)ルートコンポーネント
AngularCLIコマンドでプロジェクトを作成するとき自動的に作成される。
ルートコンポーネントはアプリ起動時に最初に呼び出される。
「app.component.html」

<app-menu></app-menu>
<div class="main">
   <router-outlet></router-outlet>
</div>

・<router-outlet>はルーティングされたビューをどこに表示するかをルーターに教える
(参考)
ルーティングを使ったナビゲーションの追加
https://angular.jp/tutorial/toh-pt5

「app.component.ts」

//コンポーネントで利用するモジュールをインポート
import { Component } from '@angular/core';
//@Component デコレーターでコンポーネント情報を宣言
@Component({
  //コンポーネントの適用先を表すセレクター式
  selector: 'app-root',
  //コンポーネントに適用するビュー(テンプレート)
  templateUrl: './app.component.html',
  //コンポーネントに適用するスタイル
  styleUrls: ['./app.component.css']
})
//コンポーネントクラス
export class AppComponent {
  title = 'angular-sample1';
}

(5)ルートモジュール
  アプリを起動するときに呼び出されるモジュール。
 AngularCLIコマンドでコンポーネントを作成するとき自動的に追加される。
「app.module.ts」

//アプリを起動するときに呼び出されるモジュール(ルートモジュール)
// Angularのモジュールをインポート
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
//コンポーネントのインポート
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { MenuComponent } from './menu/menu.component';
import { Menu1Component } from './menu1/menu1.component';
import { Menu2Component } from './menu2/menu2.component';
//モジュール情報の宣言
@NgModule({
    //モジュール配下のコンポーネント
  declarations: [
    AppComponent,
    MenuComponent,
    Menu1Component,
    Menu2Component
  ],
    //現在のモジュールで利用する他のモジュール/コンポーネント
  imports: [
    BrowserModule,
    AppRoutingModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
//モジュールクラス
export class AppModule { }

(6)ルーティングモジュール
 プロジェクト作成時にルーティングモジュールの追加を行っていないときはルーティングモジュールを作成する。
「app-routing.module.ts」

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';

import { Menu1Component } from './menu1/menu1.component'; //追加
import { Menu2Component } from './menu2/menu2.component'; //追加

const routes: Routes = [
    { path: 'menu1', component: Menu1Component },  //追加
    { path: 'menu2', component: Menu2Component },  //追加

];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

・@NgModuleメタデータはルーターを初期化し、ブラウザのロケーションの変更を待機する。

(7)メインページ
 アプリを動作させるためのメインページはアプリケーションルート直下(/srcフォルダー)に配置される。
「index.html」

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>AngularSample1</title>
  <base href="/">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
  <!-- ルートコンポーネントの呼び出し-->
  <app-root></app-root>
</body>
</html>

The end

Angularの基本1(開発環境~コンポーネントの作成とWebサーバへのデプロイ)

目次
1.Angularとは
2.Angularの開発環境
3.Angularサンプル

1.Angularとは
(1)概要
 AngularはGoogle を中心としたコミュニティで開発・公開されているTypeScriptベースのフロントエンドWebアプリケーションフレームワーク。
 Angularはフロントエンド開発に必要な機能を一通り備えたフルスタックフレームワークで、SPA(Single Page Application)と呼ばれるページを遷移せずに動作するWebアプリ開発に向いている。

Angular日本語ドキュメント
https://angular.jp/


(2)特徴
・MVC(Model View Controller)や
MVVM (Model-View-ViewModel) アーキテクチャーをもつ。
・JavaScriptを拡張したTypeScriptで作成したスクリプトをES5レベルのJavaScript に変換してブラウザに読み込ませる。

2.Angularの開発環境
(1)ホストOS
 Windows 10 Pro
(2)仮想環境(VirtualBox)
 ・ゲストOS:CentOs8(Red Hat 64-bit)
 ・Node.js:v10.24.0($ node –version)
 ・npm:6.14.11($ npm –version)
(3)Angular CLI(Command Line Interface)のインストール
 $ npm install -g @angular/cli
  :
 how to change this setting,see
       https://angular.io/analytics. No

(4)Node.jsのバージョンアップ
 Angular CLIには、v12.14またはv14.15のいずれかの最小Node.jsバージョンが必要。
 Node.jsのバージョンアップするときはNode のバージョン管理ツールnを使用する。
・Node のバージョン管理ツールnのインストール
 $ npm install -g n

・nodeの安定版のバージョン確認
 $ n –stable
・最新の安定版のインストール
 $ n stable

・nodeのバージョン確認
 $ node -v
 v16.13.0

(5)プロジェクトの作成
 $ ng new angular-sample

CSSのところで改行すると、インストールを開始する。

「ng new (アプリケーション名)」コマンドで下記のフォルダが作られる。

・フォルダ構成

angular-sample
├── README.md
├── angular.json     //Angularの設定ファイル
├── karma.conf.js
├── node_modules
├── package-lock.json
├── package.json     //nodeのパッケージを管理するファイル
├── src
├── tsconfig.app.json
├── tsconfig.json
└── tsconfig.spec.json

(プロジェクト名)/src/

src
├── app     //アプリケーションのソースコードを置く
│   ├── app-routing.module.ts
│   ├── app.component.css
│   ├── app.component.html
│   ├── app.component.spec.ts
│   ├── app.component.ts     //プロジェクトの起点となるファイル
│   └── app.module.ts
├── assets     //画像などの静的ファイルを置く
├── environments     //環境ごとの値を保持するファイルを置く
│   ├── environment.prod.ts
│   └── environment.ts
├── favicon.ico
├── index.html
├── main.ts
├── polyfills.ts
├── styles.css
└── test.ts

(5)Angularサンプル画面の表示
「ng new (アプリケーション名)」コマンドで作成されたフォルダで下記コマンドを実行する。
 $ ng serve –host 0.0.0.0 –port 8080

・仮想マシンのブラウザで下記urlに接続
 http://127.0.0.1:8080

3.Angularサンプル
(1)コンポーネントファイルの作成
  ./src/app/app.component.ts

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'Angularサンプル';
}

・ファイルの先頭に次のimport文を記述
import { Component } from ‘@angular/core’;
 ・import文の後に@Componentデコレーターを記述し、
selector:’HTMLから参照されるときのタグ名’
templateUrl: ‘コンポーネントが情報を表示するため に使用するHTMLテンプレート’
styleUrls:’コンポーネントのテンプレートのスタイルCSSファイルのパス’
 のプロパティの値を定義することで、tsファイル、テンプレートファイル、cssファイルが連携できる。 
・コンポーネントのコードを含むclass文を記述
 export class AppComponent {}

(2)テンプレートファイルの作成
  ./src/app/app.component.html

<h1>{{ title }}</h1>

(3)cssファイルの作成
./src/app/app.component.css

h1 {
  color: #0000FF;
  font-size: 20px;
}

(4)アプリのビルドと実行
  $ ng serve –host 0.0.0.0 –port 8080

(5)仮想マシンのブラウザで下記urlに接続
  http://127.0.0.1:8080

(6)Webサーバへのデプロイ
 プロジェクトのディレクトリに移動して下記のコマンドを実行することでdistフォルダにビルドファイルが作成される。ここではルーティングのベースとなるディレクトリを「/angularapp」指定した。
 $ ng build –prod –base-href=/angularapp/

/distフォルダに作成されたプロジェクト名のフォルダが作成される。

 上記の全てのファイルをWebサーバ(XAMPP)のドキュメントルート(”C:/xampp/htdocs”)に前述のディレクトリ「/angularapp」を作成して、その中に置く。

・XAMPPのApacheを起動し、ブラウザからWebサーバに接続する。

http://localhost/angularapp/

The end

TypeScriptの基本1(開発環境~コンポーネントの作成とWebサーバへのデプロイ)

目次

1.TypeScriptとは
(1)概要
 TypeScriptは2013年にMicrosoftによって開発されたJavaScriptを拡張して作られたプログラミング言語でAltJS(代替JavaScript言語)の一つである。 AltJS はコンパイルすることでJavaScriptが生成されるプログラミング言語。
 TypeScriptで書かれたコードをコンパイルするとJavaScriptのコードに変換されるためJavaScriptファイルが実行できる環境で使える。クライアントサイド、サーバサイド (Node.js) で実行されるJavaScriptアプリケーションの開発に利用できる。
(2)特徴
・変数のデータ型についてJavaScriptは実行時にデータ型が自動で決まる動的型付けに対し、TypeScriptでは変数のデータ型をあらかじめ決めることのできる静的型付けで宣言するためエラーを未然に防げる。
・クラスの作成ができる。クラスを使うことでJavaScriptより短く読みやすいコードが書ける。
・JavaScriptとの互換性があり、JavaScriptファイルをTypeScriptから呼び出して使うことも可能。

2.TypeScriptの開発環境
(1)ホストOS
 Windows 10 Pro
(2)仮想環境(VirtualBox)
 ・ゲストOS:CentOs8(Red Hat 64-bit)
(3)TypeScriptのインストール
 $ npm install -g typescript
$ tsc -v

(4)コンパイルのための設定ファイルを作成
 $ tsc –init
 プロジェクトフォルダ内にtsconfig.jsonという設定ファイルが作成される。

3.TypeScriptでの実装とWebサーバへデプロイ
(1)ソースファイルの作成
 type-test.ts

let message:string="Hello TypeScript"
var mydiv = document.getElementById('root')
mydiv.innerHTML=message
console.log(message)

 index.html

<!DOCTYPE html>
<html>
<head>
  <title>TypeScriptのサンプル</title>
</head>
<body>
  <div id="root"></div>
  <script src="type-test.js"></script>
</body>
</html>

(2)コンパイル
 TypeScriptファイル( type-test.ts)をコンパイルして、javascriptファイル(.js)に変換する。
 $ tsc type-test.ts

(3)ブラウザで表示
 XAMPPのApacheを起動し、index.htmlとjavascriptファイル(type-test.js)を”C:/xampp/htdocs”のフォルダに配置する。
 ブラウザからWebサーバに接続する。 

The end

Reactの基本1(開発環境~コンポーネントの作成とWebサーバへのデプロイ)

目次

1.Reactとは
(1)概要
 React(React.js)は、Facebookとコミュニティで開発されているユーザインタフェース構築のためのJavaScriptライブラリ。
(2)特徴
・JavaScript内に HTML の様な独自の記法(JSX)を使うことでプログラムが読みやすくなる。
・仮想 DOMにより差分のみの画面描画ができる。
・フロントの描画に使う見た目や機能をクラス及び関数コンポーネントで作り(export)、javascriptで読み込む(import)することでプログラムの保守がし易くなる。

2.HTMLページで部分的にReactの利用
 ここでは、Reactのライブラリを読み込み、ReactのReact.createElement()メソッドによるReact要素作成、ReactDOM.render()メソッドによるReact 要素とブラウザ上のDOMを接続してレンダリングする。
 React.createElement(HTML要素名, プロパティ, 子要素)の様式でReact要素を作成する。

(1)React.createElement()によるReact要素の作成
test1.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Simple React</title>
  </head>
  <body>
    <div id="root"></div>
    <script src="https://unpkg.com/react@latest/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@latest/umd/react-dom.development.js"></script>
    <script src="js/test1.js"></script>
  </body>
</html>

・最初の2つの<script>タグはReactを読み込むもので、3つ目の<script>タグはコンポーネントのコードを読み込むもの。
js/test1.js

var a = React.createElement('h1', { testname:'bar' }, "React TEST1 ")
ReactDOM.render(a, document.getElementById('root'))

・React.createElement()でReact要素を作成。
・ReactDOM.render()でReact要素をDOM ノードにレンダーする。

XAMPのApatchを起動し、httpd.confに記述している通りtest1.html、test1.jsファイルを”C:/xampp/htdocs”のフォルダに配置する。
httpd.conf

:
ServerName localhost:80
:
DocumentRoot "C:/xampp/htdocs"

ブラウザでtest.htmlファイルを開く

id=”root”の要素にReactで作った要素が入る

(2)JSXによるReact要素の作成
下記のルールで記述されたJSXによるスクリプト文はBabelによってJavaScript のReact要素に変換される。
・通常のHTMLタグは小文字で、ユーザー定義のReactコンポーネントは大文字始まりで書く。
・JSX 内で式として評価する箇所は { と } で囲む。
・JSX ではキャメルケースで記述する。キャメルケースでは helloWorld のように、先頭は小文字、単語の区切りで大文字とする)。
・JSX では全体をまとめる要素が必要で、全体を囲み、一つの要素にするという目的のために<React.Fragment> と </React.Fragment> で囲む。React.Fragment のタグは <>と</>という短縮形で書くこともできる。
test4.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Simple React using JSX</title>
  </head>
  <body>
    <div id="root"></div>
    <script src="https://unpkg.com/react@latest/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@latest/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
    <script type="text/babel" src="js/test4.js"></script>
  </body>
</html>

js/test4.js

var a = (
 <React.Fragment>
  <h1>Hello</h1>
  <h2>Hello</h2>
  <h3>Hello</h3>
 </React.Fragment>
)
ReactDOM.render(a, document.getElementById('root'))

3.Reactの開発環境
(1)ホストOS
・Windows 10 Pro
(2)仮想環境(VirtualBox)
 ・ゲストOS:CentOs8(Red Hat 64-bit)
(3)reactのインストール
 $ npm install -g create-react-app
(4)プロジェクトの作成
 $ create-react-app reactsample
 上記のコマンドを使うことで、package.jsonの作成、トランスコンパイラのBabel、バンドラーのWebpackの設定ができる。
 本コマンドを使うためにNodeバージョン:10.16以上、及び npmバージョン:5.6以上の環境が必要。
https://ja.reactjs.org/docs/create-a-new-react-app.html

(補足)

・トランスパイラ:
 Babelは、ECMAScript15以降のモダンなJavaScriptの構文や機能を活用して書かれたコードをそれ以前の古いJavaScriptコードに変換してくれるJavaScriptコンパイラやトランスパイラと呼ばれるツール。
 ECMAScript(エクマスクリプト)は、Ecma Internationalのもとで標準化手続きが行われているJavaScriptの規格。
・バンドラー
 リソース(HTML、JSX、CSS、JavaScript、PNGなどのファイル)を1つに束ねるツール。WebpackはNode.jsの環境とNode.jsのパッケージを管理するnpm(Node Package Manager)が必要。

「create-react-app」コマンドで下記のフォルダが作られる。
・フォルダ構成

reactsample
 |-README.md
 |-node_modules
 |-package-lock.json
 |-package.json
 |-public・・・HTML、画像ファイルなど
 |-src ・・・開発するソースコードを置く。.js、jsxファイル
 |-build ・・・デプロイファイル。htmlとjavascriptのファイルがひとまとまりになっ
       た本番用ファイル。
       npm run buildによって生成される  

(5)Reactサンプル画面の表示
「create-react-app」コマンドで作成されたフォルダで「npm start」コマンドを実行する。
 $ cd reactsample
 $ npm start

・仮想マシンのブラウザで下記urlに接続
http://127.0.0.1:3000

4.React のコンポーネント作成
 コンポーネントは UI の一部分となるビュー (View) を作る働きをするプログラムであり、再利用できる。
 コンポーネントはReact.Component から派生したクラスとして作成し、renderメソッドでビューとなる JSX を返す。
 「create-react-app」コマンドでReactの環境を作成した場合はエントリポイントはindex.html、index.jsに設定され、index.jsで使うコンポーネントを作成する。
(1)コンポーネントの作成
public/index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Simple React</title>
  </head>
  <body>
        <div id="root"></div>
  </body>
</html>

src/index.js

import React from 'react';
import ReactDOM from 'react-dom';
import Test5 from './Test5';

ReactDOM.render(
  <React.StrictMode>
    <Test5 />
  </React.StrictMode>,
  document.getElementById('root')
);

(解説)
・Create React App を含む JavaScript のバンドルツールを使った環境で React や ReactDOM のメソッドなどを使う場合、React 本体や ReactDOM を import 文を使って読み込む必要がある。
 import 名前(変数名) from ‘モジュールのパス’;
 import React, { Component } from ‘react’;
 但し、webpack を使用している場合、npm でインストールしたモジュールは webpack のモジュール解決の仕組みがあるので通常のローカルファイルとは異なりパスや拡張子を省略することができる。そのため import React from ‘react’ のようにパスや拡張子を省略して記述できる。
・ReactのレンダリングはReactDOM.render() メソッドを使う。
 ReactDOM.render(element, container[, callback])
  element:React 要素やコンポーネント
  container:描画先となる実際の DOM ノード(コンテナ)
  callback:オプションのコールバック関数
・StrictMode はアプリの潜在的な問題を検出するために追加されたコンポーネントで<StrictMode>・・・</StrictMode>で囲まれた子孫コンポーネントに対し、安全でないライフサイクルメソッドの使用などのチェックを行う。
・Create React App を使った環境ではエントリポイントの index.jsでコンポーネントなどを読み込んでレンダリングすることでアプリケーションを表示する。

src/Test5.js

// React の読み込み
import React from 'react';
 
//React.Component を継承して App という名前のコンポーネントを作成
class Test5 extends React.Component {
  render() {
    return <h1>HelloTest5 </h1>
  }
}
//index.js で使えるように App をエクスポート
export default Test5;

・JSXの記述で子要素にjavascript関数を使うときは関数名を{}で囲む。

(2)開発用サーバで実行
開発用サーバを起動し、仮想マシンのブラウザで下記urlに接続
$ npm start
http://127.0.0.1:3000

5.Webサーバにデプロイ
(1)ビルド
 $ npm run build

・buildフォルダが作成される。
build
|-index.html
|-static
|-js

(2)Webサーバにデプロイ
 XAMPのApatchを起動し、httpd.confに記述している通りindex.htmlファイルとstaticフォルダを”C:/xampp/htdocs”のフォルダに配置する。

The end

Node.jsの関連情報

目次

1.Nodejs
・Nodejs日本語ドキュメント
https://nodejs.org/ja/docs/

CentOS8にインストールする場合
(1)EPEL リポジトリ情報をインストールする
  # yum -y install epel-release
(2)Node.jsのインストール
  # yum -y install nodejs
(3)バージョン確認
  # node -v

2.NodejsのWebフレームワークExpress
・Express日本語ドキュメント
 http://expressjs.com/ja/
(1)インストール
①アプリケーションを作成するディレクトリーを作り、それを作業ディレクトリーとする。
 $ mkdir myapp
 $ cd myapp
②npm init コマンドを使用して、アプリケーション用の package.json ファイルを作成する。
 $ npm init
③expressのインストール
 Expressを 作業ディレクトリ(myapp)にインストールし、それを依存関係リストに保存する。
 $ npm install express –save
 Express を一時的にインストールし、それを依存関係リストに追加しないときは
 $ npm install express –save

(2)使い方

var express = require('express')
var app = express()

// GET method route
app.get('/', function (req, res) {
  res.send('GET request to the homepage')
})

// POST method route
app.post('/', function (req, res) {
  res.send('POST request to the homepage')
})

・app.get(”ルート・パス”,コールバック関数)
・レスポンスオブジェクト (res) のメソッドはルート・ハンドラーから呼び出される。主なメソッドとして
res.send():さまざまなタイプのレスポンスを送信する。
res.render():ビューテンプレートをレンダリングする。
res.end():レスポンスプロセスを終了する。

3.テンプレートエンジンEJS
・EJSの日本語ドキュメント
 https://ejs.co/
(1)インストール
 $ npm install ejs

(2)使い方
 app.js

//Expressオブジェクトの作成
var express = require("express");
var app = express();

// テンプレートエンジンの指定
app.set("view engine", "ejs");
//ルーティングとコールバック関数
app.get("/", function (req, res) {
    var data = {
        items: [
            {name: "<p>Java</p>"},
            {name: "<p>C</p>"},
            {name: "<p>Python</p>"}
        ]
    };
    // レンダリング
    res.render("./index.ejs", data);
});

./view/index.ejs

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>EJS TEST</title>
</head>
<body>
    <ul>
       <% for (let item of items) { %>
       <li><%- item.name %></li>
       <% } %>
    </ul>
</body>
</html>

・javascriptのコードを書くときは<%・・・%>
 HTMLの要素を出力するときは<%-・・・%>
 文字列を出力するときは<%=・・・%>
を使う。

(3)アプリケーション実行
$ node app.js
http://127.0.0.1:3000/

4.パッケージ管理ツールnpm
・npmの公式ページ
https://www.npmjs.com/

(1)npmについて
・npmのバージョン確認方法
 $ npm –version
 6.14.11
・npmのバージョンアップ
 $ npm update -g npm

(2)npmのコマンド
・パッケージのインストール
 $ npm install (パッケージ名)
 パスを指定する必要なく実行できるようにグローバルでインストールするときは「-g」オプションを付ける。
 $ npm install -g パッケージ名
・インストールされているパッケージの確認
 $ npm list
 グローバル環境にインストールされたパッケージも含めるときは「-g」オプションを付ける。
 $ npm -g list
・パッケージの最新版の確認
 $ npm outdated
・パッケージを最新版にアップデート
 $ npm update (パッケージ名)
・パッケージの検索
 $ npm search (パッケージ名)
・パッケージのアンインストール
 $ npm un パッケージ名
 $ npm uninstall (パッケージ名)
・パッケージの情報(package.json)の作成
 $ npm init

 npmを使ってパッケージをインストールする際に、「–save」オプションを付けることで「package.json」に必要な情報を自動的に追記できる。
 $ npm install –save (パッケージ名)
・package.jsonの内容に沿ってパッケージインストール
 $ npm install
 package.jsonの内容に沿って必要なパッケージを自動インストールする

The end