用这招监听 Vue 的插槽变化
作者:Dmitri Pavlutin
译者:前端小智
来源:Dmitri Pavlutin
有梦想,有干货,微信搜索 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。最近,每当组件的内容(插槽、子组件等)发生变化时,我需要更新它的状态。对于上下文,它是一个表单组件,用于跟踪其输入的有效性状态。
本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。
下面的代码片段是以
Options
API格式编写的,但除了指定的地方外可以在Vue2 和 Vue2中使用。开始
先从控制表单状态开始,根据状态修改一个类,孩子内容使用
填充:
为了更新
isInvalid
属性,我们需要添加一个触发的事件,可以使用 sumit
事件 ,但我更喜用 input
事件。表单事件7个: focus, blur, input, select, change, reset, submit 等,具体详解看这篇文章: https://blog.csdn.net/qq_4379...表单不会触发
input
事件,但我们可以使用 "事件委托"。我们将监听器附加到父元素(
)上,当事件发生在它的子元素(
、
、
等)上时就会被触发。任何时候在这个组件的
中触发input
事件,表单将捕获该事件。
验证逻辑可以是简单或复杂的。本文为了演示,用简单的方法,使用
form.checkValidity()
API 来查看表单是否基于HTML验证属性而有效。为了访问
元素。可以用refs
或$el
属性。为了简单起见,本文使用$el
。
问题
这里有一点问题。如果表单的内容改变了,会发生什么?如果一个
在表单加载被添加到DOM中,会发生什么?举个例子,我们把这个表单组件称为
"MyForm"
,在 App 中,内容如下:// App.vue
当
App.vue
通过条件来隐藏显示某些 input
,我们的表单需要知道。在这种情况下,我们会想到在表单内容发生变化时跟踪其有效性,而不仅仅是在 input
事件或mounted
生命周期钩子上。否则,可能会显示不正确的信息。熟悉 Vue的生命周期钩子小伙伴,这里可能会想到使用
update
来跟踪变化。理论上,这听起来不错。在实践中,它会创造一个无限的循环,然后浏览器挂了。解决方法
经过一番研究和测试,最佳解决方案是使用
MutationObserver
API。它是浏览器内置的方法,提供了监视对DOM树所做更改的能力,如果节点的增减、属性的变动、文本内容的变动,这个 API 都可以得到通知。它是原生的方法,所以不受限于框架。
使用时,首先使用
MutationObserver
构造函数,新建一个观察器实例,同时指定这个实例的回调函数。在每次 DOM 变动后调用,这个回调都被调用。该回调函数接受两个参数,第一个是变动数组,第二个是观察器实例,将我们的 form
组件改写成如下:
这里还需要使用
beforeUnmount
生命周期事件来断开observer
的连接,这会清除它所分配的任何内存。最后,我们将
isInvalid
状态传递给要访问的内容的插件槽,这也称作用域的槽,它非常有用。
通过这样的设置,可以在我们的表单组件中添加任意数量的
input
,并添加任何它需要的条件渲染逻辑。只要input
使用HTML验证属性,表单就会跟踪它是否处于有效状态。此外,由于使用的是作用域槽,我们将表单的状态提供给父级,所以父级可以对有效性的变化做出反应。
例如,在
App.vue
,我们想在表单无效时 "禁用" 提交按钮,可以这么来写
nice~.
【用这招监听 Vue 的插槽变化】希望本文能对你未来的开必有所帮助。
~完,我是小智,准备来场按摩,秀起来!
原文:https://austingil.com/watchin...
代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。
交流 文章每周持续更新,可以微信搜索「 大迁世界 」第一时间阅读和催更(比博客早一到两篇哟),本文 GitHub https://github.com/qq449245884/xiaozhi 已经收录,整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,另外关注公众号,后台回复福利,即可看到福利,你懂的。
文章图片
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- JS中的各种宽高度定义及其应用
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- 涉毒患者(新诗)
- 参保人员因患病来不及到指定的医疗机构就医,能否报销医疗费用()
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。