jquery项目引入vue和elementui遇到的坑

本文详述了如何在非Vue项目中正确引入Element UI,包括CSS样式问题、Vue实例挂载、form表单事件冲突、Vue methods中函数调用难题,以及解决方法,特别关注this指向问题。
  1. 切记引入elementui的前提是引入vue

常见出错的情况:
一个简单的html页面或者一个非vue的项目,想要引入elementui的组件,然后引入elementui之后发现样式不起作用,很大一个原因就是没有引入vue

为方便此处CDN引入

 <!--引入 element-ui 的样式,-->
  <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
  <!-- 必须先引入vue,  后使用element-ui -->
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
  <!-- 引入element 的组件库-->
  <script src="https://unpkg.com/element-ui/lib/index.js"></script>

引入vue之后发现还是不显示样式
原因:引入vue就得有挂载 所以vue的基本“样子”得有

此处简单举个el-button的例子

 <div id="app">
 		<el-button type="primary">主要按钮</el-button>
 </div>

<script>
	var app = new Vue({
	  el: '#app',
	  data: {
	    
	  }
	})
</scipt>
  1. form标签里边自己写的按钮点击后无法调用事件

是以下这么个情况

<form>
	 <input type="text" />
	 ..............不详细写了
	 <button @click="submit()">提交</button>
</form>

点击提交按钮发现submit()方法调用不了

网上百度了半天最终原因是:
一旦写了form标签,form会有本身的提交函数,自己写的提交就调用不了

解决方法:
把form自带的提交给他关了
可以单独在<script></script>中写个函数
也可简单一点直接写在form标签里

<form onsubmit="return false;">
.....
</form>
  1. vue的methods中函数调用不了

实际场景是这样:

//代码如下
<div id="app">	
		......
 		<el-button type="primary" @click=“method2()”>主要按钮</el-button>
 </div>

<script>
	var app = new Vue({
	  el: '#app',
	  data: {
	   
	  },
	  mounted(){
	  	this.method1() 
	  },
	  methods: {
			method1(){
				axios...发了一个请求 记得如果要用axios记得引入axios
			},//不详细写具体的方法了
			method2(){
				axios...发了一个请求 记得如果要用axios记得引入axios
			}
		}
	})
</scipt>


//实际情况
method2()的axios请求一直发不出去 但是method1() 就可以
说明后端接口没问题【这是当时在排错】

原因:????欢迎大家评论区指点
大概就是this的指向这些问题吧
解决方法:

//在created里边加两行
<script>
	var app = new Vue({
	  el: '#app',
	  data: {
	   
	  },
	  created(){
         var that = this
         window.method1 = that.method1
      },
	  mounted(){
	  	this.method1() 
	  },
	  methods: {
			method1(){
				axios...发了一个请求 记得如果要用axios记得引入axios
			},//不详细写具体的方法了
			method2(){
				axios...发了一个请求 记得如果要用axios记得引入axios
			}
		}
	})
</scipt>
  1. 类似3的问题 从后端请求回来的数据赋值给this.变量 页面无法渲染请求回来的数据

实际情况

//我们想要的效果是页面渲染出我们从后端请求回来的数据,但是实际上并没有
//代码如下
<div id="app">	
		{{message}}
 </div>

