/public/images/astronotion/bcce5176-7b47-4d14-ae3e-c2673b845e95_screenshot-2022-10-04-070846.png
←back

共通コンポーネントはUIライブラリを!

2022/10/03

結論: UIライブラリを前提にしたデザインを用意すれば デザイン/開発の作業負荷が下がります

案件の前提条件

  • デザインが未FIXの状態で開発スタート
    • 各画面/機能のLo-Fi がいくらかFIXしている
    • 共通コンポーネントについてもHi-FiはFIXしていない
  • 開発期間は3ヶ月
    • 2022/01 に本格的にか初がスタート
    • デザインLo-FiがFixしている画面と、共通コンポーネントから着手
    • プロダクトオーナーは3月のリリースに向けて開発速度を最優先して欲しい考え
    • vue3案件

なんでUIライブラリを使いたいのか

  • 静的型付、scoped cssが普及したことにより、共通コンポーネントは1からつくらないことが主流になった。(たぶん)
  • UIライブラリも stylingの自由度が上がって、個別の変数の設定だけでもそれなりに styleを実現できるようになった。
    • styleはHi-FIがFixしてから当てればよいので、画面実装に入りやすい。
    • ライブラリによってはoverrideする必要があるものもあるけど、なんとかなる
  • webとして一般的なinterfaceが担保されている
    • スクラッチするとブレが出やすい。。
  • webとして一般的なstyleが担保されている
  • UIライブラリそのままを利用できるコンポーネントがあれば、デザインの作成を省ける

↓vue3でelement-plusをwrapした実装。interfaceはUIライブラリから取るだけ。styleもvariableを変えるだけで済むので、とても楽。

JavaScript
<template>
  <ElTag v-bind="props" class="sp-tag">
    <span class="sp-tag-inner" :style="{ width }">
      <slot></slot>
    </span>
  </ElTag>
</template>

<script lang="ts">
export default {
  name: "SpTag",
};
</script>

<script setup lang="ts">
import { defineProps, defineEmits } from "vue";
import { ElTag, tagProps, tagEmits } from "element-plus";

const props = defineProps({
  ...tagProps,
  width: {
    type: String,
    default: "",
  },
});

defineEmits({
  ...tagEmits,
});
</script>

<style scoped lang="scss">
/* stylelint-disable selector-class-pattern -- Reason for overwrite element-plus */
.sp-tag {
  --el-tag-bg-color: var(--white);
  --el-tag-border-color: var(--fill-border);
  --el-tag-text-color: var(--primary);
  --el-tag-hover-color: var(--fill-icon);
  --el-tag-border-radius: 0;
  --el-tag-font-size: 10px;
  font-weight: bold;
  transition: all 0.1s ease;

  ::v-deep(.el-tag__close) {
    transition: all 0.1s ease;
  }

  &:hover,
  &.hover {
    background-color: var(--el-tag-hover-color);

    ::v-deep(.el-tag__close) {
      background-color: var(--el-tag-text-color);
      color: var(--white);
    }
  }

  &:focus,
  &.focus {
    border-width: 2px;
  }

  &:active,
  &.active {
    border-color: var(--el-tag-border-color);
  }

  &:disabled,
  &.disabled {
    background-color: var(--fill-background);
    border-color: var(--fill-background);
  }
}

.sp-tag-inner {
  display: inline-block;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
</style>

UIライブラリを利用すれば複雑性の高いUIデザインに注力できる

  • 一般的ではないコンポーネントはデザイン/開発が1からつくる必要があるときはある
  • 100%UIライブラリによる共通化ができなくても、ある程度の省力化はできる
    • ↑の例でもフローの描画部分以外は共通化できてる

共通コンポーネントの話がでたら。。。

まずライブラリを探しましょう。

メジャーなやつ↓(他にもたくさんありますが個人的におすすめ)

←back