Vue では、多くの場合、要素をページに動的に追加する必要があります。ただし、これらの動的に追加された要素のクリック イベントが機能しないことがあります。これはなぜですか?この記事ではその理由と解決策を紹介します。
1. 理由
まず、動的に追加された要素のクリック イベントが機能しない理由を理解しましょう。これは、Vue がページの読み込みプロセス中に既存の要素を監視するためで、クリック イベントが発生すると、Vue インスタンスの対応するメソッドがトリガーされます。ただし、要素を動的に追加する場合、Vue はこれらの要素にリスナーを自動的に追加しないため、クリック イベントは無効になります。
2. 解決策
原因が明らかになったので、この問題をどのように解決すればよいでしょうか?
Vue には、親要素のイベントをリッスンできるイベント委任メカニズムがあり、子要素がクリックされるとイベントが送信されます。オブジェクトの target 属性は、クリックされた特定の要素を決定するために使用されます。このメカニズムを使用すると、動的に追加された要素に対する無効なクリック イベントの問題を解決できます。
たとえば、Vue コンポーネントでは次のように記述できます:
<template> <div class="parent" @click="handleClick"> <div class="dynamic-element" v-for="item in list" :key="item.id">{{item.name}}</div> </div> </template> <script> export default { data() { return { list: [ {id: 1, name: '元素1'}, {id: 2, name: '元素2'}, {id: 3, name: '元素3'}, ] } }, methods: { handleClick(e) { if (e.target.classList.contains('dynamic-element')) { console.log(e.target.innerText) } } } } </script>
上記のコードでは、親要素 <div class="parent"> 内にあります。 ; クリック イベントは
で監視されており、子要素 <div class="dynamic-element">
がクリックされると、handleClick
メソッドがトリガーされます。 handleClick
メソッドでは、イベント オブジェクトの target
属性を使用して、どのサブ要素がクリックされたかを判断できます。
この方法では Vue インスタンスにリスナーを一度追加する必要があるため、パフォーマンスの問題が発生する可能性があります。要素を頻繁に動的に追加する必要がある場合、この方法では高いパフォーマンスのオーバーヘッドが発生する可能性があります。
もう 1 つの解決策は、Vue のモディファイアです。 Vue の修飾子を使用して、動的に追加された要素にイベントをバインドできます。
<template> <div> <div class="dynamic-element" v-for="item in list" :key="item.id" @click="handleClick">{{item.name}}</div> </div> </template> <script> export default { data() { return { list: [ {id: 1, name: '元素1'}, {id: 2, name: '元素2'}, {id: 3, name: '元素3'}, ] } }, methods: { handleClick() { console.log('点击了动态元素') } } } </script>
上記のコードでは、@click
イベントを <div class="dynamic-element">
要素にバインドし、## を呼び出しました。 #handleClick メソッド。要素を動的に追加するときに Vue の応答メカニズムを使用しているため、新しい要素を追加すると、
@click イベントが新しい要素に自動的にバインドされます。
以上がVue が機能しない要素クリック イベントを動的に追加した場合はどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。