<script>
	var app = new Vue({
	  el: '#app',
	  data() {
         return{
              	message:""
           }
      },
      //或者这样写也行 这不影响
      data: {
		message:""
	  }
	  mounted(){
	  	this.method1() 
	  },
	  methods: {
		method1(){
			axios.get(url.then(res => {
              this.message = res.data
            })
		}
	})
</scipt>

解决方法:

methods: {
	method1(){
		var self = this //此处this是全局
		axios.get(url.then(res => {
        	self.message = res.data //此处我们定义的self是局部
        })
 }

 

有些问题在之前用vue-cli搭建的前端项目中从来没有遇到过的,以上是基于在html文件中CDN引入vue时候遇到的问题

博客内容写的不够严谨和不够清晰的地方欢迎大家指正交流。

<think> 我们使用jQuery控制ElementUI的气泡提示(Popover)时,需要注意ElementUI是基于Vue的组件库,通常不推荐直接使用jQuery操作Vue组件实例。但如果项目中有必要混合使用,可以通过以下思路实现: 1. **利用Vue组件实例引用**:在Vue组件内通过`ref`获取Popover实例,然后将其暴露给jQuery可以访问的全局对象(不推荐,可能引起混乱)。 2. **通过DOM事件触发**:ElementUI的Popover在触发元素上绑定事件,可以通过jQuery模拟事件触发(如click)来显示/隐藏,但需要Popover的`trigger`设置为非manual(如click、hover等)。 3. **修改数据驱动状态**:如果Popover使用`v-model`绑定变量,可以通过jQuery修改该变量(需要该变量在全局可访问,且Vue能监听到变化),但这种方法破坏了Vue的数据响应原则,不推荐。 考虑到以上限制,更推荐在Vue组件内部使用jQuery操作DOM来触发ElementUI Popover的内置方法(如果必须用jQuery的话),具体步骤如下: ### 步骤 1.Vue组件中,给Popover组件设置`ref`,然后通过`this.$refs`获取Popover实例,将其存储在一个全局可访问的地方(例如window对象),这样jQuery就可以通过这个全局引用来调用Popover的`show()``hide()`方法。 2.jQuery代码中,通过全局引用的Popover实例来调用方法。 ### 示例代码 ```vue <template> <div> <el-popover ref="myPopover" title="jQuery控制" placement="top" trigger="manual"> <p>通过jQuery控制显示隐藏</p> </el-popover> <button id="showBtn" class="el-button">显示Popover</button> <button id="hideBtn" class="el-button">隐藏Popover</button> </div> </template> <script> export default { mounted() { // 将Popover实例挂载到window对象,以便jQuery访问 window.myPopover = this.$refs.myPopover; // 使用jQuery绑定事件 $(document).ready(() => { // 显示Popover $('#showBtn').click(() => { if (window.myPopover) { window.myPopover.show(); } }); // 隐藏Popover $('#hideBtn').click(() => { if (window.myPopover) { window.myPopover.hide(); } }); }); }, beforeDestroy() { // 清除全局引用,避免内存泄漏 window.myPopover = null; } } </script> ``` ### 注意事项 - **不推荐混合使用**:VuejQuery的设计理念不同,混合使用容易导致状态管理混乱,应尽量避免。 - **作用域问题**:确保全局引用在组件销毁时清理,否则可能导致内存泄漏或方法调用错误。 - **组件渲染时机**:在`mounted`生命周期之后才能获取到`$refs`。 - **多次渲染问题**:如果组件多次渲染,`$refs`可能会改变,需要更新全局引用。 如果项目允许,建议完全使用Vue的方式控制Popover,而不是引入jQuery。 如果确实需要在非Vue环境中控制(例如在传统jQuery项目中使用ElementUI),则可以考虑将Popover单独封装在一个Vue实例中,并通过全局事件总线或自定义事件进行通信。 §§相关问题§§ 1.Vue项目中混用jQuery操作ElementUI组件会有哪些潜在风险性能问题? 2. 如何在避免全局污染的情况下实现jQueryVue组件实例的通信? 3. 除了通过全局变量暴露Vue组件实例,还有其他方法让jQuery控制ElementUI组件吗? 4.ElementUI中,如何确保动态创建的Popover组件在销毁时正确释放内存? </think> 通过jQuery控制ElementUI的气泡提示(Popover)需要特殊处理,因为ElementUI是基于Vue的组件库,直接使用jQuery操作DOM可能无法正确触发组件状态更新。以下是推荐的实现方法及注意事项: ### 核心实现方案 **最佳实践:通过Vue实例间接控制** 在Vue组件中暴露控制方法供jQuery调用: ```vue <div id="app"> <el-popover ref="jqPopover" title="jQuery控制" trigger="manual"> <p>通过jQuery控制的Popover内容</p> <div class="trigger-area"></div> </el-popover> </div> <script> new Vue({ el: '#app', methods: { showPopover() { this.$refs.jqPopover.show(); }, hidePopover() { this.$refs.jqPopover.hide(); } } }); </script> ``` **jQuery调用代码**: ```javascript // 显示Popover $('#show-btn').click(() => { const vm = document.querySelector('#app').__vue__; vm.showPopover(); }); // 隐藏Popover $('#close-btn').click(() => { const vm = document.querySelector('#app').__vue__; vm.hidePopover(); }); ``` ### 替代方案:纯jQuery操作(不推荐) ```html <body> <div class="el-popover" style="display: none;" id="custom-popover"> <p>纯jQuery创建的Popover</p> </div> <button id="manual-trigger">手动触发</button> </body> <script> $('#manual-trigger').click(function() { const $popover = $('#custom-popover'); // 显示逻辑 $popover.css({ display: 'block', position: 'absolute', top: $(this).offset().top + 30, left: $(this).offset().left }).addClass('el-popover'); // 隐藏逻辑(点击外部关闭) $(document).on('click.popover', (e) => { if(!$(e.target).closest('#custom-popover').length) { $popover.hide(); $(document).off('click.popover'); } }); }); </script> ``` ### 关键注意事项 1. **组件状态同步问题** jQuery无法直接更新Vue组件内部状态,必须通过Vue实例方法操作 2. **事件冲突处理** ElementUI自带的事件系统(如click-outside)可能与jQuery事件冲突 ```js // 在Vue组件中停止事件冒泡 methods: { handleClick(e) { e.stopPropagation(); } } ``` 3. **动态内容更新** 内容变化后需要手动更新位置: ```js // Vue组件内 this.$refs.jqPopover.updatePopper(); // 纯jQuery $popover.css('top', $(trigger).offset().top + 40)); ``` 4. **多实例管理** 为每个Popover指定唯一ID: ```vue <el-popover :ref="'popover-' + item.id"> ``` ### 兼容性解决方案 ```vue <template> <el-popover v-for="item in items" :key="item.id" :ref="'popover'+item.id"> <div class="jq-trigger" :data-id="item.id"></div> </el-popover> </template> <script> export default { mounted() { // 将控制方法绑定到DOM元素 $('.jq-trigger').each(function() { const id = $(this).data('id'); $(this).data('showFn', () => this.$refs['popover'+id][0].show()); }); } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值