DataTable の行にリンク/ボタンを追加して、クリックすると vue ルートに移動しようとしています。もちろん、href="/item/${id}"
を含む単純な <a>
リンクを追加することもできます。ただし、これによりルーターがバイパスされ、ページ全体がリロードされます
私は 2 つの解決策を思いつきました。どちらも onclick
を設定してコードを実行することに依存しています。
route1
では、vueRoute
という関数を window
オブジェクトにアタッチします。これは、vue メソッド への単なるコールバックです。 Route1
への参照。この関数はどこからでも呼び出せるようになりました
route2
で、onclick
で CustomEvent
をトリガーし、route2# によってトリガーされるイベント リスナーを設定します。 ## vue メソッドが処理します
リーリー
実際の例はここにあります: https://stackblitz.com/edit/datatables-net-vue3-simple-mgdhf1?file=src/components/ListView.vue
編集: 私が実際に行ったことは、DataTables よりも Vue でうまく機能するヘッドレス テーブル コンポーネント (TanStack) に切り替えることでした。ただし、DataTables を使用する必要がある場合は、以下の @Damzaky と @Moritz Ringler によって投稿されたソリューションが機能します。
P粉5881526362024-03-28 17:27:38
これが最良の解決策であるとは言いませんが、私の意見では、私の知る限り、本当の「最良」の解決策はありません。データテーブルは jQuery を使用しており、ここでは vue を使用しているためです (DOM コントロールは非常にフレンドリーです) )矛盾しています)。簡単に検索した後、方法が見つかりませんでした
データテーブルの render
プロパティ内で vue コンポーネントをレンダリングします。
したがって、私のアイデアは異なります。 render 関数を簡素化し、drawCallback
を使用してイベント リスナーを追加し、イベント デリゲートを使用してリスナーをアタッチします。
したがって、各リンクに data-item-id
を追加し、親のクリック イベントを使用してルーター プッシュ (イベント委任) を実行します。これが最良の答えではないことは承知していますが、もしかしたらこれもあなたにとっての別の選択肢かもしれません。
これ 興味があれば、これはフォークされたサンドボックスです。
P粉1342887942024-03-28 16:25:12
DataTable オブジェクトに @click
ハンドラーを設定できます:
イベントは通常のクリック イベントであるため、識別可能な ID データセット属性が必要です:
リーリークリック ハンドラーは、ID が取得できること、およびクリックがリンクからのものであることを確認するだけで済みます。 リーリー
更新されたこれは驚くべきことではありません。これが jQuery の仕組みです。データ、ビュー、動作は本質的にリンクされていませんが、適切と思われる方法でそれらを接続できます。 jQuery ではセル クリック イベントを自分で記述するか、存在しないため、利用できるセル クリック イベントがありません。
jQuery でハンドラーを設定する最も効率的な方法は、ターゲット フィルターを使用してテーブルにイベントを設定することです:
リーリー
利点は次のとおりです:
したがって、コード サイズ (保守性) とパフォーマンスの両方の点で、これが Vue で動作させる最も効率的な方法だと思います。
DataTable では jQuery がグローバルにアクセスできる必要があるため、Vue コンポーネントでも使用でき、指定された jQuery ステートメントを
mounted フックに置くことができることに注意してください。コールバックで Vue ルーターにアクセスします。したがって、ルーターをグローバル スコープに入れて jQuery 側で使用する代わりに、Vue 側にすでに存在するオブジェクトを使用できます。
それでも、Vue コードに jQuery を混ぜる必要はないので、私はそれを避けて、上記の Vue のみのソリューションを使用します。