返回顶部
首页 > 资讯 > 精选 >Vue中原生template标签失效怎么解决
  • 694
分享到

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

2023-07-05 05:07:59 694人浏览 泡泡鱼
摘要

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

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

一、事件未绑定的原因

找了整一天也没找着这事件为什么触发不了, 在这中间还把代码简化掉只留下事件触发逻辑执行了好几次.

第二天意识到原生代码里的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这个优化留下来的, 我觉得在原生环境里能有这种封装的思想挺好, 不过看起来不好办&hellip;

我打算把原来那几个模块抽到组件里, 提前把组件写到后面会插入到的位置, 然后用这种结构控制显示隐藏:

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

这样挺好的其实, 如果这个项目的结构再简单一点我绝对会用组件方案的, 结果我发现我要传回调函数, 传4层干扰到3个很重要的类, 只是为了在合适的时机回调改变组件的状态, 我觉得很糟糕.

而且, 如果后面会有&hellip;或者现在就有我没有察觉到的需求是增加不定数量个这种模块, 我把组件直接注册到这里用就算是写死了, 恐怕会不好改.

需要这种操作的组件有三个, 我想起来学后端渲染的时候给前端发的html模板, 那&hellip;能不能把这些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);}

这样性能不如之前好, 不过&mdash;&mdash;事件绑定看起来没什么问题了.

本来想用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.

这个初版和旧版也都是回流一次&hellip;

因为文档片段存在于内存中, 并不在 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标签失效怎么解决”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: Vue中原生template标签失效怎么解决

本文链接: https://lsjlt.com/news/349660.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Vue中原生template标签失效怎么解决
    这篇“Vue中原生template标签失效怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue中原生template...
    99+
    2023-07-05
  • Vue中原生template标签失效如何解决
    目录前言一、事件未绑定的原因二、如何处理原生template标签前言 需要原生Javascript + three.js的数据标注平台加入Vue框架. 本来挺顺利的, 我直接在mou...
    99+
    2023-02-22
    Vue template标签失效 Vue原生template标签失效 Vue template标签
  • input标签οnpaste不生效怎么解决
    当使用``标签时,`onpaste`事件应该是生效的。如果它没有生效,可能有几种可能的原因和解决方法:1. 检查是否正确绑定了`on...
    99+
    2023-08-20
    input
  • html 标签失效如何解决
    本篇文章给大家分享的是有关html 标签失效如何解决,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前端字符串内HTML标签无效的处理方式1)将元素的innerText 赋值成 ...
    99+
    2023-06-15
  • vue-element-admin菜单标签失效怎么办
    小编给大家分享一下vue-element-admin菜单标签失效怎么办,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!设置菜单路由时,代码如下: {   pat...
    99+
    2024-04-02
  • html标签失效的解决方法
    这篇文章给大家分享的是有关html标签失效的解决方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。解决方法:1、将元素的innerText赋值成元素的innerHTML;2、类似回车的换行,使用“word-bre...
    99+
    2023-06-15
  • vue中template报错问题怎么解决
    这篇文章主要讲解了“vue中template报错问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue中template报错问题怎么解决”吧!template报错写这个纯粹是为了纪...
    99+
    2023-06-30
  • vue在mounted中window.onresize不生效怎么解决
    这篇文章主要介绍“vue在mounted中window.onresize不生效怎么解决”,在日常操作中,相信很多人在vue在mounted中window.onresize不生效怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作...
    99+
    2023-06-30
  • Vue.$set失效问题怎么解决
    这篇“Vue.$set失效问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue...
    99+
    2024-04-02
  • HTML中input type="reset"标签失效的原因是什么
    小编给大家分享一下HTML中input type="reset"标签失效的原因是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用<...
    99+
    2023-06-08
  • Vue.$set失效的原因以及解决方案
    这篇文章主要讲解了“Vue.$set失效的原因以及解决方案”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue.$set失效的原因以及解决方案”吧!偶然在项目中发现Vue.$set失效有这样...
    99+
    2023-06-20
  • Vue设置keepAlive不生效怎么解决
    本篇内容主要讲解“Vue设置keepAlive不生效怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue设置keepAlive不生效怎么解决”吧!设置keepAlive不生效如演示,Vu...
    99+
    2023-06-30
  • vue中window.addEventListener(‘scroll‘, xx)失效的解决
    目录window.addEventListener(‘scroll‘, xx)失效解决window.addEventListener scroll在移动端无效...
    99+
    2024-04-02
  • vue中@keyup.enter失效问题及解决
    目录@keyup.enter失效问题情况一(我遇到的情况)情况二(百度时了解到的)@keyup.enter和@blur触发两次和回车无效1.vue 对 input 绑定两个事件:回车...
    99+
    2022-11-13
    vue中@keyup.enter @keyup.enter失效 vue中@keyup.enter失效
  • android生成签名证书无效怎么解决
    如果你的Android生成签名证书无效,可以尝试以下解决办法:1. 确保你使用的是正确的密钥库文件(.keystore)和别名(al...
    99+
    2023-10-19
    android
  • vue-cli3+webpack热更新失效怎么解决
    这篇文章主要讲解了“vue-cli3+webpack热更新失效怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue-cli3+webpack热更新失效怎么解决”吧!vue-cli3+...
    99+
    2023-06-30
  • ASP.net中Attributes.Add()失效怎么解决
    ASP.NET中使用Attributes.Add()方法添加属性时,如果失效,可以尝试以下解决方法:1. 确保在正确的事件中添加属性...
    99+
    2023-08-08
    ASP.net
  • vue中使用/deep/失效如何解决
    这篇文章主要讲解了“vue中使用/deep/失效如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue中使用/deep/失效如何解决”吧! 若是没有使用像less, sass等这样的c...
    99+
    2023-07-04
  • JS的鼠标监听mouseup鼠标抬起失效原因及解决
    目录一、起因及解决解决:总结:一、起因及解决 由于很少使用除了click的监听事件,今天在使用mouseup时遇到一个坑,找了好久的bug。事情是这样的,我在写一个表情框,为了实现鼠...
    99+
    2023-05-20
    JS鼠标抬起失效 JS鼠标监听mouseup失效
  • vue热替换失效的原因是什么及如何解决
    今天小编给大家分享一下vue热替换失效的原因是什么及如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.观察文件位置错...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作