2020/11/21 このエントリーをはてなブックマークに追加 はてなブックマーク - Vue 2のコンテナコンポーネントの書き方について個人的に模索中

Vue 2のコンテナコンポーネントの書き方について個人的に模索中

カテゴリ: ,


Vueのコンポーネント書き方について多少考えていることがあるので整理したい。






コンテナコンポーネントとプレゼンテーショナルコンポーネントに分けるで良いと思う https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0


  • Vue公式にも載ってるストアパターンを参考にするのが良さそう https://jp.vuejs.org/v2/guide/state-management.html
  • SFCになるべくロジックを書かない(script部分を別のtsファイルなどに移す)
  • cssなども別ファイルにしてimportする(style部分もよそに移す)
  • コンポーネントクラスのフィールドはコンポーネントState型にしそこに集約する
// コンテナコンポーネント
@Component({
  components: {
  }
})
export default class Hoge extends Vue {
    state: HogeState
}

  • templateは割とどうにもならないので半分諦める
  • 子コンポーネント(プレゼンテーショナルコンポーネント)ごとにpropsの型を定義してやるとtemplateのプロパティ記述は減る
    • ただし@Prop形式でのプロパティの細かいオプション指定はできなくなる
    • 個人的にはrequiredを子コンポーネントprops型にし、オプションのpropは個別のクラスフィールドとして@Propでマークすれば良いかみたいな気持ちになった
// プレゼンテーショナルコンポーネント
@Component({
  components: {
  }
})
export default class Child extends Vue {
    @Prop({required: true})
    props: ChildProps
    @Prop({default: false})
    childOption: boolean

    state: ChildState
}
  • props down events upをすると、コンテナコンポーネントにemitが増える。ロジックを外に逃したとしてもtemplateは膨らむ
    • 複数の子コンポーネント(プレゼンテーショナルコンポーネント)がいる場合、親となるコンポーネントでは各コンポーネントのイベントをフラットにemitで受け取るため、どのコンポーネントからのevent upか分かりにくい
    • 命名により区別するなど、チーム内のローカルルールで多少はさばけるかもしれないが辛そう
    • emitを子コンポーネント単位で一つだけとして、イベントタイプと変更後の値などをpayloadしてもらえば親側ではFacadeぽい動きが出来て良いのかもしれないが、やりすぎ感もある

  • 妥当なとこ探っていくのが良さそう
  • なんかアイデアとかペストプラクティスとか詳しい人教えて欲しい
  • 新規プロジェクトでやるならVue 3とtsxでやりたいかも



0 件のコメント:

コメントを投稿

GA