Vue中template的相关注意点

使用template进行条件渲染

如下所示,有一段内容:

<h1>尊贵的年费会员</h1>
<div>此处内容仅年费会员可见!</div>
<h1>亲爱的普通用户</h1>
<div>您不是年费会员无权访问,请前往用户中心充值!</div>

这段内容如果想要加v-if进行条件渲染,一种做法是在外面套一个<div>,代码如下:

<div v-if="hasAuthority">
	<h1>尊贵的年费会员</h1>
	<div>此处内容仅年费会员可见!</div>
</div>
<div v-else>
	<h1>亲爱的普通用户</h1>
	<div>您不是年费会员无权访问,请前往用户中心充值!</div>
</div>

但这样的话,渲染出来的html就会多出没用的div,这种情况下可以使用<template>,它可以作为不可见的包裹元素,最终渲染结果将不包含<template>,代码如下:

<template v-if="hasAuthority">
	<h1>尊贵的年费会员</h1>
	<div>此处内容仅年费会员可见!</div>
</template>
<template v-else>
	<h1>亲爱的普通用户</h1>
	<div>您不是年费会员无权访问,请前往用户中心充值!</div>
</template>

为什么不推荐使用template进行列表渲染

Vue官方文档上给了一个案例,使用template进行列表渲染:

在这里插入图片描述
本人自己也去试了一下,这样的做法本身没有问题,<template>可以进行列表渲染。但是熟悉Vue的同学都知道,v-for需要绑定key,这样才能让虚拟DOM高效更新。问题就出在这里,如果试图给<template>绑定key,那么控制台就会报错:

<template> cannot be keyed. Place the key on real elements instead.

相信大家看到这个提示就明白问题出在哪里了。上一节内容讲到,<template>元素不会出现在最终的渲染结果中。假如给<template>元素绑定key,相当于key值就丢失了,等于没有绑定。

有的同学可能会问,key可以给内部元素绑定吗?答案是可以的,但强烈不推荐。原因是如果内部有很多平级的元素,就得给每个元素都加一个key,如下所示:

<ul>
	<template v-for="(item, index) in items">
		<li :key="item.id">{{ item.msg }}</li>
		<li class="divider" :key="item.id"></li>
	</template>
</ul>

别以为这样就没问题了,按上面的逻辑,每一次循环就会有两个元素带有一模一样的key,显然这样是会报错的:

[Vue warn]: Duplicate keys detected: ‘xxx’. This may cause an update error

所以最好的解决方案就是不要使用<template>进行列表渲染。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值