import {ref, onMounted, watch, nextTick, computed, onUnmounted} from 'vue' import { ElDropdown, ElDropdownMenu, ElDropdownItem, ElIcon } from 'element-plus' import { ArrowDown, CaretBottom } from '@element-plus/icons-vue' import CipButtonText from '../cip-button-text' import CipButton from '../cip-button' import CipButtonPop from '../cip-button-pop' import { getUsingConfig } from '@xdp/config' import { useTable } from '@d-render/shared' const getButtonInfo = (vnode) => { if (vnode.component) { const text = vnode.component.slots.default() // console.log(vnode.component.emitsOptions.click) const info = { ...vnode.component.ctx._.props, ...vnode.component.ctx._.attrs } const { onClick = (e) => vnode.component.ctx._.emit('click', e) } = info return { ...info, onClick, text } } return {} } const RenderComponent = (props) => { const list = props.buttonList // .value let dropDownNode let buttonNodeList = list if (list.length > props.limit) { buttonNodeList = list.slice(0, props.limit - 1) dropDownNode = {{ default: () => props.buttonComp === 'button' ? : 更多 , dropdown: () => { list.slice(props.limit - 1).map(item => { const { onClick, text, disabled } = getButtonInfo(item) return {text} }) } }} } const result = buttonNodeList.map(item => { const { onClick, text, type, showDisabledButton, dangerButton, needPop, popTitle, popPlacement, icon, disabled } = getButtonInfo(item) let ButtonComponent = props.buttonComp === 'button' ? CipButton : CipButtonText if (props.buttonComp && needPop) ButtonComponent = CipButtonPop const buttonProps = { type, disabled, showDisabledButton, dangerButton, icon, onClick } as any if (needPop) { buttonProps.popTitle = popTitle buttonProps.popPlacement = popPlacement } return {text} }) if (dropDownNode) { result.push(dropDownNode) } return result } export default { name: 'CipButtonCollapse', props: { limit: { type: Number }, row: { type: Object, required: true }, buttonComp: { type: String, default: 'text', validate: (val) => ['text', 'button'].includes(val) }, showDisabled: { type: Boolean, default: undefined } }, setup (props, { slots }) { const cipTable = useTable() as any const buttonList = ref([]) const originRef = ref() const handlerLimit = computed(() => { return getUsingConfig(props.limit, props.buttonComp === 'text' ? 3 : 4) }) const showDisabledButton = computed(() => { return getUsingConfig(props.showDisabled, cipTable.showDisabledButton, true) }) let vnodeList = [] onMounted(() => { const unwatch = watch(() => props.row, () => { nextTick().then(() => collectButtons()) }, { immediate: true, deep: true }) onUnmounted(()=> { console.log('originRef.value', originRef.value) unwatch() vnodeList =[] }) }) const collectButtons = () => { buttonList.value = [] vnodeList.forEach(vnode => getButtons(vnode)) } const getButtons = (vnode) => { if (vnode.shapeFlag === 16) { // 数组 vnode.children.forEach(v => getButtons(v)) } if (vnode.shapeFlag === 17) { // 原生的dom vnode.children.forEach(v => getButtons(v)) } if (vnode.shapeFlag === 36) { // 组件 const componentName = (vnode.type.name || '').toLowerCase() if (componentName.indexOf('button') > -1) { const info = getButtonInfo(vnode) if (showDisabledButton.value === false && info.disabled) { console.log('button 不符合展示条件') } else { buttonList.value.push(vnode) } } else { if (vnode.component) { const children = vnode.component.subTree.children || [] children.forEach(v => getButtons(v)) } } } } return () => { vnodeList = slots.default?.() return
{ originRef.value = el }} style={'display: none'}>{vnodeList}
} } }