vue の prop の値を直接変更することはできません。vue を直接変更すると、警告が生成され、プロパティ値を変更しても親コンポーネントに対応する変数を変更できません。ただし、子コンポーネントのイベントと親コンポーネントのリッスン このイベントは、親コンポーネントを変更する関数を実行し、子コンポーネントのイベントをリッスンして prop の値を変更することで双方向のデータ バインディングを実現します。
このチュートリアルの動作環境: Windows 10 システム、Vue3 バージョン、Dell G3 コンピューター。
Vue では、prop は親コンポーネントから子コンポーネントに渡される属性を受け入れることができますが、prop を変更することはできません。
プロップが強制的に変更されると、警告が表示されます
すべてのプロップは、親プロップと子プロップの間に一方向の下向きバインディングを形成します: 親プロップの更新により、下向きにサブコンポーネントに流れますが、その逆はありません。これにより、子コンポーネントが親コンポーネントの状態を誤って変更して、アプリケーションのデータ フローが理解しにくくなるのを防ぐことができます。
さらに、親コンポーネントが変更されるたびに、子コンポーネント内のすべてのプロパティが最新の値に更新されます。これは、子コンポーネント内の props を変更すべきではないことを意味します。これを行うと、Vue はブラウザーのコンソールに警告を発行します。 次の方法で属性値を直接変更してみてくださいthis.$props.modelValue = true;
キー「modelValue」の設定操作が失敗しました: ターゲットは読み取り専用です.また、この属性の値を変更しても、親コンポーネントに対応する変数を変更することはできません。これは、基本データ型にのみ適用されます。 JavaScript では、オブジェクトと配列は参照によって渡されるため、配列またはオブジェクト型プロパティの場合、
子コンポーネント内のオブジェクトまたは配列自体を変更すると、親コンポーネントの状態に影響を与えることに注意してください。また、Vue はそれについて # 警告することはできません。原則として、オブジェクトや配列を含むプロパティの変更は避けてください。変更すると一方向のデータ バインディングが無視され、予期しない結果が生じる可能性があります。
Vue3 Props Document正しい変更方法は、子コンポーネント イベントをトリガーすることです。親コンポーネントはイベントをリッスンし、親コンポーネントを変更する関数を実行します。例として、model を使用します。v-model
自体は、子コンポーネントに渡される modelValue
属性であり、update:modelValue
イベントをリッスンします。 双方向データ バインディング
を実現するため、このメソッドを使用して modelValue<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">this.$emit("update:modelValue", !this.$props.modelValue);</pre><div class="contentsignin">ログイン後にコピー</div></div>
を変更することもできます。これは自動的にリッスンします。 update:modelValue
イベント そして、modelValue
を、イベントのトリガー時に渡されるパラメーター値 (つまり、$emit の 2 番目のパラメーター) に変更します。 イベントのトリガーとイベントの監視のこのデータ フロー モードは、すぐには有効になりません。次のコード
this.$emit("update:modelValue", !this.$props.modelValue);console.log(this.$props.modelValue);
を使用すると、コンソールへの出力がわかります。
modelValue は、トリガー イベント - リッスン イベント モードで属性値を変更するのに時間がかかるため、元の値のままですが、代わりに次のコードを使用すると、出力が正常であることがわかります: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">this.$emit("update:modelValue", !this.$props.modelValue);setTimeout(()=> {console.log(this.$props.modelValue)}, 1000)</pre><div class="contentsignin">ログイン後にコピー</div></div>
Practice
の入力ボックスしか実装していないので、右側に label
の入力ボックスを実装したいと思います。この Vant3 フィールド ドキュメント
に基づいて、ここで発生する問題は、
label を右に移動し、 の内容に従って幅を調整することに加えて、 label
、Vant の <van-field />## です
# と親の間のデータ フローを実装する必要があります
が配置されるコンポーネント。
間違い
と一貫して使用できるようにするために、私は
< を実行しました。 right-label-input /> の下に
modelValue 属性を設定し、次に
v-model="modelValue"
を設定します。 #<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"><template>
<van-field :placeholder="placeholder" :name="name" v-model="modelValue" :disabled="disabled"/>
</template>
<script>
export default {
name: "RightLabelInput",
props: {
modelValue: "",
},
}
</script></pre><div class="contentsignin">ログイン後にコピー</div></div>
間違いなく、このアプローチは一方向データ フローの原則に違反します。VanField
が変更されると、
modelValue 値に直接影響します。 RightLabelInput
。modelValue
は RightLabelInput
のプロパティであり、直接変更することはできません。 おそらく正しいアプローチ
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"><template>
<van-field :placeholder="placeholder"
:name="name"
v-model="input"
:disabled="disabled"
/>
</template>
<script>
export default {
name: "RightLabelInput",
props: {
placeholder: "",
name: "",
label: "",
modelValue: "",
disabled: {
type: Boolean,
default: false
}
},
data() {
return {
input: this.modelValue, // 绑定到 data 的变量,防止直接修改 Props
}
},
beforeMount() {
this.input = this.modelValue
},
watch: {
input(newInput, oldInput) {
this.$emit("update:modelValue", newInput); // 监听 input 在修改时发起事件,由父组件修改 modelValue 的值
},
modelValue(newValue, oldValue) {
this.input = newValue;
}
}
}
</script>
<style scoped>
</style></pre><div class="contentsignin">ログイン後にコピー</div></div>
[関連する推奨事項: 「vue.js チュートリアル##」 #》]
以上がvue は prop の値を変更できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。