Vue3.x基础-4.v-if、v-show、v-for、v-once等指令


前言

Vue指令一般指的是带有v-前缀的特殊属性,除v-for 和 v-on以外指令属性的值预期是单个 JavaScript 表达式。指令根据其所绑定的值,响应式地作用于相应的DOM元素。

一、v-if

v-if是一个用于控制DOM是否渲染的指令,如果所绑定的值或者表达式成立即渲染相应DOM模块,反之则不渲染。

<span v-if="sign">666</span> // 如果data中的sign为true则渲染该span标签

使用v-if控制DOM元素会反复操作DOM,引起重绘重排,在一些经常需要切换显示隐藏的业务场景建议使用v-show指令。

二、v-show

v-show指令是通过元素的display属性来控制元素在页面上的显隐,当v-show指令的值为false时,会给所在的DOM元素添加display: none;,即将元素设置为隐藏,反之,当v-show指令的值为true时元素display: block;。

v-show与v-if都可以用来控制元素的显隐,但是v-if是惰性的:如果在初始渲染时条件为假,则什么也不做,此时DOM树中并没有该元素的节点,直到条件第一次变为真时,才会开始生成该DOM并渲染。
而v-show不论条件是否成立,都会将元素生成对应的DOM节点添加到DOM树中,只是通过display去控制其显示状态。

三、v-for

v-for常常用在循环数组,将的每一项渲染到页面中。
v-for通常使用in的方式进行循环:

<li v-for="(item,index)in list" :key="item.message">{{ item.message }}</li>

也可以使用of:

<div v-for="item of items"></div>

其中list就是需要被循环的数组,item就是数组的每一项,index为循环索引。官方建议在v-for进行循环时加入:key,key值是每个节点的标识,Vue在list更新变化时会根据diff算法使用key值更新每个节点。不建议将索引index作为:key值,这会导致在list被改变时可能触发Vue的多次渲染。

v-for 还可以用来遍历一个对象的 property。

<ul id="v-for-object" class="demo">
  <li v-for="value in object">
    {{ value }}
  </li>
</ul>
new Vue({
  el: '#v-for-object',
  data: {
    object: {
      title: 'How to do lists in Vue',
      author: 'Jane Doe',
      publishedAt: '2016-04-10'
    }
  }
})

结果为:

· How to do lists in Vue
· Jane Doe
· 2016-04-10

也可以提供第二个的参数为 property 名称 (也就是键名):

<div v-for="(value,name,index) in object">
  {{ name }}: {{ value }}
</div>
title:How to do lists in Vue
author:Jane Doe
publishedAt:2016-04-10

四、v-once

v-once只会将指定的元素和组件渲染一次,Vue会把v-once对应的节点看作一个静态节点,而不是一个响应式的数据,可以用于优化更新性能。

五、tips

不要把v-for和v-if写在同一个元素上,如果这么做,vue会优先进行for循环,再进行if判断,如果if为false,那岂不是循环了又不做渲染,浪费性能~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: v-if指令会在每次渲染时都进行判断,如果你只想判断一次,可以使用v-once指令,它会将元素和组件标记为静态的,只会渲染一次。例如: ``` <div v-once v-if="condition">只判断一次</div> ``` ### 回答2: 在Vue中,v-if指令是用于条件性的渲染元素的。默认情况下,每当涉及到v-if的数据发生变化时,Vue将重新计算条件,并根据条件的结果来判断是否渲染元素。然而,有时候我们可能希望只判断一次条件,并在后续的数据变化中不再重复判断。 想要v-if只判断一次,我们可以使用v-once指令v-once指令告诉Vue只渲染元素一次,并且不再随后更新。例如: <template> <div> <p v-once>{{ message }}</p> <button @click="updateMessage">更新消息</button> </div> </template> <script> export default { data() { return { message: 'Hello World' } }, methods: { updateMessage() { this.message = 'New Message' } } } </script> 在上面的例子中,初始情况下,页面会渲染一个带有"Hello World"文本的段落,然后通过点击按钮更新message数据,但是再次渲染时,message段落将保持不变,不会再次判断条件。 需要注意的是,使用v-once指令虽然可以减少对条件判断的次数,但是当数据发生变化时,仍然会重新渲染整个元素,只是不会再判断条件是否满足。如果需要更加复杂的条件控制,可以考虑使用计算属性来实现。 ### 回答3: 在Vue中,v-if指令是根据表达式的真假值来决定元素是否渲染的。默认情况下,v-if每次重新渲染组件时都会重新判断表达式。 如果想让v-if只判断一次,并在之后保持不变,可以使用Vue中的计算属性。计算属性会根据它的依赖进行缓存,只要依赖不发生改变,就不会重新计算。我们可以把需要判断的表达式放在计算属性中,然后在模板中使用计算属性的结果进行渲染。 例如,有一个data属性isShow,用于控制元素的显示与隐藏。我们可以把isShow作为计算属性的依赖,并使用计算属性判断isShow的值,并返回一个布尔值: ```javascript data() { return { isShow: true } }, computed: { shouldShow() { // 只在组件初始化时判断一次,之后不再改变 return this.isShow; } } ``` 在模板中,我们可以使用计算属性shouldShow来决定元素的显示与隐藏: ```html <div v-if="shouldShow"> 这是要显示的内容 </div> ``` 这样,无论isShow是否发生改变,v-if只在组件初始化的时候判断一次,并保持不变。当isShow的值改变时,相应的计算属性shouldShow也会重新计算,但v-if不会再次判断表达式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值