-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
面试官:Vue中的v-show和v-if怎么理解? #4
Comments
一、v-show与v-if的共同点我们都知道在 在用法上也是相同的 <Model v-show="isShow" />
<Model v-if="isShow" />
二、v-show与v-if的区别
控制手段: 编译过程: 编译条件:
性能消耗: 三、v-show与v-if原理分析具体解析流程这里不展开讲,大致流程如下
v-show原理不管初始条件是什么,元素总是会被渲染 我们看一下在 代码很好理解,有 // https://github.com/vuejs/vue-next/blob/3cd30c5245da0733f9eb6f29d220f39c46518162/packages/runtime-dom/src/directives/vShow.ts
export const vShow: ObjectDirective<VShowElement> = {
beforeMount(el, { value }, { transition }) {
el._vod = el.style.display === 'none' ? '' : el.style.display
if (transition && value) {
transition.beforeEnter(el)
} else {
setDisplay(el, value)
}
},
mounted(el, { value }, { transition }) {
if (transition && value) {
transition.enter(el)
}
},
updated(el, { value, oldValue }, { transition }) {
// ...
},
beforeUnmount(el, { value }) {
setDisplay(el, value)
}
} v-if原理
返回一个 // https://github.com/vuejs/vue-next/blob/cdc9f336fd/packages/compiler-core/src/transforms/vIf.ts
export const transformIf = createStructuralDirectiveTransform(
/^(if|else|else-if)$/,
(node, dir, context) => {
return processIf(node, dir, context, (ifNode, branch, isRoot) => {
// ...
return () => {
if (isRoot) {
ifNode.codegenNode = createCodegenNodeForBranch(
branch,
key,
context
) as IfConditionalExpression
} else {
// attach this branch's codegen node to the v-if root.
const parentCondition = getParentCondition(ifNode.codegenNode!)
parentCondition.alternate = createCodegenNodeForBranch(
branch,
key + ifNode.branches.length - 1,
context
)
}
}
})
}
) 四、v-show与v-if的使用场景
如果需要非常频繁地切换,则使用 v-show 较好 如果在运行时条件很少改变,则使用 v-if 较好 参考文献 |
v-if由false变为true的时候,触发组件的beforeCreate、create、beforeMount、mounted钩子,由true变为false的时候触发组件的beforeDestory、destoryed方法。这句话没懂,有大佬解释一下吗 |
其实就是true的时候触发创建的钩子,false的时候触发删除的方法,因为不存在更新,也就不关beforeUpdate和updated的事了 |
不就是组件的生命周期吗😂 |
他这应该说的是用v-if 来渲染组件吧。 |
好比说你现在做了一个弹框,弹框里有一些数据和逻辑需要每次生成出来的时候都做一次,这个时候把弹框封装成组件,用v-if控制组件显示与隐藏就可以让组件每次生成出来都走一遍完整的生命周期。 |
在Vue中,
简而言之, |
我的理解是,当v-if由false变为true的时候,dom包含的组件会被渲染,会触发生命周期(创建之前,创建,挂载之前,挂载);由true变为false的时候,会触发组件销毁生命周期(销毁之前,销毁)。这个只是我的理解,感觉也是比较浅显的理解,要是有大佬讲解的时候,请也踢踢我 |
No description provided.
The text was updated successfully, but these errors were encountered: