我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue中原生template标签失效如何解决

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue中原生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" class="non-selectable">
	<div id="batch-editor-tools">
	  <div class="menu-button" id="exit">退出</div>
	  <div class="menu-button" id="prev">上一页</div>
	  <div class="menu-button" id="next">下一页</div>
	  <div class="menu-button" id="trajectory">轨迹</div>
	  <div class="menu-button" id="auto-annotate">自动</div>
	  <div class="menu-button" id="auto-annotate-translate-only">自动(无旋转)</div>
	  <div class="menu-button" id="interpolate">插值</div>
	  <div class="menu-button" id="reload">重新加载</div>
	  <div class="menu-button" 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标签失效内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Vue中原生template标签失效如何解决

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Vue中原生template标签失效如何解决

这篇文章主要介绍了Vue中原生template标签失效如何解决,找了整一天也没找着这事件为什么触发不了,第二天意识到原生代码里的template可能有问题,在原生环境中template标签内部的东西是不会渲染出来的,虽然解析器在加载页面的时候确实会处理这部分代码片段
2023-02-22

Vue中原生template标签失效怎么解决

这篇“Vue中原生template标签失效怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue中原生template
2023-07-05

html 标签失效如何解决

本篇文章给大家分享的是有关html 标签失效如何解决,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前端字符串内HTML标签无效的处理方式1)将元素的innerText 赋值成
2023-06-15

vue中使用/deep/失效如何解决

这篇文章主要讲解了“vue中使用/deep/失效如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue中使用/deep/失效如何解决”吧!1. 若是没有使用像less, sass等这样
2023-07-04

vue热替换失效的原因是什么及如何解决

今天小编给大家分享一下vue热替换失效的原因是什么及如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.观察文件位置错
2023-07-04

如何解决vue的component标签渲染问题

这篇文章主要介绍了如何解决vue的component标签渲染问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。component标签渲染问题最近遇到一个问题,就是通过Load
2023-06-29

vsCode中vue文件无法提示html标签如何解决

本篇内容主要讲解“vsCode中vue文件无法提示html标签如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vsCode中vue文件无法提示html标签如何解决”吧!可视化界面配置如果我
2023-07-05

vue中resetFields重置初始值不生效如何解决

这篇文章主要介绍了vue中resetFields重置初始值不生效如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue中resetFields重置初始值不生效如何解决文章都会有所收获,下面我们一起来看看吧
2023-07-05

JS的鼠标监听mouseup鼠标抬起失效如何解决

本篇文章和大家了解一下JS的鼠标监听mouseup鼠标抬起失效如何解决。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。一、起因及解决由于很少使用除了click的监听事件,今天在使用mouseup时遇到一个坑,找了好久的bu
2023-08-03

react中modal不生效如何解决

这篇文章主要讲解了“react中modal不生效如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“react中modal不生效如何解决”吧!react中modal不生效的解决办法:1、将
2023-07-04

thinkphp中c方法失效如何解决

本篇内容主要讲解“thinkphp中c方法失效如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“thinkphp中c方法失效如何解决”吧!首先,我们需要了解一下什么是c方法。在ThinkPH
2023-07-05

vue配置代理vue.config.js后不生效如何解决

本文小编为大家详细介绍“vue配置代理vue.config.js后不生效如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue配置代理vue.config.js后不生效如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一
2023-07-05

idea中autowired注解不生效如何解决

当使用@Autowired注解时,如果发现注入不生效,可以尝试以下几种解决方案:1. 确保被注入的对象被正确声明为一个Bean。在被注入的对象上面加上@Component、@Service、@Repository或者其他Spring所提供的
2023-09-27

vue更改数组属性在页面中不生效如何解决

这篇文章主要介绍“vue更改数组属性在页面中不生效如何解决”,在日常操作中,相信很多人在vue更改数组属性在页面中不生效如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue更改数组属性在页面中不生效如
2023-07-04

win10中文输入法失效如何解决

如果在Windows 10中文输入法失效,可以尝试以下解决方法:1. 检查输入法设置:右下角语言栏中,点击输入法选项,确保中文输入法已经启用。如果没有启用,点击"选项",然后点击"添加一个输入法",选择中文输入法并启用它。2. 重新启动输入
2023-09-02

vue-cli在ie9+中无效如何解决

本文小编为大家详细介绍“vue-cli在ie9+中无效如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue-cli在ie9+中无效如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。ie9+报错vue
2023-07-04

Vue渲染失败的原因是什么及如何解决

本篇内容介绍了“Vue渲染失败的原因是什么及如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Vue渲染失败原因及解决在进行数据双向绑定
2023-06-30

编程热搜

目录