持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情
二刷vue官方文档的时候,看到了一个特别的指令v-once,这个指令比较有趣。话不多说,进入正题
介绍
只渲染元素和组件一次。随后的重新渲染,元素/组件及其所有的子节点将被视为静态内容并跳过。这可以用于优化更新性能。
如果只想页面加载时显示一次,后续不在因为数据信息的变动而变动时,就可以采取
v-once实现。
很有意思,当你可能有一个组件,这个组件包含了大量静态内容。在这种情况下,你可以在根元素上添加 v-once attribute 以确保这些内容只计算一次然后缓存起来,这样就大大减小了性能开销。如:
Vue.component('terms-of-service', {
template: `
<div v-once>
<h1>Terms of Service</h1>
... a lot of static content ...
</div>
`
})
但是不要过度使用这个模式,尤其是该组件在未来有可能要进行数据更新的情况下不要使用;对此,官方文档也给了相应的提示:
再说一次,试着不要过度使用这个模式。当你需要渲染大量静态内容时,极少数的情况下它会给你带来便利,除非你非常留意渲染变慢了,不然它完全是没有必要的——再加上它在后期会带来很多困惑。例如,设想另一个开发者并不熟悉
v-once或漏看了它在模板中,他们可能会花很多个小时去找出模板为什么无法正确更新。
案例
当修改input框的值时,使用了v-once指令的p元素不会随之改变,而第二个p元素时可以随之改变
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.10/dist/vue.js"></script>
</head>
<body>
<div id="app">
<p v-once>{{msg}}</p>
<!-- msg不会改变 -->
<p>{{msg}}</p>
<input type="text" v-model="msg" name="" />
</div>
<script type="text/javascript">
let vm = new Vue({
el: "#app",
data: {
msg: "Hello",
},
});
</script>
</body>
</html>