很多 vue 开发者都遇到过这样的情况:尝试给 <template> 标签添加 v-show,结果发现完全不起作用。页面上的内容照常显示,隐藏效果根本没有实现。
这其实不是 Vue 的 bug,而是对这两个功能的理解有误。
<template> 标签在最终渲染时不会生成真实的 dom 元素。它就像个透明的包装袋,只负责把里面的内容组织起来,自己却不会出现在页面上。
v-show 是通过控制元素的 css 显示属性来实现显隐效果的。比如:
<div v-show="isVisible">这个内容可以显示或隐藏</div>
当 isVisible 为 false 时,Vue 会给这个 div 添加 ,让它从页面上消失。但这里有个重要前提:v-show 必须作用在真实的 DOM 元素上。
让我们看个具体的例子:
<template v-show="false">
<p>这段文字应该隐藏</p>
<span>这个也应该隐藏</span>
</template>
你以为这两个元素会被隐藏?实际上在浏览器中看到的是:
<p>这段文字应该隐藏</p>
<span>这个也应该隐藏</span>
<template> 标签自己消失了,只留下它包裹的内容。v-show 指令因为找不到对应的 DOM 元素,自然就失效了。
需要条件渲染时,使用 v-if 配合 template
<template v-if="shouldRender">
<h2>页面标题</h2>
<p>详细内容描述</p>
<button>操作按钮</button>
</template>
当 shouldRender 为 false 时,整个模板内容都不会被渲染到页面上。这种情况下使用 <template> 是很合适的。
需要频繁切换显示状态时,使用 v-show 在真实元素上
<div v-show="isVisible">
<h2>页面标题</h2>
<p>详细内容描述</p>
<button>操作按钮</button>
</div>
由于 div 是真实的 DOM 元素,v-show 可以正常控制它的显示和隐藏。
假设我们需要一个带淡入淡出效果的弹窗:
<template>
<!-- 触发按钮 -->
<button @click="showModal = !showModal">
{{ showModal ? '关闭弹窗' : '打开弹窗' }}
</button>
<!-- 弹窗部分 -->
<transition name="fade">
<div v-show="showModal" class="modal-overlay">
<div class="modal-content">
<!-- 使用template组织内部结构 -->
<template>
<h3>系统通知</h3>
<p>你的操作已经成功提交,请等待处理结果。</p>
<button @click="showModal = false">确认关闭</button>
</template>
</div>
</div>
</transition>
</template>
<script>
export default {
data() {
return {
showModal: false
}
}
}
</script>
<style>
/* 过渡动画 */
.fade-enter-active, .fade-leave-active {
transition: opacity 0.3s ease;
}
.fade-enter-from, .fade-leave-to {
opacity: 0;
}
/* 弹窗样式 */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
}
.modal-content {
background: white;
padding: 24px;
border-radius: 8px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
max-width: 400px;
width: 90%;
}
</style>
这个例子中有几个关键点:
v-show 用在真实的 div 元素上
<template> 只用于组织弹窗内部的结构
过渡动画作用在真实的 DOM 元素上
选择 v-if 还是 v-show 还要考虑性能:
v-if 是真正的条件渲染,元素会被创建和销毁
v-show 只是切换 CSS 显示属性,元素始终存在于 DOM 中
如果元素需要频繁切换显示状态,使用 v-show 性能更好,因为避免了重复的创建和销毁过程。
如果元素很少显示,或者条件很少变化,使用 v-if 更合适,可以减少初始 DOM 节点的数量。
记住这几个要点:
<template> 是编译时的占位符,不会生成 DOM 元素
v-show 需要真实的 DOM 元素才能工作
需要条件渲染时,使用 v-if 配合 <template>
需要频繁切换显示时,使用 v-show 在真实元素上
根据具体场景选择合适的指令,兼顾功能和性能
理解这些概念后,你就能避免常见的误用,写出更合理的 Vue 代码。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!
下一代Jquery模板JsRender。jsrender官网号称简单直观、强大轻快可扩展。压缩体积也只有8.9kb,可以单独在浏览器或node中使用,也可以配合jQuery使用。
ejs是一个款简单的纯js模板引擎,其主要作用是:用来从JSON数据中生成HTML字符串。
artTemplate是腾讯开源的前端模板框架,和mustache,handlerbars类似,在web项目中可以很方便的使用,上手快,如果用过mustache,那么几乎可以快速切换到template框架上来。
们通过 vue 对象修改数据可以直接影响到 DOM 元素,但是,如果直接修改 DOM 元素,却不会影响到 vue 对象的数据;我们把这种现象称为 单向数据绑定 ;通过 v-model 指令展示表单数据,此时就完成了 双向数据绑定
客户最近有一个需求,大致的意思是提供一个 word文档,让其作为一个模板,在发送邮件的时候能够实现按照这个模板的样式和内容,替换其中 的一些字段,作为邮件的内容发给收件人
在开发项目中,后台管理因为面向群体相对比较固定,使用Bootstrap后台模板可以让后端开发很轻松的就展现给客户一个响应式的后台,节约前端开发的时间。下面给大家分享一下最值得拥有的免费Bootstrap后台管理模板
模板引擎负责组装数据,以另外一种形式或外观展现数据。浏览器中的页面是 Web 模板引擎最终的展现。无论你是否直接使用模板引擎,Web 模板一直都在,不在前端就在后端,它的出现甚至可以追溯到超文本标记语言 HTML 标准正式确立之前。
在软件开发中,研发效率永远是开发人员不断追求的主题之一。于公司而言,在竞争激烈的互联网行业中,产出得快和慢也许就决定着公司的生死存亡;于个人而言,效率高了就可以少加班,多出时间去提升自己、发展爱好、陪伴家人,工作、生活两不误
文本绑定,两个大括号,中间加上data里面的数据,message里面不仅可以是变量还可以是表达式;JS表达式(计算、拼接、只能是单个表达式)插入HTML代码(慎用!防止XSS攻击 ),我们可以直接在data里面定义html代码
在软件开发中,研发效率永远是开发人员不断追求的主题之一。于公司而言,在竞争激烈的互联网行业中,产出得快和慢也许就决定着公司的生死存亡;于个人而言,效率高了就可以少加班,多出时间去提升自己
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!