ホームページ >ウェブフロントエンド >Vue.js >Vue スロットの変更を監視するにはどうすればよいですか?この裏技を試してみてください!
Vue のスロットの変更を監視するにはどうすればよいですか?以下の記事ではVueスロットの変化を監視する方法を紹介していますので、ご参考になれば幸いです。
最近、コンポーネントの内容 (スロット、サブコンポーネントなど) が変更されるたびにコンポーネントの状態を更新する必要があります。コンテキストとしては、入力の有効性ステータスを追跡するフォーム コンポーネントです。
以下のコード スニペットは Options
API 形式で書かれていますが、特に指定されている場合を除き、Vue2 と Vue2 の両方で使用できます。 [関連する推奨事項: vuejs ビデオ チュートリアル ]
フォームの状態を制御することから始め、状態に応じてクラスを変更し、次を使用します。 child content38b537b6886351ac721d89624ba185ca
Filling:
<template> <form :class="{ '--invalid': isInvalid }"> <slot /> </form> </template> <script> export default { data: () => ({ isInvalid: false, }), }; </script>
isInvalid
プロパティを更新するには、トリガーされたイベントを追加する必要があります。# を使用できます。 ##sumit イベントですが、私は
input イベントを使用することを好みます。
フォーム イベントには、フォーカス、ぼかし、入力、選択、変更、リセット、送信などの 7 つがあります。詳細については、この記事をご覧ください:フォームは
input イベントをトリガーしませんが、
"Event Delegate" を使用できます。リスナーを親要素 (ff9c23ada1bcecdd1a0fb5d5a0f18437) にアタッチし、イベントがその子要素 (
d5fd7aea971a85678ba271703566ebfd、
221f08282418e2996498697df914ce4e# #) で発生したときにアタッチします。 #、4750256ae76b6b9d804861d8f69e79d3
など) がトリガーされます。 このコンポーネントの
で input
イベントがトリガーされるたびに、フォームはイベントをキャプチャします。 <pre class="brush:php;toolbar:false;"><template>
<form :class="{ &#39;--invalid&#39;: isInvalid }" @input="validate">
<slot />
</form>
</template>
<script>
export default {
data: () => ({
isInvalid: false,
}),
methods: {
validate() {
// 验证逻辑
}
}
};
</script></pre>
検証ロジックは単純な場合もあれば、複雑な場合もあります。デモンストレーションの目的で、この記事では
API を使用して、HTML 検証属性に基づいてフォームが有効かどうかを確認する簡単な方法を使用します。
要素にアクセスするため。 refs
または $el
属性を使用できます。わかりやすくするために、この記事では $el
を使用します。 <pre class="brush:php;toolbar:false;"><template>
<form :class="{ &#39;--invalid&#39;: isInvalid }" @input="validate">
<slot />
</form>
</template>
<script>
export default {
data: () => ({
isInvalid: false,
}),
methods: {
validate() {
this.isInvalid = !this.$el.checkValidity()
}
}
};
</script></pre>
が DOM に追加されるとどうなりますか? たとえば、このフォーム コンポーネントを
と呼びます。アプリでは、コンテンツは次のとおりです: <pre class="brush:php;toolbar:false;">// App.vue
<template>
<MyForm>
<input
v-model="showInput"
id="toggle-name"
name="toggle-name"
type="checkbox"
/>
<label for="toggle-name">显示其它 input</label>
<template v-if="showInput">
<label for="name">Name:</label>
<input id="name" name="name" required />
</template>
<button type="submit">提交</button>
</MyForm>
</template>
<script>
import Form from "./components/form.vue";
export default {
name: "App",
components: {
MyForm: Form,
},
data: () => ({
showInput: false,
}),
};
</script></pre>
When
条件によって特定の input
を非表示にしたり表示したりすることをフォームが認識する必要があります。この場合、input
イベントや mounted
ライフサイクル フックだけでなく、フォームのコンテンツが変更されたときにその有効性を追跡することを考えます。そうしないと、誤った情報が表示される可能性があります。 Vue のライフサイクル フックに詳しい友人は、
を使用して変更を追跡することを考えるかもしれません。理論的には、これは素晴らしいことだと思います。実際には、無限ループが発生し、ブラウザがハングします。
API を使用することです。これは、DOM ツリーへの変更を監視する機能を提供するブラウザの組み込みメソッドです。この API は、ノードの追加または削除、属性の変更、またはテキスト コンテンツの変更を通知できます。 ネイティブメソッドなのでフレームワークに限定されません。
これを使用する場合は、まず
MutationObserver コンストラクターを使用して新しいオブザーバー インスタンスを作成し、このインスタンスのコールバック関数を指定します。このコールバックは、DOM が変更されるたびに呼び出されます。コールバック関数は 2 つのパラメーターを受け入れます。1 つ目は変更配列、2 つ目はオブザーバー インスタンスです。form
コンポーネントを次のように書き換えます: <pre class="brush:php;toolbar:false;"><template>
<form :class="{ &#39;--invalid&#39;: isInvalid }" @input="validate">
<slot />
</form>
</template>
<script>
export default {
data: () => ({
isInvalid: false,
}),
mounted() {
const observer = new MutationObserver(this.validate);
observer.observe(this.$el, {
childList: true,
subtree: true,
});
this.observer = observer;
},
methods: {
validate() {
this.isInvalid = !this.$el.checkValidity();
},
},
beforeUnmount() {
this.observer.disconnect();
},
};
</script>
<style scoped>
</style></pre>
ここでも # を使用する必要があります。 ##beforeUnmount
observer が切断され、割り当てられたメモリがすべてクリアされます。
最後に、アクセスしたいコンテンツのプラグイン スロットに
isInvalid
<template> <form :class="{ '--invalid': isInvalid }" @input="validate"> <slot v-bind="{ isInvalid }" /> </form> </template> <script> export default { data: () => ({ isInvalid: false, }), mounted() { const observer = new MutationObserver(this.validate); observer.observe(this.$el, { childList: true, subtree: true, }); this.observer = observer; }, methods: { validate() { this.isInvalid = !this.$el.checkValidity(); }, }, beforeUnmount() { this.observer.disconnect(); }, }; </script>
このセットアップを使用すると、フォーム コンポーネントに任意の数の
input を追加し、必要な条件付きレンダリング ロジックを追加できます。 input が HTML 検証属性を使用している限り、フォームは有効な状態であるかどうかを追跡します。
さらに、スコープ付きスロットを使用しているため、フォームの状態を親に提供し、親が有効性の変更に反応できるようにします。
App.vue
で、フォームが無効な場合に送信ボタンを「無効」にしたい場合は、次のように記述できます。<template> <MyForm> <template slot:default="form"> <label for="name">Name:</label> <input id="name" name="name" required> <button type="submit" :class="{ disabled: form.isInvalid }" > Submit </button> </template> </MyForm> </template>
nice~。
この記事があなたの将来の開発に役立つことを願っています。
(学習ビデオ共有: Web フロントエンド開発、基本プログラミング ビデオ)
以上がVue スロットの変更を監視するにはどうすればよいですか?この裏技を試してみてください!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。