IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Vue动态添加Html片段,并绑定事件 -> 正文阅读

[JavaScript知识库]Vue动态添加Html片段,并绑定事件

场景

  • 需要动态添加一段Html到页面,但是新添加的页面@click等事件不执行

原因

  • vue的template中的内容是需要编译以后才能运行,绑定的事件也是编译后才可以运行,动态添加的Html实际上是加入了编译后的页面,所以里面的@click这种方法不会被再次编译,于是就不会执行

解决方案

  • 在网上查阅大量资料后发现有两种方法解决这个问题:
  • 1,把动态Html中的事件注册成全局事件,通过onclick调用全局事件;
  • 2,把动态Html中调用Vue.extend()编译一次,把编译后的代码插入页面;

开搞

注册全局事件方法

<template>
	<div>
		<div><button type="button" @click="addHtml">测试</button></div>
		<div id="testId"></div>
	</div>
</template>

<script>
	export default{
		created() {
			window.testBtn=this.testBtn//全局注册,不要打括号
		},
		methods:{
			/**
			 * 测试按钮方法:动态添加一段Html到页面中
			 */
			addHtml(){
				let html=`<button type="button" οnclick="testBtn(this)">按钮</button>`;
				$('#testId').append(html)
			},
			/**
			 * 动态Html中的事件
			 * @param {Object} obj 动态Html的dom
			 */
			testBtn(obj){
				console.log('this is testBtn',$(obj));
			}
		}
	}
</script>
  • window.testBtn=this.testBtn – 注册了一个全局事件,编译后可以直接调用,不要加括号
  • onclick="testBtn(this)" – 通过Html自带的onclick去调用全局方法,
  • 这种方法多半配合Jquery来使用,因为jquery可以通过获取dom来操作下面的步骤,this是控件本身
  • $(obj) – jquery包裹的对象,就是动态Html的dom,通过获取他可以做其他操作
  • 优点:事件较为简单
  • 缺点:实际上这是一种曲线救国,可以执行,但是Vue的this中的参数不能使用了,但可以配合jquery来操作下面的功能
  • jquery在vue中使用看上篇文章

编译Html再插入方法

<template>
	<!-- 把动态Html中调用`Vue.extend()`编译一次,把编译后的代码插入页面 -->
	<div>
		<div><button type="button" @click="addHtml">测试</button></div>
		<div id="testId"></div>
	</div>
</template>

<script>
	
	import Vue from 'vue/dist/vue.esm.js'//避免提示runtime模式不能使用
	
	export default{
		data(){
			return{
				d:'dddd'//初始挂载的参数
			}
		},
		methods:{
			/**
			 * 测试方法:添加动态Html到页面,每次都要编译一次
			 */
			addHtml(){
				let that=this
				const testComponent = Vue.extend({
				  template: `<div @click="open">{{text}},${that.d}</div>`,
				  data: function () {
				    return {
				      text: '默认值'
				    }
				  },
				  methods:{
					  open(){
						  this.text='修改值'
					  }
				  }
				})
				const extendComponent = new testComponent().$mount()
				// document.getElementById('testId').appendChild(extendComponent.$el)//原生js方法插入
				$('#testId').append(extendComponent.$el)//Jquery方法插入
			}
		}
	}
</script>
  • Vue.extend() – 使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象。https://cn.vuejs.org/v2/api/index.html#Vue-extend
  • $mount – 手动挂载 https://blog.csdn.net/github_37516320/article/details/78321391
  • addHtml中的方法就是把动态html手动编译,手动挂载,手动插入页面
  • ${that.d} – 使用初始挂载的参数
  • 优点:可以使用Vue的this,可以使用初始挂载的参数
  • 缺点:复杂度较高

参考资料

  • https://www.cnblogs.com/hentai-miao/p/10271652.html
  • https://cn.vuejs.org/v2/api/index.html#Vue-extend
  • https://blog.csdn.net/wxl1555/article/details/83187647
  • https://segmentfault.com/a/1190000020061342
  • https://blog.csdn.net/m0_38004177/article/details/106375775
  • https://www.jianshu.com/p/398825b673e7
  • https://blog.csdn.net/weixin_42633131/article/details/100579381?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-1.no_search_link&spm=1001.2101.3001.4242
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-13 11:21:44  更:2021-10-13 11:22:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 20:03:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码