You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.8 KiB
57 lines
1.8 KiB
|
|
import PropTypes from './vue-types'
|
|
import { getOptionProps } from './props-util'
|
|
|
|
function getDisplayName (WrappedComponent) {
|
|
return WrappedComponent.name || 'Component'
|
|
}
|
|
export default function wrapWithConnect (WrappedComponent) {
|
|
const tempProps = WrappedComponent.props || {}
|
|
const methods = WrappedComponent.methods || {}
|
|
const props = {}
|
|
Object.keys(tempProps).forEach(k => { props[k] = ({ ...k, required: false }) })
|
|
WrappedComponent.props.__propsSymbol__ = PropTypes.any
|
|
WrappedComponent.props.children = PropTypes.array.def([])
|
|
const ProxyWrappedComponent = {
|
|
props,
|
|
model: WrappedComponent.model,
|
|
name: `Proxy_${getDisplayName(WrappedComponent)}`,
|
|
methods: {
|
|
getProxyWrappedInstance () {
|
|
return this.$refs.wrappedInstance
|
|
},
|
|
},
|
|
render () {
|
|
const { $listeners, $slots = {}, $attrs, $scopedSlots } = this
|
|
const props = getOptionProps(this)
|
|
const wrapProps = {
|
|
props: {
|
|
...props,
|
|
__propsSymbol__: Symbol(),
|
|
componentWillReceiveProps: { ...props },
|
|
children: $slots.default || props.children || [],
|
|
},
|
|
on: $listeners,
|
|
attrs: $attrs,
|
|
}
|
|
if (Object.keys($scopedSlots).length) {
|
|
wrapProps.scopedSlots = $scopedSlots
|
|
}
|
|
const slotsKey = Object.keys($slots)
|
|
return (
|
|
<WrappedComponent {...wrapProps} ref='wrappedInstance'>
|
|
{slotsKey.length ? slotsKey.map(name => {
|
|
return <template slot={name}>{$slots[name]}</template>
|
|
}) : null}
|
|
</WrappedComponent>
|
|
)
|
|
},
|
|
}
|
|
Object.keys(methods).map(m => {
|
|
ProxyWrappedComponent.methods[m] = function () {
|
|
return this.getProxyWrappedInstance()[m](...arguments)
|
|
}
|
|
})
|
|
return ProxyWrappedComponent
|
|
}
|