Skip to content

Commit

Permalink
fix(comp:cascader): update overlay position after edging
Browse files Browse the repository at this point in the history
  • Loading branch information
danranVm committed Sep 14, 2022
1 parent 7365dcc commit bea33dc
Show file tree
Hide file tree
Showing 6 changed files with 18 additions and 9 deletions.
2 changes: 0 additions & 2 deletions packages/cdk/click-outside/docs/Api.zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,6 @@ export type ClickOutsideHandler = (evt: MouseEvent) => void
### useClickOutside
对 [ResizeObserver](https://developer.mozilla.org/zh-CN/docs/Web/API/ResizeObserver) 的进一步封装。
```ts
/**
* 为除了特定元素外添加全局点击事件
Expand Down
2 changes: 1 addition & 1 deletion packages/cdk/popper/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ export interface PopperInstance<TE extends PopperElement = PopperElement, PE ext
/**
* Update popper.
*/
update(options: Partial<PopperOptions>): void
update(options?: Partial<PopperOptions>): void
/**
* Force update popper
*/
Expand Down
1 change: 1 addition & 0 deletions packages/components/cascader/src/Cascader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ export default defineComponent({
setInputValue,
overlayOpened,
setOverlayOpened,
updateOverlay,
mergedData,
mergedDataMap,
...activeStateContext,
Expand Down
7 changes: 6 additions & 1 deletion packages/components/cascader/src/contents/OverlayContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

/* eslint-disable @typescript-eslint/no-explicit-any */

import { type VNode, computed, defineComponent, inject } from 'vue'
import { type VNode, computed, defineComponent, inject, watch } from 'vue'

import { callEmit } from '@idux/cdk/utils'
import { ɵInput } from '@idux/components/_private/input'
Expand All @@ -27,6 +27,7 @@ export default defineComponent({
expandedKeys,
inputValue,
setInputValue,
updateOverlay,
} = inject(cascaderToken)!

const contentData = computed(() => {
Expand All @@ -41,6 +42,10 @@ export default defineComponent({
return dataSource
})

watch([() => contentData.value.length, inputValue], () => {
updateOverlay()
})

const handleInput = (evt: Event) => {
const { value } = evt.target as HTMLInputElement
setInputValue(value)
Expand Down
1 change: 1 addition & 0 deletions packages/components/cascader/src/token.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ export interface CascaderContext
setInputValue: (value: string) => void
overlayOpened: ComputedRef<boolean>
setOverlayOpened: (open: boolean) => void
updateOverlay: () => void
}

export const cascaderToken: InjectionKey<CascaderContext> = Symbol('cascaderToken')
14 changes: 9 additions & 5 deletions packages/components/select/src/composables/useOverlayState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import { type ɵSelectorInstance } from '@idux/components/_private/selector'
export interface OverlayStateContext {
overlayRef: Ref<ɵOverlayInstance | undefined>
overlayStyle: ComputedRef<CSSProperties>
updateOverlay: (rect: DOMRect) => void
updateOverlay: (rect?: DOMRect) => void
overlayOpened: ComputedRef<boolean>
setOverlayOpened: (open: boolean) => void
}
Expand All @@ -36,10 +36,14 @@ export function useOverlayState(
})
const [overlayOpened, setOverlayOpened] = useControlledProp(props, 'open', false)

const updateOverlay = (rect: DOMRect) => {
const { width } = rect
if (width > 0) {
setOverlayWidth(convertCssPixel(width))
const updateOverlay = (rect?: DOMRect) => {
if (rect) {
const { width } = rect
if (width > 0) {
setOverlayWidth(convertCssPixel(width))
overlayOpened.value && overlayRef.value?.updatePopper()
}
} else {
overlayOpened.value && overlayRef.value?.updatePopper()
}
}
Expand Down

0 comments on commit bea33dc

Please sign in to comment.