电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Vue中原生template標簽失效如何解決

瀏覽:140日期:2022-06-01 16:34:46
目錄
  • 前言
  • 一、事件未綁定的原因
  • 二、如何處理原生template標簽

前言

需要原生Javascript + three.js的數據標注平臺加入Vue框架.

本來挺順利的, 我直接在mounted周期做了初始化, 然后剩下的操作還是交給JavaScript文件執行, 最后發現里面有很明顯的事件觸發問題.

一、事件未綁定的原因

找了整一天也沒找著這事件為什么觸發不了, 在這中間還把代碼簡化掉只留下事件觸發邏輯執行了好幾次.

第二天意識到原生代碼里的template可能有問題, 在原生環境中template標簽內部的東西是不會渲染出來的, 雖然解析器在加載頁面的時候確實會處理這部分代碼片段.

取自MDN:

將模板視為一個可存儲在文檔中以便后續使用的內容片段. 
雖然解析器在加載頁面時確實會處理 <template> 元素的內容,
但這樣做只是為了確保這些內容有效, 元素內容不會被渲染.

但是放到vue里(這里特指Vue2), 如果template標簽在Vue實例綁定的元素內部存在(即不是根元素外的那個template), 那么在DOM中該template的子元素是正常存在并顯示的, 我以前經常拿templatev-for容器.

然后聯想前面幾次結構簡化demo, 大概不是沒綁定而是綁錯了目標.

這個原生項目的HTML代碼很多, 所以作者做了一些優化, 在需要某個模塊的時候才將其appendChild加入DOM, 其余的時候這些模塊都被放在template標簽內, 而vue把這些東西都出來渲染了, 那么初始化的時候事件大概率就已經被綁到了template里面的那些代碼里, 等到這些模塊被appendChild的時候, 事件綁定已經結束了, 所以appendChild是將沒有事件綁定的DOM加到了正確位置.

我在控制臺把視口里的DOM都刪掉之后發現下面還有一層被擠出去的DOM, 那是有事件綁定的DOM.

的確是這樣.

二、如何處理原生template標簽

我是想把他appendChild這個優化留下來的, 我覺得在原生環境里能有這種封裝的思想挺好, 不過看起來不好辦…

我打算把原來那幾個模塊抽到組件里, 提前把組件寫到后面會插入到的位置, 然后用這種結構控制顯示隱藏:

<template v-if="isShow">
  <aaa></aaa>
</template>

這樣挺好的其實, 如果這個項目的結構再簡單一點我絕對會用組件方案的, 結果我發現我要傳回調函數, 傳4層干擾到3個很重要的類, 只是為了在合適的時機回調改變組件的狀態, 我覺得很糟糕.

而且, 如果后面會有…或者現在就有我沒有察覺到的需求是增加不定數量個這種模塊, 我把組件直接注冊到這里用就算是寫死了, 恐怕會不好改.

需要這種操作的組件有三個, 我想起來學后端渲染的時候給前端發的html模板, 那…能不能把這些html轉成字符串存到一個單獨的js文件, 然后在需要的地方導入后appendChild呢? 這樣對源代碼改動最小, 不用改appendChild, 也讓html文檔那邊更簡潔一些.

export const batchEditorToolsTemplate = `
  <div id="batch-editor-tools-wrapper">
	<div id="batch-editor-tools">
	  <div id="exit">退出</div>
	  <div id="prev">上一頁</div>
	  <div id="next">下一頁</div>
	  <div id="trajectory">軌跡</div>
	  <div id="auto-annotate">自動</div>
	  <div id="auto-annotate-translate-only">自動(無旋轉)</div>
	  <div id="interpolate">插值</div>
	  <div id="reload">重新加載</div>
	  <div id="finalize">定稿</div>
	</div>
  </div>
`

然后用這個工具函數把appendChild替換掉:

function analyseDomStr(str, target) { // dom字符串, 目標元素
  const template = document.createElement("template");
  template.innerHTML = str;
  target.appendChild(template.content);
}

這樣性能不如之前好, 不過——事件綁定看起來沒什么問題了.

本來想用Document.createDocumentFragment()API的, 所以初版就寫成這樣了:

function analyseDomStr(str, target) { // dom字符串, 目標元素
  const fragment = document.createDocumentFragment();
  const template = document.createElement("template");
  template.innerHTML = str;
  fragment.appendChild(template.content); // 此處還是要按照原生template的那套來的, 這個template不會被vue特殊解析
  target.appendChild(fragment);
}

很遺憾并不能直接使用innerHTMLDocumentFragment內寫入DOM, 仍舊需要appendChild來完成, 所以完全沒有必要創建DocumentFragment, 我認為這個API更加適合用于對頻繁DOM操作進行優化, 比如用戶點擊按鈕后就要插入100條tips, 那就更適合先使用這個API生成一個文檔內容分段, 然后把成品分段加入DOM.

這個初版和舊版也都是回流一次…

因為文檔片段存在于內存中, 并不在 DOM 樹中, 所以將子元素插入到文檔片段時不會引起頁面回流(對元素位置和幾何上的計算).
因此, 使用文檔片段通常會帶來更好的性能.

完全可以把:

const ul = document.querySelector("ul");
const li = document.createElement("li");
for (let i = 0; i < 100; i++) {
  ul.appendChild("li");
}

