blog

Vue開発のヒント

propを更新することはビジネスにおいてとても一般的な要件ですが、子コンポーネントで直接propを修正することは許されません。なぜなら、それは一方向のデータフローの原則に適合しておらず、開発モードで警...

Mar 7, 2020 · 3 min. read
シェア

小道具の優雅な更新

プロップの更新はビジネスにおいて一般的な要件ですが、子コンポーネントで直接プロップを修正することは許されません。このやり方は一方向のデータフローの原則に従わないため、開発モードで警告が表示されます。したがって、ほとんどの人は$emitを通してカスタムイベントをトリガし、propを更新するために親コンポーネントでイベントによって渡された値を受け取ります。

child.vue

export defalut { props: { title: String }, methods: { changeTitle(){ this.$emit('change-title', 'hello') } } }

parent.vue

<child :title="title" @change-title="changeTitle"></child> export default { data(){ return { title: 'title' } }, methods: { changeTitle(title){ this.title = title } } }

この方法に問題はありませんし、私もよくこの方法でプロップを更新します。その場合、syncモディファイアはこれを非常に簡単にします。

parent.vue

<child :title.sync="title"></child> export defalut { props: { title: String }, methods: { changeTitle(){ this.$emit('update:title', 'hello') } } }

バインディングプロパティに.syncを追加するだけで、子コンポーネントの中からpropを更新するupdate:property nameがトリガーされます。

provide/inject

export default { provide() { return { app: this } } }

child.vue

export default { inject: ['app'], created() { console.log(this.app) // App.vue } }

バージョン2.5.0+では、デフォルト値を設定することでオプションにすることができます。

export default { inject: { app: { default: () => ({}) } }, created() { console.log(this.app) } }

インジェクト・プロパティの名前を変更したい場合、そのソースを示すために from を使用することができます:

export default { inject: { myApp: { // from変異の値はprovideプロパティの名前と同じである。 from: 'app', default: () => ({}) } }, created() { console.log(this.myApp) } }

provideとinjectは、主に高レベルのプラグイン/コンポーネント・ライブラリを開発する際に使用されることに注意することが重要です。通常のアプリケーションコードでは推奨されません。しかし、役に立つ場合もあります。

小さなステート・マネージャー

大規模なプロジェクトのデータ状態は複雑で、通常はvuexを使って管理されます。しかし、小規模なプロジェクトや単純な状態のプロジェクトでは、いくつかの状態を管理するためだけにライブラリを導入するのは少し扱いにくいです。バージョン2.6.0以降では、新しいVue.observableが、オブジェクトをレスポンシブデータにすることで、この厄介な問題を解決するのに役立ちます:

// store.js import Vue from 'vue' export const state = Vue.observable({ count: 0 })

ご利用ください:

<div @click="setCount">{{ count }}</div> import {state} from '../store.js' export default { computed: { count() { return state.count } }, methods: {

もちろん、ステートを変更するメソッドを再利用するように変異をカスタマイズすることもできます:

import Vue from 'vue' export const state = Vue.observable({ count: 0 }) export const mutations = { SET_COUNT(payload) { if (payload > 0) { state.count = payload } } }

ご利用ください:

import {state, mutations} from '../store.js' export default { computed: { count() { return state.count } }, methods: { setCount() { mutations.SET_COUNT(100) } } }

Read next

GoFデザインパターン|ブリッジ・パターン

ブリッジング・パターンは、抽象化と実装を切り離し、両者が独立して変化することを可能にするために使われます。このタイプのデザイン・パターンは構造的なパターンで、両者の間に橋渡しの構造を提供することによって、抽象化と実現を切り離します。 システムが複数の観点から分類でき、それぞれの分類が変化する可能性がある場合、必要なことは、これらの複数の観点が独立して変化できるように分離することです。

Mar 7, 2020 · 4 min read