naive-ui/packages/utils/installThemeableComponent.js
2019-10-08 14:14:30 +08:00

33 lines
733 B
JavaScript

function getTheme (component) {
let cursor = component
while (cursor.$parent) {
const name = cursor.$options.name
if (cursor.synthesizedTheme) {
return cursor.synthesizedTheme
}
if (name === 'NApp') {
return cursor.theme || null
}
cursor = cursor.$parent
}
return null
}
function install (Vue, Component, name) {
const prototypeProxy = new Proxy(function () {
return Component
}, {
apply (target, thisArg, argumentsList) {
if (thisArg instanceof Vue) {
Component.theme = getTheme(thisArg)
}
return target.bind(thisArg)(...argumentsList)
}
})
Object.defineProperty(Vue.prototype, name, {
get: prototypeProxy
})
}
export default install