diff --git a/docs/guide/tagged-wall.md b/docs/guide/tagged-wall.md index f0ccf45e538457947d484f525a3931722b28e05d..adfff2456c12557fc7502413ba6189e70404353a 100644 --- a/docs/guide/tagged-wall.md +++ b/docs/guide/tagged-wall.md @@ -7,13 +7,23 @@ ![效果呈现](../public/img/tagged-wall.png) ## 主要内容 + 标签墙由多个标签组件(customTag)组成。首先通过函数$RandomSplit获取一组和为列表长度的数组,后通过函数将$RandomSplit将列表数组随机排列为菱形(中间多两头少的列表)。最后通过customTag绘制。标签的字体大小和颜色由函数$Normal和函数$RandomColor随机生成。 ## 插件 该插件隶属于列表绘制插件(基于列表进行扩展),下方数据导入应用即可使用 +部件参数配置 + +| 名称 | 类型 | 说明 | +| -------------------- | ------- | ------------------------ | +| ENABLEFONTSIZERANDOM | boolean | 字体大小是否为随机 | +| RANDOMFONTSIZERANGE | object | 随机字体大小时的范围参数 {max:16,min:2} | +| DEFAULTFONTSIZE | number | 不随机时默认字号 | + ::: details 点我查看代码 + ```json [ { @@ -24,6 +34,7 @@ } ] ``` + ::: ## 配置 diff --git a/src/tagged-wall/tag.tsx b/src/tagged-wall/tag.tsx index 0434b10e337f25bd0495c19376fa270b0cd91a3c..b4045225245aeeb73a1b47fe86851ba8fe7e127f 100644 --- a/src/tagged-wall/tag.tsx +++ b/src/tagged-wall/tag.tsx @@ -1,7 +1,8 @@ -import { computed, defineComponent } from 'vue'; +import { computed, defineComponent, PropType } from 'vue'; import { useNamespace } from '@ibiz-template/vue3-util'; import { $RandomColor, $Normal } from './utils'; import './tags.scss'; +import { TaggedWallController } from './tagged-wall.controller'; export const CustomTag = defineComponent({ name: 'CustomTag', @@ -10,17 +11,20 @@ export const CustomTag = defineComponent({ type: String, required: true, }, - bgcolor: { - type: String, - }, - color: { - type: String, + controller: { + type: Object as PropType, + required: true, }, }, - setup() { + setup(props) { const ns = useNamespace('custom-tag'); const setColor = computed(() => $RandomColor()); - const normalSize = computed(() => `${$Normal(16, 8)}px`); + const normalSize = computed(() => { + if (props.controller.enableFontSizeRandom) { + return `${$Normal(props.controller.maxFontSize, props.controller.minFontSize)}px`; + } + return `${props.controller.defaultFontSize}px`; + }); return { ns, diff --git a/src/tagged-wall/tagged-wall.controller.ts b/src/tagged-wall/tagged-wall.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..31481be40d44598683f603ea4fbf86b4711ddb55 --- /dev/null +++ b/src/tagged-wall/tagged-wall.controller.ts @@ -0,0 +1,64 @@ +import { ListController } from '@ibiz-template/runtime'; +import { isNumber } from 'lodash-es'; + +export class TaggedWallController extends ListController { + /** + * 字体大小是否为随机 + * + * @author fangZhiHao + * @date 2024-08-22 15:08:22 + * @type {boolean} + */ + enableFontSizeRandom: boolean = true; + + /** + * 字体最大字号 + * + * @author fangZhiHao + * @date 2024-08-22 16:08:47 + * @type {number} + */ + maxFontSize: number = 16; + + /** + * 字体最小字号 + * + * @author fangZhiHao + * @date 2024-08-22 16:08:06 + * @type {number} + */ + minFontSize: number = 8; + + /** + * 默认字号 + * + * @author fangZhiHao + * @date 2024-08-22 16:08:51 + * @type {number} + */ + defaultFontSize: number = 16; + + protected async onCreated(): Promise { + await super.onCreated(); + + const { ENABLEFONTSIZERANDOM, RANDOMFONTSIZERANGE, DEFAULTFONTSIZE } = this + .model.controlParam?.ctrlParams as IData; + console.log(ENABLEFONTSIZERANDOM, RANDOMFONTSIZERANGE, DEFAULTFONTSIZE); + if (ENABLEFONTSIZERANDOM) { + this.enableFontSizeRandom = JSON.parse(ENABLEFONTSIZERANDOM); + } + if (RANDOMFONTSIZERANGE) { + const range = JSON.parse(RANDOMFONTSIZERANGE); + const { min, max } = range; + if (isNumber(min)) { + this.minFontSize = min; + } + if (isNumber(max)) { + this.maxFontSize = max; + } + } + if (isNumber(DEFAULTFONTSIZE)) { + this.defaultFontSize = DEFAULTFONTSIZE; + } + } +} diff --git a/src/tagged-wall/tagged-wall.tsx b/src/tagged-wall/tagged-wall.tsx index 1e40cd250be0379cfb1d477dbe0ad97004413003..839d4b88ff5c3a5dfef8df8c39041e683813721f 100644 --- a/src/tagged-wall/tagged-wall.tsx +++ b/src/tagged-wall/tagged-wall.tsx @@ -2,10 +2,11 @@ import { useControlController, useNamespace } from '@ibiz-template/vue3-util'; import { computed, defineComponent, PropType, ref, watch } from 'vue'; import { IDEList } from '@ibiz/model-core'; -import { IControlProvider, ListController } from '@ibiz-template/runtime'; +import { IControlProvider } from '@ibiz-template/runtime'; import './tagged-wall.scss'; import { $NormalSort, $RandomSplit } from './utils'; import { CustomTag } from './tag'; +import { TaggedWallController } from './tagged-wall.controller'; export const TaggedWall = defineComponent({ name: 'TaggedWall', @@ -37,7 +38,9 @@ export const TaggedWall = defineComponent({ loadDefault: { type: Boolean, default: true }, }, setup() { - const c = useControlController((...args) => new ListController(...args)); + const c = useControlController( + (...args) => new TaggedWallController(...args), + ); const ns = useNamespace(`tagged-wall`); const list = ref([]); const tagList = ref([]); @@ -83,7 +86,11 @@ export const TaggedWall = defineComponent({
{item.map(tag => { return ( - + ); })}