在 Vue 3 中使用 jQuery 需要特别注意两者的设计理念差异(声明式 vs 命令式),以下是结合使用的完整指南:
一、为什么需要结合使用?
- 遗留项目迁移:旧系统使用 jQuery 插件需要逐步迁移
- 特殊需求:某些第三方库/插件依赖 jQuery
- DOM 精细操作:复杂动画、Canvas/SVG 操作等特殊场景
二、基础集成方式
npm install jquery
<script setup>
import { onMounted } from 'vue'
import $ from 'jquery'
onMounted(() => {
$('#myElement').hide() // DOM操作放在生命周期钩子中
})
</script>
三、常见场景及解决方案
场景 1:使用 jQuery 插件
<template>
<div ref="datepicker"></div>
</template>
<script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue'
import $ from 'jquery'
import 'jquery-datepicker'
const datepicker = ref(null)
let pickerInstance = null
onMounted(() => {
pickerInstance = $(datepicker.value).datepicker({
onSelect: (date) => {
// 与Vue数据同步
selectedDate.value = date
}
})
})
onBeforeUnmount(() => {
pickerInstance.datepicker('destroy') // 必须清理
})
</script>
场景 2:DOM 精细操作
<template>
<div ref="chartContainer"></div>
</template>
<script setup>
import { ref, onMounted, watch } from 'vue'
import $ from 'jquery'
const chartData = ref([...])
const chartContainer = ref(null)
function drawChart() {
// 使用jQuery进行复杂绘图
const $container = $(chartContainer.value)
$container.empty()
// ...复杂绘图逻辑
}
watch(chartData, () => {
drawChart()
})
onMounted(drawChart)
</script>
四、常见问题与解决方案
问题 1:响应式数据更新后 DOM 不同步
解决方案:
watch(data, (newVal) => {
nextTick(() => {
// DOM更新后执行jQuery操作
$('#element').doSomething()
})
}