diff --git a/packages/devui-vue/devui/cascader/components/cascader-item/index.scss b/packages/devui-vue/devui/cascader/components/cascader-item/index.scss index 459a91366bdb41b186b4a21c989d59286dfb9404..f3368ead2587b8c5198d0ee63af5989b4645eff2 100644 --- a/packages/devui-vue/devui/cascader/components/cascader-item/index.scss +++ b/packages/devui-vue/devui/cascader/components/cascader-item/index.scss @@ -9,8 +9,15 @@ color: $devui-text; cursor: pointer; @include flex(flex-start); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + .cascader-li__wraper { + flex: 1; + @include flex(flex-start); } - .dropdown-item-label { display: inline-block; flex: 1; @@ -19,4 +26,32 @@ text-overflow: ellipsis; font-size: $devui-font-size; } + + &.devui-leaf-active { + background: $devui-list-item-hover-bg; + + span { + color: $devui-brand-active; + } + } + + &.disabled { + background-color: $devui-disabled-bg; + cursor: not-allowed; + } + + .cascader-li { + &__checkbox { + margin-right: 4px; + } + + &__icon { + margin-right: 4px; + font-size: $devui-font-size-icon; + color: $devui-text; + &.disabled { + color: $devui-disabled-text !important; + } + } + } } diff --git a/packages/devui-vue/devui/cascader/components/cascader-item/index.tsx b/packages/devui-vue/devui/cascader/components/cascader-item/index.tsx index 5182dd221b1773743c2b7bf4a48cd6ff4f27aa9f..c221a86aeca109a3790150b29a0483deaf4bc33c 100644 --- a/packages/devui-vue/devui/cascader/components/cascader-item/index.tsx +++ b/packages/devui-vue/devui/cascader/components/cascader-item/index.tsx @@ -1,21 +1,67 @@ -import { getRootClass } from './use-class' -import { optionsHandles } from '../../hooks/use-cascader-options' +import { computed, ref } from 'vue' +import { CascaderItemPropsType } from '../../src/cascader-types' +import { useListClassName } from '../../hooks/use-cascader-class' +import { updateCheckOptionStatus } from '../../hooks/use-cascader-multiple' +import { singleChoose } from '../../hooks/use-cascader-single' import './index.scss' -export const DCascaderItem = (props) => { - const { cascaderli, ulIndex } = props - const { changeCascaderIndexs } = optionsHandles() - const rootClasses = getRootClass() - const mouseHover = () => { - changeCascaderIndexs(cascaderli, ulIndex) +export const DCascaderItem = (props: CascaderItemPropsType) => { + // console.log('item index',props) + const { cascaderItem, ulIndex, liIndex, cascaderItemNeedProps, cascaderOptions } = props + const { multiple, stopDefault, valueCache, activeIndexs, trigger, confirmInputValueFlg, tagList} = cascaderItemNeedProps + const isTriggerHover = trigger === 'hover' + const rootClasses = useListClassName(props) + const { updateStatus } = updateCheckOptionStatus(tagList) + const disbaled = computed(() => cascaderItem?.disabled) // 当前项是否被禁用 + // 触发联动更新 + const updateValues = () => { + if (stopDefault.value) return + // 删除当前联动级之后的所有级 + activeIndexs.splice(ulIndex, activeIndexs.length - ulIndex) + // 更新当前渲染视图的下标数组 + activeIndexs[ulIndex] = liIndex + if (!multiple) { // 单选点击选项就更新,多选是通过点击checkbox触发数据更新 + singleChoose(ulIndex, valueCache, cascaderItem) + } + } + // 鼠标hover(多选模式下只能点击操作触发) + const mouseEnter = () => { + if (disbaled.value || multiple) return + updateValues() + } + const mouseenter = { + [ isTriggerHover && 'onMouseenter' ]: mouseEnter + } + // 鼠标click + const mouseClick = () => { + if (disbaled.value) return + updateValues() + if (!multiple && (!cascaderItem.children || cascaderItem?.children?.length === 0)) { + confirmInputValueFlg.value = !confirmInputValueFlg.value + } + } + const checkboxChange = () => { + updateStatus(cascaderItem, cascaderOptions, ulIndex) } return ( -
  • - - { - cascaderli?.children?.length > 0 && +
  • + { multiple && +
    + +
    } +
    + { cascaderItem.icon && +
    + +
    + } + + { + cascaderItem?.children?.length > 0 && + } +
  • ) } diff --git a/packages/devui-vue/devui/cascader/components/cascader-item/use-class.ts b/packages/devui-vue/devui/cascader/components/cascader-item/use-class.ts deleted file mode 100644 index 5a5ec3e21b6bd16e8fafc7da41ea55a592f0760b..0000000000000000000000000000000000000000 --- a/packages/devui-vue/devui/cascader/components/cascader-item/use-class.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * 定义组件class - */ - import { computed, ComputedRef } from 'vue'; - - export const getRootClass = (): ComputedRef => { - return computed(() => ({ - 'devui-cascader-li devui-dropdown-item': true, - })) - } - \ No newline at end of file diff --git a/packages/devui-vue/devui/cascader/components/cascader-list/cascader-list-types.ts b/packages/devui-vue/devui/cascader/components/cascader-list/cascader-list-types.ts deleted file mode 100644 index 85e2152df95d7ff7843a6db28e084074b8c38f24..0000000000000000000000000000000000000000 --- a/packages/devui-vue/devui/cascader/components/cascader-list/cascader-list-types.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { PropType, ExtractPropTypes } from 'vue' -import { CascaderItem } from '../../src/cascader-types' -export const cascaderulProps = { - /** - * 每个ul中的li - * @type {CascaderItem[]} - * @default [] - */ - cascaderlis: { - type: Array as PropType, - default: [], - }, - /** - * 当前选中的ul下标 - * @type {Number} - * @default 0 - */ - ulIndex: { - type: Number, - default: 0 - } -} -export type CascaderulProps = ExtractPropTypes diff --git a/packages/devui-vue/devui/cascader/components/cascader-list/index.scss b/packages/devui-vue/devui/cascader/components/cascader-list/index.scss index a5ff2f80f31e199faf7c02531b3cbcaebf8d86d7..76a260c86f4545d6b1bb5a1ce004d9d54b7a777a 100644 --- a/packages/devui-vue/devui/cascader/components/cascader-list/index.scss +++ b/packages/devui-vue/devui/cascader/components/cascader-list/index.scss @@ -1,8 +1,8 @@ @import '../../../style/mixins/flex'; @import '../../../style/theme/color'; +@import '../../../style/theme/font'; .devui-cascader-ul { - width: 200px; height: 180px; background: $devui-connected-overlay-bg; display: block; @@ -11,4 +11,17 @@ padding: 0; overflow-y: auto; border-left: 1px solid $devui-dividing-line; + + &.devui-drop-no-data { + color: $devui-disabled-text; + padding: 8px; + display: block; + height: 36px; + line-height: 36px; + overflow-y: hidden; + background-color: $devui-disabled-bg; + font-size: $devui-font-size; + @include flex(center, flex-start); + @include flex-direction(); + } } diff --git a/packages/devui-vue/devui/cascader/components/cascader-list/index.tsx b/packages/devui-vue/devui/cascader/components/cascader-list/index.tsx index 4fa19244988f5997d37de3f902b5ab75bf8b2ecf..fb367f22f1c0043928da413d7252bb6112dde7da 100644 --- a/packages/devui-vue/devui/cascader/components/cascader-list/index.tsx +++ b/packages/devui-vue/devui/cascader/components/cascader-list/index.tsx @@ -1,18 +1,26 @@ import { defineComponent } from 'vue' -import { getRootClass } from './use-class' -import './index.scss' -import { cascaderulProps, CascaderulProps } from './cascader-list-types' +import { useUlClassName } from '../../hooks/use-cascader-class' +import { useDropdownStyle } from '../../hooks/use-cascader-style' +import { cascaderulProps, CascaderulProps } from '../../src/cascader-types' + import { DCascaderItem } from '../cascader-item' +import './index.scss' export default defineComponent({ name: 'DCascaderList', props: cascaderulProps, setup(props: CascaderulProps) { - const rootClasses = getRootClass() + const ulClass = useUlClassName(props) + const ulStyle = useDropdownStyle(props) + // console.log('props', props) return () => ( -