feat(anchor): ts type
parent
5ec5334195
commit
2a536380bc
|
@ -1,4 +1,4 @@
|
|||
import type { ExtractPropTypes } from 'vue';
|
||||
import type { CSSProperties, ExtractPropTypes, PropType } from 'vue';
|
||||
import {
|
||||
defineComponent,
|
||||
nextTick,
|
||||
|
@ -9,7 +9,6 @@ import {
|
|||
ref,
|
||||
computed,
|
||||
} from 'vue';
|
||||
import PropTypes from '../_util/vue-types';
|
||||
import classNames from '../_util/classNames';
|
||||
import addEventListener from '../vc-util/Dom/addEventListener';
|
||||
import Affix from '../affix';
|
||||
|
@ -40,7 +39,7 @@ function getOffsetTop(element: HTMLElement, container: AnchorContainer): number
|
|||
return rect.top;
|
||||
}
|
||||
|
||||
const sharpMatcherRegx = /#(\S+)$/;
|
||||
const sharpMatcherRegx = /#([\S ]+)$/;
|
||||
|
||||
type Section = {
|
||||
link: string;
|
||||
|
@ -49,22 +48,22 @@ type Section = {
|
|||
|
||||
export type AnchorContainer = HTMLElement | Window;
|
||||
|
||||
const anchorProps = {
|
||||
prefixCls: PropTypes.string,
|
||||
offsetTop: PropTypes.number,
|
||||
bounds: PropTypes.number,
|
||||
affix: PropTypes.looseBool.def(true),
|
||||
showInkInFixed: PropTypes.looseBool.def(false),
|
||||
getContainer: PropTypes.func.def(getDefaultContainer),
|
||||
wrapperClass: PropTypes.string,
|
||||
wrapperStyle: PropTypes.style,
|
||||
getCurrentAnchor: PropTypes.func,
|
||||
targetOffset: PropTypes.number,
|
||||
onChange: PropTypes.func,
|
||||
onClick: PropTypes.func,
|
||||
};
|
||||
export const anchorProps = () => ({
|
||||
prefixCls: String,
|
||||
offsetTop: Number,
|
||||
bounds: Number,
|
||||
affix: { type: Boolean, default: true },
|
||||
showInkInFixed: { type: Boolean, default: false },
|
||||
getContainer: Function as PropType<() => AnchorContainer>,
|
||||
wrapperClass: String,
|
||||
wrapperStyle: { type: Object as PropType<CSSProperties>, default: undefined as CSSProperties },
|
||||
getCurrentAnchor: Function as PropType<() => string>,
|
||||
targetOffset: Number,
|
||||
onChange: Function as PropType<(currentActiveLink: string) => void>,
|
||||
onClick: Function as PropType<(e: MouseEvent, link: { title: any; href: string }) => void>,
|
||||
});
|
||||
|
||||
export type AnchorProps = Partial<ExtractPropTypes<typeof anchorProps>>;
|
||||
export type AnchorProps = Partial<ExtractPropTypes<ReturnType<typeof anchorProps>>>;
|
||||
|
||||
export interface AnchorState {
|
||||
scrollContainer: HTMLElement | Window;
|
||||
|
@ -76,8 +75,7 @@ export interface AnchorState {
|
|||
export default defineComponent({
|
||||
name: 'AAnchor',
|
||||
inheritAttrs: false,
|
||||
props: anchorProps,
|
||||
emits: ['change', 'click'],
|
||||
props: anchorProps(),
|
||||
setup(props, { emit, attrs, slots, expose }) {
|
||||
const { prefixCls, getTargetContainer, direction } = useConfigInject('anchor', props);
|
||||
const inkNodeRef = ref();
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
top: 0;
|
||||
left: 0;
|
||||
height: 100%;
|
||||
|
||||
&::before {
|
||||
position: relative;
|
||||
display: block;
|
||||
|
@ -30,6 +31,7 @@
|
|||
background-color: @anchor-border-color;
|
||||
content: ' ';
|
||||
}
|
||||
|
||||
&-ball {
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
|
@ -41,6 +43,7 @@
|
|||
border-radius: 8px;
|
||||
transform: translateX(-50%);
|
||||
transition: top 0.3s ease-in-out;
|
||||
|
||||
&.visible {
|
||||
display: inline-block;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue