TOB UI 组件库的核心,用于支撑组件的快速开发!
- 提高组件开发效率
- 降低组件的维护成本
- 抽离重复逻辑,缩小包体积
vue options-api 的 hack,提供 options 之外的额外常用配置
类型推断
import { $P } from 'tob-ui-core'
export default {
props: $P({
title: '',
visible: false,
}),
}
等价于
export default {
props: {
title: {
type: String,
default: '',
},
visible: {
type: Boolean,
default: false,
},
},
}
逻辑简化
props 变量替换
import { $C, $P } from 'tob-ui-core'
export default {
props: $P({
size: 'sm',
}),
computed: $C({
Size: 'text-$', // $将动态替换为props的size,即输出text-sm
}),
}
Truthy 时应用
import { $C, $P } from 'tob-ui-core'
export default {
props: $P({
theme: '',
visible: false,
}),
computed: $C({
// Theme的值只在theme为truthy时应用
// 即非空字符串时应用
Theme: 'text-dark',
// Visible的值只在visible为truthy时应用
// 即为true时应用
Visible: 'show',
}),
}
对立判断
import { $C, $P } from 'tob-ui-core'
export default {
props: $P({
dark: true,
theme: 'dark',
size: 'sm',
}),
computed: $C({
// dark为true时应用text-white,反之则应用text-dark
Dark: ['text-white', 'text-dark'],
// 判断theme是否为dark
// 是则应用text-white
// 否则应用text-dark
Theme: ['dark', 'text-white', 'text-dark'],
// 判断size是否为lg
// 是则应用text-dark
// 否则应用text-<size>,size为动态量
// 例如size为base,则Size的值为text-base
Size: ['lg', 'text-dark', 'text-$'],
}),
}
对象映射
import { $C, $P } from 'tob-ui-core'
export default {
props: $P({
color: 'info',
}),
computed: $C({
// color为对应的键时,将应用对应的值
// 例如color为info,则Color的值为text-info
// 又例如color为warning,则Color的值为text-warning
// 当color的值无对应的键对应,则取值color
// 例如color为text-dark时,则Color的值为text-dark
Color: {
info: 'text-info',
warning: 'text-warning',
error: 'bg-error text-error',
},
}),
}
原生兜底
import { $C, $P } from 'tob-ui-core'
export default {
props: $P({
color: 'info',
visible: false,
}),
computed: $C({
// 遇到函数时将走原生计算属性模式
Theme() {
const { color, visible } = this
const isDark = color === 'dark'
const canShow = isDark && visible
return canShow ? 'show' : null
},
}),
}
逻辑复用
切换模式
import { $M } from 'tob-ui-core'
export default {
data() {
return {
visible: false,
}
},
methods: $M({
toggle: true, // 开启toggle
handleClick() {
// 将对visible不断取反
this.toggle('visible')
},
show() {
// 将设置visible为true
this.toggle('visible', true)
},
hidden() {
// 将设置visible为false
this.toggle('visible', false)
},
}),
}
通用的设计系统
mixin 时设置默认,同时暴露 props 用于用户修改
该功能需要引入 👉 tob-less
颜色
默认模式
import { Color } from 'tob-ui-core'
export default {
// 深色底,白色字
mixins: [Color()],
}
高亮模式
import { Color } from 'tob-ui-core'
export default {
// 浅色底,深色字
mixins: [Color({ light: true })],
}
轮廓模式
import { Color } from 'tob-ui-core'
export default {
// 深色边框,深色字,白色底
mixins: [Color({ outline: true })],
}
预设
import { Color } from 'tob-ui-core'
export default {
mixins: [
Color({
presets: {
dark: 'text-white bg-dark',
light: 'text-dark bg-white',
},
}),
],
}
圆角
import { Rounded } from 'tob-ui-core'
export default {
mixins: [Rounded()],
}
阴影
import { Shadow } from 'tob-ui-core'
export default {
mixins: [Shadow()],
}
预设
尺寸
import { Size } from 'tob-ui-core'
export default {
mixins: [
Size({
sm: 'w-4 h-4 p-2',
base: 'w-6 h-6 p-3',
lg: 'w-8 h-8 p-3',
}),
],
}
justify与align
import { Flex } from 'tob-ui-core'
export default {
mixins: [Flex()],
methods: {
handle() {
this.Justify // 主轴属性
this.Align // 交叉轴属性
this.Direction // 主轴属性
},
},
}
vue3和vue2兼容是uniapp特有的,
非uniapp环境下仅支持vue2
import { VModel } from 'tob-ui-core'
export default {
mixins: [VModel({ value: '' })],
watch: {
// 监听v-model值变化
VModelValue(v) {
this.$emit('change', v)
},
},
methods: {
handle() {
// 获取v-model值
this.VModelValue
// 更新v-model值
this.updateVModelValue('我是更新的值')
},
},
}
副作用集合
供给 effects
import { ProvideEffects } from 'tob-ui-core'
export default {
mixins: [
ProvideEffects('Foo'),
],
methods: {
handle() {
// 获取effect
this.showEffect('custom')
// 收集effect
this.trackEffect('custom', () => 1)
// 触发effect
this.triggerEffect('custom', 100)
// 触发所有effect
this.triggerAllEffect(100)
// 清理所有effect
this.clearEffects()
// 销毁effect
this.destoryEffect('custom')
// 判断effect存在
this.hasEffect('custom')
// 获取effect数量
this.sizeEffects()
},
},
}
注入 effects
import { InjectEffects } from 'tob-ui-core'
export default {
// 必须以供给端相同的命名Foo为参数
mixins: [
InjectEffects('Foo'),
],
methods: {
handle() {
// 获取供给端effect
this.FooShowEffect('custom')
// 收集供给端effect
this.FooTrackEffect('custom', () => 1)
// 触发供给端effect
this.FooTriggerEffect('custom', 100)
// 触发供给端所有effect
this.FooTriggerAllEffect(100)
// 清理供给端所有effect
this.FooClearEffects()
// 销毁供给端effect
this.FooDestoryEffect('custom')
// 判断供给端effect存在
this.FooHasEffect('custom')
// 获取供给端effect数量
this.FooSizeEffects()
},
},
}
计数器
供给 counter
import { ProvideCounter } from 'tob-ui-core'
export default {
mixins: [
ProvideCounter('Foo'),
],
methods: {
handle() {
// 获取counter
this.counter
},
},
}
注入 counter
import { InjectCounter } from 'tob-ui-core'
export default {
// 必须以供给端相同的命名Foo为参数
mixins: [
InjectCounter('Foo'),
],
methods: {
handle() {
// 获取计数器
this.FooShowCounter()
// 计数器递增
this.FooIncCounter()
// 计数器递减
this.FooDecCounter()
// 使用计数器,从起始值递增
const zero = this.FooUseCounter() // 输出0
const one = this.FooUseCounter() // 输出1
},
},
}
暴露事件
import { Emits } from 'tob-ui-core'
export default {
mixins: [Emits(['click'])],
methods: {
handle() {
const e = '假装是$event'
// 触发点击事件
this.click(e)
},
},
}
工具库,主要用来支撑 Hack 和 Design
同时整合组件库的通用逻辑
该模块受以下技术启发
- TypeScript
- @vue/reactivity