サイトアイコン 上尾市のWEBプログラマーによるブログ

「これからはじめるVue.js実践入門」の感想・備忘録4

「これからはじめるVue.js実践入門」の感想・備忘録3の続き

コンポーネント(応用)

<component>要素

定義

components: {
  'my-component1': { template: `<p>my-component1</p>`, },
  'my-component2': { template: `<p>my-component2</p>`, },
},
data: { index: 1, },
created: function() {
  this.interval = setInterval(() => {
    this.index = (this.index % 2) + 1
  }, 1000)
},
beforeDestroy: function() { clearInterval(this.interval); }

呼び出し

<component v-bind:is="`my-component${index}`"></component>

使い方

自作のコンポーネントでのv-modelの利用

定義

'my-input': {
  template: `<p><input type="text" v-bind:value="value" v-on:input="$emit('input', $event.target.value)"></p>`,
  props: ['value'],
},

呼び出し

<my-input v-model="msg"></my-input>{{ msg }}
これは <my-input v-bind:value="msg" v-on:input="msg=$event"></my-input>{{ msg }} と同じ意味である。

input以外のイベントを使う場合

'my-input': {
  template: `<p><input type="text" v-bind:value="name" v-on:input="$emit('change', $event.target.value)"></p>`,
  props: ['name'],
  model: {
    prop: 'name',
    event: 'change'
  }
},

.syncs修飾子による複数プロパティの双方向バインディング

定義

'my-input': {
  template: `<p><input type="text" v-bind:value="text1" v-on:input="$emit('update:text1', $event.target.value)"></p>`,
  props: ['text1'],
},

呼び出し

<my-input v-bind:text1.sync="msg"></my-input>{{ msg }}

使い方

アニメーション

<transition></transition>の直下の要素(単一でなければならない)は、描画切り替え(v-if, f-show)のタイミングでアニメーション用のクラスが付与される。]

<transition>
  <div class="panel" v-show="flag">アニメーションテスト</div>
</transition>
<p><button v-on:click="flag=!flag">表示/非表示</button></p>

<style>
.panel {
  width: 300px;
  height: 200px;
  border: solid 1px #000;
  background-color: #00b8d4;
}
.v-enter,
.v-leave-to {
  height: 0px;
}
.v-enter-to,
.v-leave {
  height: 200px;
}
.v-enter-active,
.v-leave-active {
  transition: height 3s;
}
</style>

Element

Vue.jsで利用できるコンポーネントライブラリ。

<!-- 読み込み -->
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<script src="https://unpkg.com/element-ui@2.14.0/lib/umd/locale/ja.js"></script>

<!-- Button -->
<button type="button" class="el-button el-button--primary">Primary</button>
<!-- Transfer -->
<el-transfer v-model="transferValue" :data="transferData" v-bind:titles="['選択元', '選択先']"></el-transfer>

<script>
ELEMENT.locale(ELEMENT.lang.ja);
const app = new Vue({
  el: '#app',
  data: {
    transferValue: [],
    transferData: [{key: 1, label: 'りんご'}, {key: 2, label: 'みかん'}, {key: 3, label: 'ぶどう'}]
  },
})
</script>

ミックスイン

定義

const mixinTest = {
  mounted() {
    console.log(this.$data);
  },
}

コンポーネントへの適用

<script>
new Vue({
  el: '#app',
  components: {
    'my-mixin': {
      template: `<p>my-mixin</p>`,
      data() {
        return {
          hoge: 'hoge',
        }
      },
      mixins: [mixinTest],
    },
  }
});
</script>
モバイルバージョンを終了