看板
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
import type { ExtractPropTypes, PropType } from 'vue';
|
||||
import { baseProps } from '../common/props';
|
||||
|
||||
/**
|
||||
* u-index-anchor 组件 Props 类型定义
|
||||
* @description 索引锚点属性
|
||||
*/
|
||||
export const IndexAnchorProps = {
|
||||
...baseProps,
|
||||
/** 是否使用自定义内容的插槽 */
|
||||
useSlot: { type: Boolean, default: false },
|
||||
/** 索引字符,如果定义了use-slot,此参数自动失效 */
|
||||
index: { type: String, default: '' }
|
||||
};
|
||||
|
||||
export type IndexAnchorProps = ExtractPropTypes<typeof IndexAnchorProps>;
|
||||
@@ -0,0 +1,120 @@
|
||||
<template>
|
||||
<!-- 支付宝小程序使用$u.getRect()获取组件的根元素尺寸,所以在外面套一个"壳" -->
|
||||
<view>
|
||||
<view class="u-index-anchor-wrapper" :id="$u.guid()" :style="wrapperStyle">
|
||||
<view
|
||||
class="u-index-anchor"
|
||||
:class="[active ? 'u-index-anchor--active' : '', customClass]"
|
||||
:style="$u.toStyle(anchorStyle, customStyle)"
|
||||
>
|
||||
<slot v-if="useSlot" />
|
||||
<template v-else>
|
||||
<text>{{ index }}</text>
|
||||
</template>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'u-index-anchor',
|
||||
options: {
|
||||
addGlobalClass: true,
|
||||
// #ifndef MP-TOUTIAO
|
||||
virtualHost: true,
|
||||
// #endif
|
||||
styleIsolation: 'shared'
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { IndexAnchorProps } from './types';
|
||||
import { ref, onMounted } from 'vue';
|
||||
import { $u, useChildren } from '../..';
|
||||
|
||||
/**
|
||||
* indexAnchor 索引列表锚点
|
||||
* @description 通过折叠面板收纳内容区域,搭配<u-index-anchor>使用
|
||||
* @tutorial https://uviewpro.cn/zh/components/indexList.html#indexanchor-props
|
||||
* @property {Boolean} use-slot 是否使用自定义内容的插槽(默认false)
|
||||
* @property {String|Number} index 索引字符,如果定义了use-slot,此参数自动失效
|
||||
* @property {Object} customStyle 自定义样式,对象形式,如"{color: 'red'}"
|
||||
* @event {Function} default 锚点位置显示内容,默认为索引字符
|
||||
* @example <u-index-anchor :index="item" />
|
||||
*/
|
||||
|
||||
const props = defineProps(IndexAnchorProps);
|
||||
const { parentExposed } = useChildren('u-index-anchor', 'u-index-list');
|
||||
|
||||
// 响应式变量
|
||||
const active = ref(false);
|
||||
const wrapperStyle = ref<Record<string, any>>({});
|
||||
const anchorStyle = ref<Record<string, any>>({});
|
||||
const top = ref(0);
|
||||
const height = ref(0);
|
||||
|
||||
// 挂载时查找父组件并注册
|
||||
onMounted(() => {
|
||||
if (parentExposed) {
|
||||
parentExposed?.value?.updateData();
|
||||
}
|
||||
});
|
||||
|
||||
function setTop(val: any) {
|
||||
top.value = val;
|
||||
}
|
||||
|
||||
function setHeight(val: any) {
|
||||
height.value = val;
|
||||
}
|
||||
|
||||
function setActive(val: any) {
|
||||
active.value = val;
|
||||
}
|
||||
|
||||
function setAnchorStyle(val: any) {
|
||||
anchorStyle.value = val;
|
||||
}
|
||||
|
||||
function setWrapperStyle(val: any) {
|
||||
wrapperStyle.value = val;
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
props,
|
||||
top,
|
||||
height,
|
||||
active,
|
||||
wrapperStyle,
|
||||
anchorStyle,
|
||||
setTop,
|
||||
setHeight,
|
||||
setActive,
|
||||
setAnchorStyle,
|
||||
setWrapperStyle
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '../../libs/css/style.components.scss';
|
||||
|
||||
.u-index-anchor {
|
||||
box-sizing: border-box;
|
||||
padding: 14rpx 24rpx;
|
||||
color: var(--u-content-color);
|
||||
width: 100%;
|
||||
font-weight: 500;
|
||||
font-size: 28rpx;
|
||||
line-height: 1.2;
|
||||
background-color: $u-bg-color;
|
||||
}
|
||||
|
||||
.u-index-anchor--active {
|
||||
right: 0;
|
||||
left: 0;
|
||||
color: $u-type-primary;
|
||||
background-color: var(--u-bg-white);
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user