ICSのVue.jsでサクッと動きをつける方法をv2対応にした

Vue.jsでサクッと動きをつける方法とは

先週ICS MEDIAにHTMLにちょい足しでできる! Vue.jsでサクッと動きをつける方法という記事が掲載されていた。

便利そうだったのでブックマークしたのだが、コードが最新のVue Composition APIとESモジュールが使われているためIE11には非対応だった。

私の場合IE11も含めてWebサイトを作成する機会がまだあり、最新のVue Composition APIのコードだと都合が悪いのでIE11対応のバージョン2のコードに直してみた。

ハンバーガーボタン

ハンバーガーボタンはisActiveのbooleanを変更するだけなのでdataにisActiveを入れて以下のように修正した。

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

ハンバーガーボタン サンプル

チェックボックスの状態を監視するフォーム

チェックボックスの状態監視はdataとcomputedに処理を記述。

new Vue({
  el: '#app',
  data: {
    checkBoxState: {
      react: false,
      angular: false,
      vuejs: false,
      jquery: false,
      nextjs: false,
      nuxtjs: false,
      typescript: false,
    }
  },
  computed: {
    isButtonEnabled() {
      return Object.values(this.checkBoxState).filter(button => button === true).length >= 3
    }
  }
})

チェックボックス サンプル

入場料の計算

入場料の計算もチェックボックスと同様にdataとcomputedに処理を記述。

new Vue({
  el: '#app',
  data: {
    ADULT_FEE: 1400,
    CHILD_FEE: 800,
    adult: 0,
    children: 0
  },
  computed: {
    entryFee() {
      return this.ADULT_FEE * this.adult + this.CHILD_FEE * this.children
    }
  }
})

入場料の計算 サンプル

ページネーションのある一覧

ページネーションのある一覧はdataとcomputedだけでなくmethodsとmountedも使用。

名前を変えている箇所があるが結果は元記事と同じ。

new Vue({
  el: '#app',
  data: {
    PER_PAGE: 4,
    books: null,
    page: 1,
    page_inc: 4,
    page_dec: 4,
  },
  methods: {
    pageIncrement() {
      if (this.page === this.maxLength) return
      this.page++
    },
    pageDecrement() {
      if (this.page === 1) return
      this.page--
    },
  },
  computed: {
    currentBooks() {
      return this.books.slice((this.page - 1) * this.PER_PAGE, this.page * this.PER_PAGE)
    },
    maxLength() {
      return Math.ceil(this.books.length / this.PER_PAGE)
    }
  },
  mounted() {
    (async () => {
      const result = await fetch("../assets/json/data.json")
      const jsonData = await result.json()
      this.books = jsonData
    })()
  }
})

ページネーションのある一覧 サンプル

マスタッシュ記法の非表示はv-cloakを使用

元記事ではsetup()でclass="hideBeforeVue"でマスタッシュ記法を非表示にしているが、一般的にはv-cloak属性を使用する。

<div id="app" v-cloak>

これを付ければCSSに[v-cloak] { visibility: hidden; }を追記しておけばマスタッシュ記法({{ book.name }}など)が見えてしまうことはない。

[v-cloak] {
  visibility: hidden;
}

ページネーションのある一覧 サンプルにはv-cloakを追加してあるのでマスタッシュ記法が見えることはない。

ページネーションのある一覧 サンプル