bug
jiangping
2023-11-07 64b432916af9c9218ab3f3eca614e26c542142ae
minipro_standard/uni_modules/uview-ui/libs/util/emitter.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
/**
 * é€’归使用 call æ–¹å¼this指向
 * @param componentName // éœ€è¦æ‰¾çš„组件的名称
 * @param eventName // äº‹ä»¶åç§°
 * @param params // éœ€è¦ä¼ é€’的参数
 */
function broadcast(componentName, eventName, params) {
    // å¾ªçŽ¯å­èŠ‚ç‚¹æ‰¾åˆ°åç§°ä¸€æ ·çš„å­èŠ‚ç‚¹ å¦åˆ™ é€’å½’ å½“前子节点
    this.$children.map((child) => {
        if (componentName === child.$options.name) {
            child.$emit.apply(child, [eventName].concat(params))
        } else {
            broadcast.apply(child, [componentName, eventName].concat(params))
        }
    })
}
export default {
    methods: {
        /**
         * æ´¾å‘ (向上查找) (一个)
         * @param componentName // éœ€è¦æ‰¾çš„组件的名称
         * @param eventName // äº‹ä»¶åç§°
         * @param params // éœ€è¦ä¼ é€’的参数
         */
        dispatch(componentName, eventName, params) {
            let parent = this.$parent || this.$root// $parent æ‰¾åˆ°æœ€è¿‘的父节点 $root æ ¹èŠ‚ç‚¹
            let { name } = parent.$options // èŽ·å–å½“å‰ç»„ä»¶å®žä¾‹çš„name
            // å¦‚果当前有节点 && å½“前没名称 ä¸” å½“前名称等于需要传进来的名称的时候就去查找当前的节点
            // å¾ªçŽ¯å‡ºå½“å‰åç§°çš„ä¸€æ ·çš„ç»„ä»¶å®žä¾‹
            while (parent && (!name || name !== componentName)) {
                parent = parent.$parent
                if (parent) {
                    name = parent.$options.name
                }
            }
            // æœ‰èŠ‚ç‚¹è¡¨ç¤ºå½“å‰æ‰¾åˆ°äº†name一样的实例
            if (parent) {
                parent.$emit.apply(parent, [eventName].concat(params))
            }
        },
        /**
         * å¹¿æ’­ (向下查找) (广播多个)
         * @param componentName // éœ€è¦æ‰¾çš„组件的名称
         * @param eventName // äº‹ä»¶åç§°
         * @param params // éœ€è¦ä¼ é€’的参数
         */
        broadcast(componentName, eventName, params) {
            broadcast.call(this, componentName, eventName, params)
        }
    }
}