范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

灵光一闪!帮你使用Vue,搞定无法解决的动态挂载

  在一些特殊场景下,使用组件的时机无法确定,或者无法在Vue的template中确定要我们要使用的组件,这时就需要动态的挂载组件,或者使用运行时编译动态创建组件并挂载。
  今天我们将带大家从实际项目出发,看看在实际解决客户问题时,如何将组件进行动态挂载,并为大家展示一个完整的解决动态挂载问题过程。
  无法解决的"动态挂载"
  我们的电子表格控件SpreadJS在运行时,存在这样一个功能:当用户双击单元格会显示一个输入框用于编辑单元格的内容,用户可以根据需求按照自定义单元格类型的规范自定义输入框的形式,集成任何Form表单输入类型。
  这个输入框的创建销毁都是通过继承单元格类型对应方法实现的,因此这里就存在一个问题——这个动态的创建方式并不能简单在VUE template中配置,然后直接使用。
  而就在前不久,客户问然询问我:你家控件的自定义单元格是否支持Vue组件比如ElementUI 的AutoComplete?
  由于前面提到的这个问题:
  沉思许久,我认真给客户回复:"组件运行生命周期不一致,用不了",但又话锋一转,表示可以使用通用组件解决这个问题。
  问题呢,是顺利解决了。
  但是这个无奈的"用不了",却也成为我这几天午夜梦回跨不去的坎。
  后来,某天看Vue文档时,我想到App是运行时挂载到#app上的。从理论上来说,其他组件也应该能动态挂载到需要的Dom上,这样创建时机的问题不就解决了嘛! 正式开启动态挂载
  让我们继续查看文档,全局APIVue.extend( options ) 是通过extend创建的。Vue实例可以使用$mount方法直接挂载到DOM元素上——这正是我们需要的。 // 创建构造器 var Profile = Vue.extend({   template: "

{{firstName}} {{lastName}} aka {{alias}}",   data: function () {     return {       firstName: "Walter",       lastName: "White",       alias: "Heisenberg"     }   } }) // 创建 Profile 实例,并挂载到一个元素上。 new Profile().$mount("#mount-point")   按照SpreadJS 自定义单元格示例创建AutoCompleteCellType,并设置到单元格中:function AutoComplateCellType() { } AutoComplateCellType.prototype = new GC.Spread.Sheets.CellTypes.Base(); AutoComplateCellType.prototype.createEditorElement = function (context, cellWrapperElement) { //   cellWrapperElement.setAttribute("gcUIElement", "gcEditingInput");   cellWrapperElement.style.overflow = "visible"   let editorContext = document.createElement("p")   editorContext.setAttribute("gcUIElement", "gcEditingInput");   let editor = document.createElement("p");   // 自定义单元格中editorContext作为容器,需要在创建一个child用于挂载,不能直接挂载到editorContext上   editorContext.appendChild(editor);   return editorContext; } AutoComplateCellType.prototype.activateEditor = function (editorContext, cellStyle, cellRect, context) {     let width = cellRect.width > 180 ? cellRect.width : 180;     if (editorContext) {       // 创建构造器       var Profile = Vue.extend({         template: "

