[解決済み] Vue.js 2で初期データとしてpropsを渡す正しい方法は何ですか?
質問
Vueコンポーネントにpropを渡したいのですが、これらのpropは将来そのコンポーネントの内部から変更されることを期待しています。したがって、それらはコンポーネントの初期化のためだけです。
私の
cars-list
Vueのコンポーネント要素で、初期プロパティを持つpropsを
single-car
:
// cars-list.vue
<script>
export default {
data: function() {
return {
cars: [
{
color: 'red',
maxSpeed: 200,
},
{
color: 'blue',
maxSpeed: 195,
},
]
}
},
}
</script>
<template>
<div>
<template v-for="car in cars">
<single-car :initial-properties="car"></single-car>
</template>
</div>
</template>
私が今やっている方法は、私の
single-car
コンポーネントの中で
this.initialProperties
を私の
this.data.properties
に
created()
の初期化フックです。そしてそれは動作し、リアクティブです。
// single-car.vue
<script>
export default {
data: function() {
return {
properties: {},
}
},
created: function(){
this.data.properties = this.initialProperties;
},
}
</script>
<template>
<div>Car is in {{properties.color}} and has a max speed of {{properties.maxSpeed}}</div>
</template>
しかし、私の問題は、それが正しい方法なのかどうか分からないということです。途中でトラブルが起きたりしないのでしょうか?それとも、もっといい方法があるのでしょうか?
どのように解決するのですか?
おかげさまで https://github.com/vuejs/vuejs.org/pull/567 私は今、答えを知っています。
方法1
初期propを直接データに渡します。更新されたドキュメントにある例のように。
props: ['initialCounter'],
data: function () {
return {
counter: this.initialCounter
}
}
ただし、渡されたpropが親コンポーネントの状態で使用されるオブジェクトや配列である場合、そのpropに変更を加えると親コンポーネントの状態も変更されることに注意してください。
警告 この方法は推奨されません。コンポーネントが予測不能になります。もし、子コンポーネントから親データを設定する必要がある場合は、Vuexのような状態管理を使用するか、"v-model"を使用してください。 https://vuejs.org/v2/guide/components.html#Using-v-model-on-Components
方法2
初期プロップがオブジェクトまたは配列で、子供の状態の変化が親の状態に伝搬しないようにしたい場合は、例えば、次のようにします。
Vue.util.extend
[1]を使ってプロップのコピーを作成し、代わりにこのように直接子供のデータを指定します。
props: ['initialCounter'],
data: function () {
return {
counter: Vue.util.extend({}, this.initialCounter)
}
}
方法3
spread演算子を使ってpropsをクローンすることもできます。詳しくはIgorの回答で。 https://stackoverflow.com/a/51911118/3143704
ただし、スプレッド演算子は古いブラウザではサポートされていないので、互換性を保つにはコードをトランスパイルする必要があります。
babel
.
脚注
[1] これはVueの内部ユーティリティであり、新しいバージョンで変更される可能性があることを念頭に置いてください。他の方法でコピーすることをお勧めします。 JavaScriptオブジェクトを正しくクローンする方法は? を参照してください。
私がそれをテストしていた私のフィドル。 https://jsfiddle.net/sm4kx7p9/3/
関連
-
[解決済み】ExpressJS - throw er Unhandled errorイベント
-
[解決済み】event.stopPropagationとevent.preventDefaultの違いは何ですか?
-
フロントエンド非同期(アシンク)ソリューション(全ソリューション)
-
[解決済み] Vue.js - ネストされたデータを適切に監視する方法
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] JavaScriptでメールアドレスを検証するのに最適な方法は何ですか?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] モバイル端末の検出にはどのような方法がありますか?
-
[解決済み] コールバック内で正しい `this` にアクセスする方法
-
[解決済み】 {this.props.children} に props を渡すには?}
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Vueがechartsのtooltipにクリックイベントを追加するケーススタディ
-
Vueの要素ツリーコントロールに破線を追加する説明
-
JSアレイループと効率解析の比較
-
Vueでルートネスティングを実装する例
-
vueにおけるfilterの適用シーンについて解説します。
-
[解決済み】ローカルファイルを開くことができません - Chrome: ローカルリソースの読み込みが許可されていない
-
[解決済み] 配列の結合時に未定義のプロパティ 'push' を読み込むことができない
-
[解決済み】ExpressJS : res.redirect()が期待通りに動かない?
-
[解決済み】 Uncaught TypeError : undefined のプロパティ 'replace' を読み取れない In Grid
-
jq は html ページとデータを動的に分割する。