4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Vue.jsのハマりどころ

Posted at

概要

  • 2年くらいVueで開発してるけど、いまだにハマるポイントを書いた
  • これから、Vueの開発をする or している人の参考になればと思います!

propsされた値をv-modelに渡したい

  • 親から渡されたデータを子コンポーネントにv-modelで渡したい時
    • ついつい、v-modelでそのまま渡したくなるが、禁物
    • v-modelは、直接データを書き換えてしまう!
  • computedするパターンが多い
    • computedはget``setの両方を書ける
export default {
  props: {
    hoge: {
      type: String,
      required: true
    }
  },
  computed: {
    hogeHoge: {
      get() {
         return this.hoge
      },
      set(value) {
         this.$emit('input', value)
      }
    }
  }
}
  • また、上記コンポーネントを呼び出す際は以下のようにする
    • v-model="hoge"は以下のコードと同義のsyntax suger
      • :value="hoge" @input="hoge=value"
親コンポーネント
<template>
  <clild-component v-model="hoge" />
</template>

// 上記と同義
<template>
  <child-component :value="hoge" @input="hoge=value">
</template>

コンポーネントを再表示するとデータが消える or 不要なデータが残る

  • v-ifなどで表示を切り替えする際に、よく起きる
  • メモリ上にDOMが残っていることが原因
    • 一見、データが消えたように見えても、メモリ上では保持している
  • たいていの場合、created内で、propsされた値をDataに移し替えていることが多い

解決策として

  • propsされた値はコンポーネント中では持たず、computedで保持する
    • emitで更新する!
  • Vuexを使う
4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?