{{firstName}} {{lastName}} aka {{alias}}",         data: function () {           return {             firstName: "Walter",             lastName: "White",             alias: "Heisenberg"           }         }       })       // 创建 Profile 实例,并挂载到一个元素上。       new Profile().$mount(editorContext.firstChild);     } };   运行,双击进入编辑状态,结果却发现报错了   [Vue warn]: You are using the runtime-only build of Vue where the template compiler is not available. Either pre-compile the templates into render functions, or use the compiler-included build.   根据报错提示,此时我们有两种解决办法:开启runtimeCompiler,在vue.config.js中加入runtimeCompiler: true的配置,允许运行时编译,这样可以动态生成template,满足动态组件的需求提前编译模板仅动态挂载,autocomplete的组件是确定的,我们可以使用这种方法   新建AutoComplete.vue组件用于动态挂载,这样可以挂载编译好的组件。 import AutoComplate from "./AutoComplate.vue" AutoComplateCellType.prototype.activateEditor = function (editorContext, cellStyle, cellRect, context) {     let width = cellRect.width > 180 ? cellRect.width : 180;     if (editorContext) {       // 创建构造器       var Profile = Vue.extend(AutoComplate);       // 创建 Profile 实例,并挂载到一个元素上。       new Profile().$mount(editorContext.firstChild);     } };   双击进入编辑状态,看到组件中的内容   下一步,对于自定义单元格还需要设置和获取组件中的编辑内容,这时通过给组件添加props,同时在挂载时创建的VueComponent实例上直接获取到所有props内容,对应操作即可实现数据获取设置。   更新AutoComplate.vue,添加props,增加input用于编辑   通过this.vm存储VueComponent实例,在getEditorValue 和setEditorValue 方法中获取和给VUE组件设置Value。编辑结束,通过调用$destroy()方法销毁动态创建的组件。AutoComplateCellType.prototype.activateEditor = function (editorContext, cellStyle, cellRect, context) {     let width = cellRect.width > 180 ? cellRect.width : 180;     if (editorContext) {       // 创建构造器       var Profile = Vue.extend(MyInput);       // 创建 Profile 实例,并挂载到一个元素上。       this.vm = new Profile().$mount(editorContext.firstChild);     } };   AutoComplateCellType.prototype.getEditorValue = function (editorContext) {     // 设置组件默认值     if (this.vm) {         return this.vm.value;     } }; AutoComplateCellType.prototype.setEditorValue = function (editorContext, value) {     // 获取组件编辑后的值     if (editorContext) {       this.vm.value = value;     } }; AutoComplateCellType.prototype.deactivateEditor = function (editorContext, context) {     // 销毁组件     this.vm.$destroy();     this.vm = undefined; };   整个流程跑通了,下来只需要在AutoComplate.vue中,将input替换成ElementUI 的el- autocomplete并实现对应方法就好了。结果   让我们看看效果吧。   其实动态挂载并不是什么复杂操作,理解了Vue示例,通过vm来操作实例,灵活的运用动态挂载或者运行时编译的组件就不是什么难事了。   其实一切的解决方案就在Vue教程入门教程中,但是脚手架的使用和各种工具的使用让我们忘记了Vue的初心,反而把简单问题复杂化了。   今天的分享到这里就结束啦,后续还会为大家带来更多严肃和有趣的内容~   你有什么在开发中"忘记初心"的事情吗?   葡萄城微信号:"葡萄城社区"。


