日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

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

前言

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

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

一、事件未綁定的原因

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

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

取自MDN:

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

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

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

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

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

的確是這樣.

二、如何處理原生template標簽

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

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

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

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

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

需要這種操作的組件有三個, 我想起來學后端渲染的時候給前端發(fā)的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>
`

然后用這個工具函數(shù)把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內(nèi)寫入DOM, 仍舊需要appendChild來完成, 所以完全沒有必要創(chuàng)建DocumentFragment, 我認為這個API更加適合用于對頻繁DOM操作進行優(yōu)化, 比如用戶點擊按鈕后就要插入100條tips, 那就更適合先使用這個API生成一個文檔內(nèi)容分段, 然后把成品分段加入DOM.

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

因為文檔片段存在于內(nèi)存中, 并不在 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標簽失效內(nèi)容請搜索以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持!

標簽: JavaScript
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
成人午夜国产| 国产欧美欧美| 中文久久精品| 在线国产日韩| 国产精品视频一区视频二区| 欧美国产美女| 国精品一区二区三区| 一级成人国产| 国产一区二区三区久久| 日韩大片在线| 蜜桃视频一区二区三区在线观看| 国产免费久久| 久久精品国产亚洲夜色av网站| 日韩中文字幕av电影| 国产欧美一区二区色老头| 日韩影院二区| 亚洲精品在线二区| 精品三级久久久| 国产亚洲欧洲| 久久中文精品| 首页亚洲欧美制服丝腿| 老司机免费视频一区二区三区| 午夜影院欧美| 国产亚洲人成a在线v网站| 午夜精品成人av| 日本电影久久久| 色老板在线视频一区二区| 日韩国产精品久久久| 日韩在线不卡| 日韩超碰人人爽人人做人人添| 成人亚洲欧美| 日韩成人一级| 尹人成人综合网| 国产a亚洲精品| 综合亚洲自拍| 婷婷国产精品| 欧美激情网址| 亚洲精品麻豆| 视频一区中文| 国产精品1luya在线播放| 91高清一区| 国产一区二区精品福利地址| 亚洲免费成人av在线| 人在线成免费视频| 欧美日韩亚洲一区在线观看| 欧美在线影院| 日韩av专区| 欧美亚洲一级| 国产麻豆综合| 精精国产xxxx视频在线播放| 国产视频一区二| 国产视频一区欧美| 欧美日韩国产v| 麻豆精品一区二区综合av| 日韩精品一二三| 国产在线|日韩| 欧美国产亚洲精品| 亚洲精品自拍| 国产视频一区在线观看一区免费| 中文字幕在线视频久| 欧美日韩一区二区三区不卡视频 | 老鸭窝亚洲一区二区三区| 高清一区二区| 美女视频一区在线观看| 日本国产一区| 最新国产精品久久久| 亚洲深夜影院| 蜜桃成人av| 亚洲综合电影| 成人在线免费观看91| 麻豆一区在线| 国产精品白浆| 777久久精品| 婷婷成人av| 老鸭窝毛片一区二区三区| 久久九九国产| 伊人久久av| 91综合视频| 久久三级毛片| 久久超级碰碰| 国产精品主播| 日韩精品午夜视频| 日韩中文字幕1| 久久午夜精品| 蜜乳av另类精品一区二区| 国产一区成人| 视频在线观看91| 国产精品毛片| 国产一区91| 亚洲欧美日韩视频二区| 一区免费在线| 国产午夜久久| 日韩精品一二三| 亚洲ww精品| 日韩欧美2区| 欧美亚洲三级| 麻豆视频一区二区| 精品国产美女a久久9999| 麻豆国产精品| 福利在线免费视频| 国产高清不卡| 亚洲福利国产| 怡红院精品视频在线观看极品| 黄色亚洲免费| 玖玖玖国产精品| 亚洲免费中文| 亚洲精品少妇| 欧美日韩中出| 国产一区二区三区探花| 首页国产精品| 亚洲高清激情| 亚洲深夜av| 日韩在线观看中文字幕| 欧美日韩va| 久久99国产精品视频| 国产96在线亚洲| 91精品精品| 午夜在线视频观看日韩17c| 亚洲精品系列| 久久99久久人婷婷精品综合| www.九色在线| 欧美日韩国产传媒| 久久午夜视频| 国产美女亚洲精品7777| 国产成人精品一区二区免费看京 | 日韩中出av| 国产精久久久| 欧洲一区二区三区精品| 美女久久久久| 伊人国产精品| 国产精品夜夜夜| 狠狠久久伊人中文字幕| 日韩高清中文字幕一区二区| 99xxxx成人网| 欧美亚洲色图校园春色| 久久久久免费| 先锋影音久久久| 国产欧美一区二区精品久久久| 高清av一区| 国产一区成人| 国产精品mv在线观看| 日韩在线短视频| 亚洲视频二区| 精品成人18| av亚洲免费| 日本少妇一区二区| 日韩av二区| 亚洲人成在线影院| 麻豆91精品视频| 亚洲激情精品| 国产精品丝袜在线播放| 亚洲国产专区校园欧美| 日韩1区2区3区| 高清av不卡| 日韩在线成人| 999久久久精品国产| 日本麻豆一区二区三区视频| 国产v综合v| 日本不卡一二三区黄网| 国产精品99视频| 日韩专区一卡二卡| 91麻豆国产自产在线观看亚洲| 美女日韩在线中文字幕| 免费一级欧美片在线观看网站| 中文国产一区| 激情综合婷婷| 亚洲永久精品唐人导航网址| 麻豆成全视频免费观看在线看| 亚洲a级精品| 99久久婷婷| 国产精品免费精品自在线观看| 亚洲精品一二三区区别| 国产精品夜夜夜| 久久性天堂网| 久久青草久久| 青青青国产精品| 在线国产一区| 国产传媒在线| 欧美视频久久| av不卡在线看| 亚洲天堂资源| 国产精品免费99久久久| 视频一区中文字幕| 日本久久成人网| 精品一区视频| 日韩在线观看中文字幕| 久久精品国产www456c0m| 久久超级碰碰| 日韩欧美中文字幕一区二区三区| 在线成人动漫av| 欧美黑人巨大videos精品| 在线看片日韩| 婷婷综合在线| 亚洲午夜天堂| 久久精品国产在热久久| 日韩有吗在线观看| 亚洲综合欧美| 九九久久电影| 国产麻豆久久| 成人在线黄色|