【Vue x Firestore】Vue.jsにてセレクトボックスで初期表示文字のみ色を変える


#Vue.jsにてセレクトボックスで初期表示文字のみ色を変える

```html
          <modal
            class="modal-inner"
            v-scroll-lock="open"
            name="edit"
            :width="1100"
            :height="720"
            >
            <div class="modal-header flex">
              <h2 class="profile-tll flex">プロフィールを編集する</h2>
              <hr class="separate" />
            </div>
            <div class="modal-body">
              <div class="profile-inner flex">
                <div class="profile-contens flex">
                  <div class="profile-img-inner flex">
                    <img
                      :src="uploadedImage"
                      width="200"
                      height="200"
                      class="profile-img"
                      alt="プロフィール画像"
                    />
                    <button class="profile-txt profile-update" @click="update">
                      プロフィール画像を編集する
                    </button>
                  </div>
                  <div class="line"></div>
                  <div class="profile-items flex">
                    <div class="profile-contens flex">
                      <input
                        type="text"
                        class="profile-item"
                        placeholder="名前"
                        v-model="name"
                      />
                    </div>
                    <div class="profile-contens flex">
                      <select
                        class="profile-select"
                        v-model="sex"
                        :style="{ color: sex == '' ? 'gray' : 'white' }"
                      >
                        <option class="profile-item" value hidden>性別</option>
                        <option
                          v-for="sex in sexs"
                          :value="sex.name"
                          :key="sex.id"
                          class="profile-item"
                          style="color: white;"
                          >{{ sex.name }}</option
                        >
                      </select>
                    </div>

                    ~省略~

                  </div>
                  <button class="hide-btn flex" @click="hide">×</button>
                </div>
                    <button @click="updateBtn" class="update-btn flex">
                    更新
                </button>
              </div>
            </div>
          </modal>
```

```javascript
export default {
  data() {
    return {
      name: "",
      sex: "",
      sexs: [{ name: "男性" }, { name: "女性" }, { name: "その他" }],
      age: "",
      ages: [
        { name: "10際未満" },
        { name: "10 ~ 19歳" },
        { name: "20 ~ 29歳" },

         ~省略~

      ],
      access: "",
      accesses: [
        { name: "北海道" },
        { name: "青森県" },
        { name: "岩手県" },

         ~省略~

      ],
      profession: "",
      professions: [
        { name: "公務員" },
        { name: "会社員" },
        { name: "自営業" },

         ~省略~

      ],
      selfpr: "",
      genre: "",
      genres: [
        { id: 0, name: "ジャンル" },
        { id: 1, name: "アクション" },
        { id: 2, name: "ドラマ" },
        { id: 3, name: "恋愛" },

                 ~省略~

      ],
      favMovie: "",
      uploadedImage: "",
      profileData: {},
      //配列にしないようにする。
      open: false,
    };
  },
  components: {
    Header,
  },
  methods: {
    // updateBtn()が押下されたら、dbインスタンスを初期化して"posts"という名前のコレクションへの参照
    updateBtn() {
      firebase
        .firestore()
        .collection("users")
        .doc(this.$route.params.uid)
        //uidとは、routerの/mypage/:uidの[uid]のこと。
        //コレクションのusersを参照して、ドキュメントのuidを参照。
        .set(
          {
            name: this.name,
            sex: this.sex,
            age: this.age,
            access: this.access,
            selfpr: this.selfpr,
            profession: this.profession,
            uploadedImage: this.uploadedImage,
            genre: this.genre,
            favMovie: this.favMovie,
            time: firebase.firestore.FieldValue.serverTimestamp(),
            //サーバ側で値設定
          },
          { merge: true }
          //set()でmergeをtrueにすると、上書き。updetaと同様。
        );
      this.$swal({
        title: "内容確認",
        text: "この内容で投稿しますか？",
        icon: "info",
        buttons: true,
        dangerMode: true,
      }).then((willDelete) => {
        if (willDelete) {
          this.$swal("投稿しました。", {
            icon: "success",
          });
          this.$router.go({ path: `/mypage/${this.$route.params.uid}`, force: true });
          //プロフィール編集されたらページをリロード
        } else {
          this.$swal("キャンセルしました。");
        }
      });
},
```

三項演算子:style="{ color: sex == '' ? 'gray' : 'white' }"を利用して色分けを実装しています。

selectタグに対して、sexに値が入っていれば「白色」、空の場合は「グレー」としています。

```html
<select class="profile-select" v-model="sex" :style="{ color: sex == '' ? 'gray' : 'white' }">
```

初期表示させるoptionタグには、一番上には項目名を初期表示として表示してhiddenで選択中は表示しないようにしてます。

```html
<option class="profile-item" value hidden>性別</option>
```
選択するoptionタグには、リストを表示させてstyle="color: white;"を直接記述して色も持たせています。

```html
<option v-for="sex in sexs" :value="sex.name" :key="sex.id" class="profile-item" style="color: white;" >{{ sex.name }}</option>
```