springboot中的这种策略模式运用绝对经验到你说明问题之前,我们先来看一个小的demo首先创建一个简单springbootweb项目,具体不表,主要代码如下publicinterfaceStrategyvoidprocess(华为Mate50全曝光,芯片成最大看点在近两年来,华为5G频繁登上热搜!华为手机一会有5G一会没有5G,让人捉摸不透,这互联网可算是被它玩透了!就在最近,又有大V菊厂影业Fans爆料曝出华为Mate50配置的相关信息!货运小程序专业开发货运小程序专业开发团队货运小程序开发,货运小程序搭建开发,货运软件搭建开发,货运小程序专业搭建开发,货运软件开发,货运小程序开发,货运软件搭建开发,货运软件定制开发。随着社会的发展,互联网时代的不断进步今年全球第一个超级独角兽诞生李想炮轰团车造车企服赛道大爆发股融易资讯今日话题今年全球第一个超级独角兽,估值1400亿本周,全球知名做市商CitadelSecurities宣布以220亿美元(约合1400亿人民币)估值完成了11。5亿美元融新能源布局持续深入五菱新能源公司战略融资开启新征程1月14日消息,港股上市公司五菱汽车(00305。HK)的母公司广西汽车集团与北京老鹰投资基金管理有限公司(以下简称老鹰基金)签署五菱新能源投资意向书,老鹰基金有意向向汽车集团下属山东建成全球首张5600公里确定性网络最大时延抖动仅14微秒近日,记者从山东省工业和信息化厅获悉,会同山东未来集团,采用中国工程院院士刘韵洁的确定性网络技术,山东未来网络研究院已建设完成覆盖16市的全球首张5600公里确定性网络。经中国信息选择华为还是苹果2021年刚刚过去,国内手机市场竞争依旧是硝烟四起,各大厂商都使出了浑身解数,推出各种旗舰机型来抢占市场。但不可否认的是,在目前真正的高端机市场上,却依旧还是苹果和华为。在华为和苹享受科技带来的乐趣,映美家用拉花机,给平凡生活增加更多的惊喜前言说起拉花打印机大家可能不太熟悉,但如果说拉花咖啡,相信很多朋友不仅知道而且还喝过。其实这种咖啡上的图案大多都是依靠拉花机实现的,尤其是一些复杂的定制图案,百分之百是通过拉花打印说实话,小米应该不会用华为鸿蒙,因为自己打造了一个鸿蒙自从华为鸿蒙系统(HarmonyOS)一发布,就有无数网友想知道,小米OV们这些国产手机厂商们会不会用鸿蒙系统。因为目前小米OV们等国产机合计占了全球50以上的智能手机市场份额,一65W快充12GB256GB,从2499跌至1799元,天玑1200旗舰售价亲民早些年,诸多搭载联发科芯片的手机都出现了散热不佳的问题,因此很多消费者在选购手机时,对搭载联发科的产品都比较抵触。事实上,随着最近几年的努力,联发科芯片的功耗和性能也是越来越好了,vivoNEX5将有一个7英寸的屏幕,5倍潜望镜相机去年我们听说关于vivoNEX5的谣言它本来应该有一个像APEX2020概念电话那样的屏下摄像头,据说它预定在2021年下半年发布。站哥指出目前的骁龙8gen1手机有相对较短的长焦
薪资倒挂现象越来越普遍,给新人更多钱,逼走老员工,这是要干啥长久以来,互联网企业备受全国瞩目,尤其是那些举足轻重的大厂,是很多人学习的先进典型,具有极强的职场风向标作用,比如大家都知道的35岁职场危机和996福报。最初都是国内互联网企业率先科蓝软件润和软件德润电子蓝思科技,谁是华为概念新龙头?华为概念,一直是这个市场上,关注度比较高的一个板块。但实际上,华为概念板块大火的时候是从2018年到2020年7月份。而从2020年7月至今,华为板块一直都处于一个横盘震荡的状态。个人信息保护法实施后,APP账号注销仍存在5大问题在是否可以顺利注销APP账号方面,50款APP中有20款APP存在不同程度问题,占总排查比例的40。这些问题包括未注明注销条件注销条件设置不合理无法通过APP直接注销等5大问题。这虽然摩托罗拉的性价比很高,但是销量却很低,这是为什么?12月15日10点开售,半小时了标配预约人数还没破万。首先无论是moto还是联想,牌子口碑都不行了,消费者不会为信任度低的品牌买单第二对手太强大了,性价比市场前有iqoo真我两个背iOS系统的每次更新,要不要升?感谢您的阅读!ios15。2系统更新了,iPhone12ProMax还能不能更新升级?ios系统的每次更新,到底要不要升级呢?我最近才更新到了ios15。2系统,这个系统是目前来说如果Redmi手机的销量超过了小米手机,小米高管们会是什么感受?目前小米10系列全力冲击高端,雷军已经把中低端的任务交付给了Redmi(红米)。如果红米手机的销量超过了小米手机,那也不奇怪,毕竟中低端手机本身就比售价昂贵的高端机更加容易走销量。全套智能家居方案最近收到很多朋友的提问,多半都是以下类型的问题这是XX公司给我提供的全套智能家居方案,我100平米房子,全套下来8万多,帮我看下怎么样啊?值不值?我想搞一套智能家居,与背景音乐系统家用小电器安全使用很重要本报讯(记者李岩)每到冬季就会有一些关于家用小电器使用不当导致家人生病或者受伤的新闻报道。家电维修业内人士金凤喜提示,冬季家中使用频率很高的一些小家电,正确使用和日常保养十分重要。人工智能释放巨大应用价值来源人民网人民日报核心阅读在科技日新月异的今天,人工智能正在快速融入人们的生产生活,极大提高工作效率,降低生产管理等成本,为经济社会发展不断注入新动能。从刷脸乘坐飞机到无人超市,从美国可能加大制裁中芯国际?外交部严重关切中国青年报客户端北京12月15日电(中青报中青网记者马子倩)当地时间12月14日,美国彭博社援引知情人士的话报道称,拜登政府正在考虑对中国最大的芯片制造商中芯国际实施更严厉制裁,包绿厂发福了Reno7Pro英雄联盟手游限定版,靠这几招圈粉最近后台很多网友私信咨询,让我给他们做一期OPPOReno7Pro英雄联盟手游限定版的开箱体验,大家都知道我一直都是很宠粉的,所以今天马上就来给大家安排一波。还没得买到OPPORe