這種會引起頁面頻繁回流的寫法

改成

const ul = document.querySelector("ul");
const li = document.createElement("li");
const fragment = document.createDocumentFragment();
for (let i = 0; i < 100; i++) {
  fragment.appendChild("li");
}
ul.appendChild(fragment);

這樣頁面只會在fragmentappendChild后回流一次.

到此這篇關于Vue中原生template標簽失效如何解決的文章就介紹到這了,更多相關Vue template標簽失效內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: JavaScript
主站蜘蛛池模板: 东莞工厂厂房装修_无尘车间施工_钢结构工程安装-广东集景建筑装饰设计工程有限公司 | 2025世界机器人大会_IC China_半导体展_集成电路博览会_智能制造展览网 | 酵素生产厂家_酵素OEM_酵素加盟_酵素ODM_酵素原料厂家_厦门益力康 | 高铝砖-高铝耐火球-高铝耐火砖生产厂家-价格【荣盛耐材】 | 横河变送器-横河压力变送器-EJA变送器-EJA压力变送器-「泉蕴仪表」 | 济南品牌包装设计公司_济南VI标志设计公司_山东锐尚文化传播 | 衬塑设备,衬四氟设备,衬氟设备-淄博鲲鹏防腐设备有限公司 | 山东led显示屏,山东led全彩显示屏,山东LED小间距屏,临沂全彩电子屏-山东亚泰视讯传媒有限公司 | 机械立体车库租赁_立体停车设备出租_智能停车场厂家_春华起重 | 芜湖厨房设备_芜湖商用厨具_芜湖厨具设备-芜湖鑫环厨具有限公司 控显科技 - 工控一体机、工业显示器、工业平板电脑源头厂家 | 橡胶接头|可曲挠橡胶接头|橡胶软接头安装使用教程-上海松夏官方网站 | 标准件-非标紧固件-不锈钢螺栓-非标不锈钢螺丝-非标螺母厂家-三角牙锁紧自攻-南京宝宇标准件有限公司 | 通辽信息港 - 免费发布房产、招聘、求职、二手、商铺等信息 www.tlxxg.net | 大鼠骨髓内皮祖细胞-小鼠神经元-无锡欣润生物科技有限公司 | 福州时代广告制作装饰有限公司-福州广告公司广告牌制作,福州展厅文化墙广告设计, | 市政路灯_厂家-淄博信达电力科技有限公司 | 塑木弯曲试验机_铜带拉伸强度试验机_拉压力测试台-倾技百科 | 卓能JOINTLEAN端子连接器厂家-专业提供PCB接线端子|轨道式端子|重载连接器|欧式连接器等电气连接产品和服务 | SDG吸附剂,SDG酸气吸附剂,干式酸性气体吸收剂生产厂家,超过20年生产使用经验。 - 富莱尔环保设备公司(原名天津市武清县环保设备厂) | 筒瓦厂家-仿古瓦-寺庙-古建琉璃瓦-宜兴市古典园林建筑陶瓷厂有限公司 | 磁力加热搅拌器-多工位|大功率|数显恒温磁力搅拌器-司乐仪器官网 | 高低温试验箱-模拟高低温试验箱订制-北京普桑达仪器科技有限公司【官网】 | 气动隔膜泵-电动隔膜泵-循环热水泵-液下排污/螺杆/管道/化工泵「厂家」浙江绿邦 | 代写标书-专业代做标书-商业计划书代写「深圳卓越创兴公司」 | 申江储气罐厂家,储气罐批发价格,储气罐规格-上海申江压力容器有限公司(厂) | 考勤系统_考勤管理系统_网络考勤软件_政企|集团|工厂复杂考勤工时统计排班管理系统_天时考勤 | 清洁设备_洗地机/扫地机厂家_全自动洗地机_橙犀清洁设备官网 | 土壤肥料养分速测仪_测土配方施肥仪_土壤养分检测仪-杭州鸣辉科技有限公司 | 杭州门窗厂家_阳光房_包阳台安装电话-杭州窗猫铝合金门窗 | 茶楼装修设计_茶馆室内设计效果图_云臻轩茶楼装饰公司 | 外贸资讯网 - 洞悉全球贸易,把握市场先机 | 韦伯电梯有限公司| 东莞螺杆空压机_永磁变频空压机_节能空压机_空压机工厂批发_深圳螺杆空压机_广州螺杆空压机_东莞空压机_空压机批发_东莞空压机工厂批发_东莞市文颖设备科技有限公司 | 广州中央空调回收,二手中央空调回收,旧空调回收,制冷设备回收,冷气机组回收公司-广州益夫制冷设备回收公司 | 带式过滤机厂家_价格_型号规格参数-江西核威环保科技有限公司 | 济南电缆桥架|山东桥架-济南航丰实业有限公司 | 模具ERP_模具管理系统_模具mes_模具进度管理_东莞市精纬软件有限公司 | 进口便携式天平,外校_十万分之一分析天平,奥豪斯工业台秤,V2000防水秤-重庆珂偌德科技有限公司(www.crdkj.com) | 江苏齐宝进出口贸易有限公司 | 密封圈_泛塞封_格莱圈-[东莞市国昊密封圈科技有限公司]专注密封圈定制生产厂家 | 单锥双螺旋混合机_双螺旋锥形混合机-无锡新洋设备科技有限公司 |