yuheijotaki.com

フォーム入力バインディングを理解する その8

f:id:jotaki:20190212100544p:plain

何年か前に jQuery で作った type tester という簡易的なフォント(関連のスタイリング)のテスターツールを Vue.js で作ってみる。 その8

GitHub Pages: https://yuheijotaki.github.io/type-tester/
GitHub リポジトリ:https://github.com/yuheijotaki/type-tester


ツール、CSS のトグル表示

<template v-if=""> を ツールで使った場合、$emit してきた値がリセットされてしまうので CSS で表示/非表示にしました。
CSSの出力エリアはふつうに v-if を使いました。

App.vue(抜粋)

<template>
  <div class="tools">
    ...
  </div>
  <div class="container">
    <template v-if="displayCss">
      <pre>CSS: {{styleObject}}</pre>
    </template>
  </div>
  <ul class="toggle">
    <li class="toggle__button">
      <a class="toggle__anchor" href="javascript:void(0);" v-on:click="toggleTools">Tools toggle button</a>
    </li>
    <li class="toggle__button">
      <a class="toggle__anchor" href="javascript:void(0);" v-on:click="toggleCss">CSS toggle button</a>
    </li>
  </ul>
</template>

...
  data() {
    return {
      ...
      displayCss: false
      ...
    }
  },
  methods: {
    // CSSエリアのトグル表示
    toggleCss: function () {
      // `.css` クラスのトグル
      this.displayCss = !this.displayCss;
    },
    // ツールのトグル表示
    toggleTools: function () {
      // `.tools` クラスのトグル
      const tools = document.querySelector('.tools');
      tools.classList.toggle('js-tools-active');
      // `.container` クラスのトグル
      const container = document.querySelector('.container');
      container.classList.toggle('js-tools-active');
    },
...

styleObject を出力用に整形

Vue で格納した styleObject を実際のCSS指定のテキスト形式に変換する。
computed 処理内に下記の感じで実装 font-familly だけ "" が必要なので分岐する

App.vue(抜粋)

...
computed: {
  // styleObject を出力用に整形
  styleObjectFormatted: function () {
    const styleObject = this.styleObject; // styleObject を取得
    const styleObjectArray = []; // テキスト用の配列を用意
    // styleObject をループして新しい配列に key と value を格納
    Object.keys(styleObject).forEach(function (key) {
      if ( key === 'font-family' ) {
        // key が 'font-family' の場合は値に '""' をつける
        styleObjectArray.push(`${key}: "${styleObject[key]}";`);
      } else {
        styleObjectArray.push(`${key}: ${styleObject[key]};`);
      }
    });
    const styleObjectText = styleObjectArray.join('\n'); // 1行ずつ改行処理
    return styleObjectText;
  }
}
...

これで <pre>{{styleObjectFormatted}}</pre> とすれば

font-family: "Helvetica , Hiragino Kaku Gothic ProN";
color: #000000;
background: #ffffff;
font-size: 16px;
line-height: 1.7;
letter-spacing: 0em;
font-weight: normal;
text-align: left;
padding-top: 20px;
padding-bottom: 20px;
padding-left: 20px;
padding-right: 20px;
font-feature-settings: normal;
-webkit-font-smoothing: subpixel-antialiased;

がreturnされる

次やること

  • meta / OGP 設定
  • localStorage 使ってリロード対策
  • ラベルなど文字ゆれある所を直す
  • ファイル/コンポーネント名を直す
  • リファクタリング(アロー関数使える所使う)
  • 全体スタイリング