16.如何优雅地获取跨层级组件实例(拒绝递归)

跨层级的获取组件实例

若是是普通的元素,ref="p"获取的是真实的dom元素,若是是自定义组件,那么获取到的就是这个组件的实例了。
this.$ref.XXXX能够获取当前组件上下文的实例。若是说要获取跨层级的组件的实例?那就很不方便了。
若是要获取父组件的,能够经过parent.refs.
获取子组件的children.refs
若是层级多的时候,10级20级别的。那就很不方便了。

若是A组件要访问E组件的实例。或者是F要访问A组件的实例。第一种想法多是经过递归的方式一直层级的网上找parent。一层层的去查找目标实例,

递归繁琐,并且性能低效。每次访问实例都要走一遍递归的形式,由于你的实例是不能被缓存 的,而后你底层的子组件的实例,若是被更新了。你父组件是不能及时的知道它这个实例是更新了。因此说你每次使用的时候,都须要层级的去获取。就是你没有办法去缓存。

争对这种状况设计了一种更加高效的方案。。若是你熟悉react ref它是一个call back回调的形式,这样咱们在回调中就能够作不少的事情,就比较灵活了。
争对这种回调灵活的特色,咱们能够设定一种主动通知,主动获取这样一种方案。
加入A要获取E的实例,A只须要提供一个钩子函数,E实例生成或者更新以后,主动的去调用这个沟子函数,来通知A节点,我这个实例已经生成好了。我这个实例有更新,只须要告诉这个A节点,A节点将这个实例进行缓存就能够了。而后每次A节点须要访问的时候,它老是能拿到最新的 ,由于E节点更新的时候已经主动的告诉了A节点。
如何实现callback的 ref就成了咱们一个新的难点,
















vue

看demo

仍是和上一节的结构是一致的。

点击获取到了E节点

F节点能够跨层级的获取到A节点。


A节点经过provide提供了主动通知和主动获取的几个钩子函数,



get就是直接去获取name的ref

子节点是如何调用setChildrenRef,经过inject注入,而后经过v-ant-ref的形式,经过这样一个指令,这个指令是咱们本身去开发的,把它变成一个回调的形式。
每次childrenH更新或者实例化完成的时候,都会主动的调用咱们的回调.主动通知上层的节点。去告诉他,我节点更新了。 

为何叫作v-ant-ref 之内vue 1.0的版本有v-ref这样一个指令,为了防止和之后的指令冲突。

v-ant-ref就是一个自定义的指令

bind的时候,绑定的时候,,把咱们的实例,调用这个回调。传递过去。

更新的时候,把新的实例主动告诉上层的节点。

F节点,只须要注入getParentChildrenRef,这个名字能够随便取

这就是咱们说的如何优雅的去获取跨层级的组件,避免了使用回调,充分利用缓存机制,避免去执行递归的方式,

























react

 课后习题




 


结束

相关文章
相关标签/搜索