石家庄电子商务网站建设,网站功能建设与栏目划分,怎么入侵网站后台管理,大连网站建设求职简历VNode 钩子在每个组件或html标签上#xff0c;我们可以使用一些特殊的#xff08;文档没写的#xff09;钩子作为事件监听器。这些钩子有#xff1a;onVnodeBeforeMountonVnodeMountedonVnodeBeforeUpdateonVnodeUpdatedonVnodeBeforeUnmountonVnodeUnmounted我主要是在组件…VNode 钩子在每个组件或html标签上我们可以使用一些特殊的文档没写的钩子作为事件监听器。这些钩子有onVnodeBeforeMountonVnodeMountedonVnodeBeforeUpdateonVnodeUpdatedonVnodeBeforeUnmountonVnodeUnmounted我主要是在组件上使用onVnodeMounted当需要在组件挂载时执行一些代码或者在更新时使用onVnodeUpdated进行调试可以确定的是所有这些钩子都能在某些情况下派上用场。例子scriptsetupimport { ref } fromvueconst count ref(0)functiononMyComponentMounted() {}functiondivThatDisplaysCountWasUpdated() {}
/scripttemplateMyComponent vnodeMountedonMyComponentMounted /div vnodeUpdateddivThatDisplaysCountWasUpdated{{ count }}/div/template应该注意的是这些挂钩将一些参数传递给回调函数。它们只传递一个参数即当前 VNode除了onVnodeBeforeUpdate传递onVnodeUpdated两个参数当前 VNode 和前一个 VNode。调试挂钩我们都知道 Vue 为我们提供的生命周期钩子。但是您知道 Vue 3 为我们提供了两个可用于调试目的的钩子吗他们是onRenderTrackedonRenderTriggeredonRenderTracked为已跟踪的每个反应性依赖项调用。scriptsetupimport { ref, onRenderTracked } fromvueconst count ref(0)
const count2 ref(0)// It will be called twice, once for count and once for count2
onRenderTracked((event) {console.log(event)
})
/scriptonRenderTriggered当我们触发反应性更新时被调用或者如文档所说“当反应性依赖触发组件的渲染效果重新运行时”。scriptsetupimport { ref, onRenderTriggered } fromvueconst count ref(0)// It will be called when we update count
onRenderTriggered((event) {debugger
})
/script从子组件公开插槽如果您使用第三方组件您可能会将其实现包装在您自己的“包装器”组件中。这是一个很好的实践和可扩展的解决方案但那样的话第三方组件的插槽就会丢失我们应该找到一种方法将它们暴露给父组件WrapperComponent.vuetemplatedivclasswrapper-of-third-party-componentThirdPartyComponentv-bind$attrs!-- Expose the slots of the third-party component --templatev-for(_, name) in $slots #[name]slotDataslot:namenamev-bindslotData || {}/slot/template/ThirdPartyComponent/div/template现在每个使用的组件都WrapperComponent可以使用ThirdPartyComponent的插槽。作用域样式和多根节点不能很好地协同工作在 Vue 3 中我们终于可以拥有不止“一个根节点”的组件。这很好但我个人在这样做时遇到了设计限制。假设我们有一个子组件templatepclassmy-pFirst p/ppclassmy-pSecond p/p/template和一个父组件templateh1My awesome component/h1MyChildComponent //templatestylescoped
// There is no way to style the p tags of MyChildComponent
.my-p { color: red; }
:deep(.my-p) { color: red; }
/style无法从多根父组件的作用域样式设置子组件的 p 标签的样式。所以简而言之一个多根组件不能使用作用域样式来定位多根子组件的样式。解决这个问题的最好方法是包装父组件或子组件或两者这样我们就只有一个根元素。但是如果你绝对需要两者都有多根节点你可以使用非作用域样式style.my-p { color: red; }
/style使用 css 模块templateh1My awesome component/h1MyChildComponent:class$style.trick //templatestylemodule.trick {color: red;
}
/style既然我们在这里指定了一个类那么多根子组件就得显式指定属性 fallthrough 行为。如果你想要我的意见除非你绝对需要一个多根节点组件否则请使用单个根节点并且根本不要处理这个设计限制。使用 CSS 选择器时要小心#main-nav li {}将比 . 慢很多倍.my-li { color: red }。从文档由于浏览器呈现各种 CSS 选择器的方式p { color: red } 在范围内即与属性选择器结合使用时会慢很多倍。如果您改用类或 ID例如在 .example { color: red } 中那么您几乎可以消除性能损失。如果您想更深入地研究这个主题我强烈建议您阅读Efficiently Rendering CSS 。布尔转换在 Vue 2 或 Vue 3 的早期版本中对于具有布尔类型的道具我们根据顺序有不同的行为第一种情况props: {hoverColor: [String, Boolean] // - defaults to
}第二种情况props: {hoverColor: [Boolean, String] //-defaultstofalse
}不仅如此如果你像这样传递 propmy-componenthover-color/my-component在第一种情况下它将是一个空字符串。在第二种情况下它将是true.如您所见这有点混乱和不一致。幸运的是在 Vue 3 中我们有一个一致且可预测的新行为Boolean无论类型出现顺序如何行为都将适用。所以hoverColor: [String, Boolean] // - defaults to falsehoverColor: [Boolean, String] // - defaults to falsehoverColor: [Boolean, Number] // - defaults to false带有 v-for 的模板引用 - 不能保证顺序记住这个这样你就不会浪费数小时的调试时间来弄清楚发生了什么在下面的代码中scriptsetupimport { ref } fromvue;const list ref([1, 2, 3]);
const itemRefs ref([]);
/scripttemplateulliv-foritem in listrefitemRefs:keyitem{{ item }}/li/ul/template我们在列表数组上循环并创建 itemRefs 数组。itemRefs不保证与列表数组有相同的顺序。如果你想了解更多这方面的信息你可以阅读这个issue。