ホームページ  >  記事  >  ウェブフロントエンド  >  vue は prop の値を変更できますか?

vue は prop の値を変更できますか?

WBOY
WBOYオリジナル
2022-06-16 10:29:324520ブラウズ

vue の prop の値を直接変更することはできません。vue を直接変更すると、警告が生成され、プロパティ値を変更しても親コンポーネントに対応する変数を変更できません。ただし、子コンポーネントのイベントと親コンポーネントのリッスン このイベントは、親コンポーネントを変更する関数を実行し、子コンポーネントのイベントをリッスンして prop の値を変更することで双方向のデータ バインディングを実現します。

vue は prop の値を変更できますか?

このチュートリアルの動作環境: Windows 10 システム、Vue3 バージョン、Dell G3 コンピューター。

vue は prop の値を変更できます

Vue では、prop は親コンポーネントから子コンポーネントに渡される属性を受け入れることができますが、prop を変更することはできません。

プロップが強制的に変更されると、警告が表示されます

すべてのプロップは、親プロップと子プロップの間に一方向の下向きバインディングを形成します: 親プロップの更新により、下向きにサブコンポーネントに流れますが、その逆はありません。これにより、子コンポーネントが親コンポーネントの状態を誤って変更して、アプリケーションのデータ フローが理解しにくくなるのを防ぐことができます。

さらに、親コンポーネントが変更されるたびに、子コンポーネント内のすべてのプロパティが最新の値に更新されます。これは、子コンポーネント内の props を変更すべきではないことを意味します。これを行うと、Vue はブラウザーのコンソールに警告を発行します。

次の方法で属性値を直接変更してみてください

this.$props.modelValue = true;
Vue によって警告が表示されます

キー「modelValue」の設定操作が失敗しました: ターゲットは読み取り専用です.

また、この属性の値を変更しても、親コンポーネントに対応する変数を変更することはできません。これは、基本データ型にのみ適用されます。

JavaScript では、オブジェクトと配列は参照によって渡されるため、配列またはオブジェクト型プロパティの場合、

子コンポーネント内のオブジェクトまたは配列自体を変更すると、親コンポーネントの状態に影響を与えることに注意してください。また、Vue はそれについて # 警告することはできません。原則として、オブジェクトや配列を含むプロパティの変更は避けてください。変更すると一方向のデータ バインディングが無視され、予期しない結果が生じる可能性があります。

Vue3 Props Document

正しい変更方法は、子コンポーネント イベントをトリガーすることです。親コンポーネントはイベントをリッスンし、親コンポーネントを変更する関数を実行します。例として、model

を使用します。v-model 自体は、子コンポーネントに渡される modelValue 属性であり、update:modelValue イベントをリッスンします。 双方向データ バインディング を実現するため、このメソッドを使用して modelValue<pre class="brush:php;toolbar:false">this.$emit(&quot;update:modelValue&quot;, !this.$props.modelValue);</pre>

v-model

を変更することもできます。これは自動的にリッスンします。 update:modelValue イベント そして、modelValue を、イベントのトリガー時に渡されるパラメーター値 (つまり、$emit の 2 番目のパラメーター) に変更します。 イベントのトリガーとイベントの監視のこのデータ フロー モードは、すぐには有効になりません。次のコード

this.$emit("update:modelValue", !this.$props.modelValue);console.log(this.$props.modelValue);

を使用すると、コンソールへの出力がわかります。

modelValue

は、トリガー イベント - リッスン イベント モードで属性値を変更するのに時間がかかるため、元の値のままですが、代わりに次のコードを使用すると、出力が正常であることがわかります: <pre class="brush:php;toolbar:false">this.$emit(&quot;update:modelValue&quot;, !this.$props.modelValue);setTimeout(()=> {console.log(this.$props.modelValue)}, 1000)</pre>Practice

Vant は左側に

label

の入力ボックスしか実装していないので、右側に label の入力ボックスを実装したいと思います。この Vant3 フィールド ドキュメント

に基づいて、ここで発生する問題は、

label

を右に移動し、 の内容に従って幅を調整することに加えて、 label、Vant の <van-field />## です # と親の間のデータ フローを実装する必要があります が配置されるコンポーネント。 間違い

v-model

と一貫して使用できるようにするために、私は < を実行しました。 right-label-input /> の下に modelValue 属性を設定し、次に ## の v-model="modelValue" を設定します。 #<pre class="brush:php;toolbar:false">&lt;template&gt; &lt;van-field :placeholder=&quot;placeholder&quot; :name=&quot;name&quot; v-model=&quot;modelValue&quot; :disabled=&quot;disabled&quot;/&gt; &lt;/template&gt; &lt;script&gt; export default {     name: &quot;RightLabelInput&quot;,     props: {         modelValue: &quot;&quot;,     }, } &lt;/script&gt;</pre> 間違いなく、このアプローチは一方向データ フローの原則に違反します。VanField が変更されると、

modelValue 値に直接影響します。 RightLabelInputmodelValueRightLabelInput のプロパティであり、直接変更することはできません。 おそらく正しいアプローチ<pre class="brush:php;toolbar:false">&lt;template&gt;     &lt;van-field :placeholder=&quot;placeholder&quot; :name=&quot;name&quot; v-model=&quot;input&quot; :disabled=&quot;disabled&quot; /&gt; &lt;/template&gt; &lt;script&gt; export default {     name: &quot;RightLabelInput&quot;,     props: {         placeholder: &quot;&quot;,         name: &quot;&quot;,         label: &quot;&quot;,         modelValue: &quot;&quot;,         disabled: {             type: Boolean,             default: false         }     },     data() {         return {             input: this.modelValue, // 绑定到 data 的变量,防止直接修改 Props         }     },     beforeMount() {         this.input = this.modelValue     },     watch: {         input(newInput, oldInput) {             this.$emit(&quot;update:modelValue&quot;, newInput); // 监听 input 在修改时发起事件,由父组件修改 modelValue 的值         },         modelValue(newValue, oldValue) {             this.input = newValue;         }     } } &lt;/script&gt; &lt;style scoped&gt; &lt;/style&gt;</pre>

キーワード

: 一方向のデータ フロー

[関連する推奨事項: 「vue.js チュートリアル##」 #》]

以上がvue は prop の値を変更できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。