外观
v-if 和 v-show 怎么选?
v-if 是真的创建和销毁这块节点,切换有销毁成本,但初始为假时不会渲染。v-show 只切换 display,初始就会渲染,频繁切换更便宜。
原理
v-if 为假时,组件实例不存在,里面的监听和子组件也不会创建。适合权限、大块很少出现的内容。
v-show 为假时实例还在,状态还在,只是看不见也不占位。适合页签、下拉这种来回切换。
两者不要和 v-for 写在同一个元素上。Vue 3 里同一元素上 v-if 比 v-for 优先级更高,v-if 读不到 v-for 的变量。先用计算属性过滤列表,再 v-for;需要按项决定显示时,把 v-if 放到子节点或用 template 包住。
template 上的 v-if 不会产生额外 DOM。v-show 不能用在 template 上,因为它要改元素的样式。
追问
display: none 和 v-show 的差别?
v-show 就是在切换显示时写 display。它会记住元素原来的显示方式。你自己改样式可能和它打架,隐藏优先交给 v-show 或计算出来的 class,不要两处一起改。
权限用哪个?
没权限的大块用 v-if,避免白做渲染。这不是安全措施。见 权限控制。
易错点
- 频繁切换的重组件用
v-if,每次都重新请求、重新挂载。 - 很少出现的重组件用
v-show,首屏把隐藏的子树也创建了。 v-if和v-for写在同一节点上,变量作用域和预期相反。