Merge pull request #1 from Moonofweisheng/develop

优化组件的易用性
This commit is contained in:
weisheng 2023-08-23 13:08:08 +08:00 committed by GitHub
commit b809bd5e27
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
70 changed files with 878 additions and 731 deletions

View File

@ -6,19 +6,40 @@
<p align="center">📱 一个参照<a href="https://ftf.jd.com/wot-design/">Wot-design</a>,基于 Vue3 打造的uni-app组件库</p> <p align="center">📱 一个参照<a href="https://ftf.jd.com/wot-design/">Wot-design</a>,基于 Vue3 打造的uni-app组件库</p>
<p align="center"> <p align="center">
<a href="https://github.com/Moonofweisheng/wot-design-uni">
<img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/Moonofweisheng/wot-design-uni?logo=github&color=%234d80f0&link=https%3A%2F%2Fgithub.com%2FMoonofweisheng%2Fwot-design-uni">
</a>
<a href="https://www.npmjs.com/package/wot-design-uni">
<img alt="npm" src="https://img.shields.io/npm/v/wot-design-uni?logo=npm&color=%234d80f0&link=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Fwot-design-uni">
</a>
<a href="https://www.npmjs.com/package/wot-design-uni">
<img alt="npm" src="https://img.shields.io/npm/dw/wot-design-uni?logo=npm&link=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Fwot-design-uni">
</a>
<a href="https://www.npmjs.com/package/wot-design-uni">
<img src="https://img.shields.io/npm/dt/wot-design-uni?style=flat-square">
</a>
<a href="https://github.com/Moonofweisheng/wot-design-uni">
<img alt="GitHub" src="https://img.shields.io/github/license/Moonofweisheng/wot-design-uni?logo=github">
</a>
<a href="https://app.netlify.com/sites/wot-design-uni/deploys" target="_blank" referrerpolicy="no-referrer"> <a href="https://app.netlify.com/sites/wot-design-uni/deploys" target="_blank" referrerpolicy="no-referrer">
<img src="https://api.netlify.com/api/v1/badges/0991d8a9-0fb0-483b-8961-5bde066bbd50/deploy-status" alt="deploy-status" /> <img src="https://api.netlify.com/api/v1/badges/0991d8a9-0fb0-483b-8961-5bde066bbd50/deploy-status" alt="deploy-status" />
</a> </a>
</p> </p>
<p align="center"> <p align="center">
🔥 <a href="https://wot-design-uni.netlify.app/">文档网站 (Netlify)</a> 🔥 <a href="https://wot-design-uni.netlify.app/">文档网站 (Netlify)</a>
</p> </p>
## ✨ 特性 ## ✨ 特性
- 🚀 支持 APP、H5、微信小程序、支付宝小程序、钉钉小程序 等平台. - 🚀 支持 APP、H5、微信小程序 等平台.
- 🚀 50+ 个高质量组件,覆盖移动端主流场景. - 🚀 50+ 个高质量组件,覆盖移动端主流场景.
- 💪 使用 Typescript 构建,提供良好的组件类型系统. - 💪 使用 Typescript 构建,提供良好的组件类型系统.
- 💪 采用 Vue3 最新特性,提升组件性能. - 💪 采用 Vue3 最新特性,提升组件性能.
@ -28,22 +49,13 @@
## 📱 预览 ## 📱 预览
手机扫描上的二维码访问演示: 扫描二维码访问演示:
<p> <p>
<img src="https://wot-design-uni.netlify.app/wx.jpg" width="200" height="200" style="margin-right:30px"/> <img src="https://wot-design-uni.netlify.app/wx.jpg" width="200" height="200" style="margin-right:30px"/>
<img src="https://wot-design-uni.netlify.app/alipay.png" width="200" height="200" /> <img src="https://wot-design-uni.netlify.app/alipay.png" width="200" height="200" />
</p> </p>
## 安装
```bash
yarn add wot-design-uni
```
## 快速上手 ## 快速上手
详细说明见 [快速上手](https://wot-design-uni.netlify.app/guide/quickUse.html) 详细说明见 [快速上手](https://wot-design-uni.netlify.app/guide/quickUse.html)
@ -51,5 +63,3 @@ yarn add wot-design-uni
## LICENSE ## LICENSE
[MIT](https://github.com/Moonofweisheng/wot-design-uni/blob/develop/LICENSE) [MIT](https://github.com/Moonofweisheng/wot-design-uni/blob/develop/LICENSE)

View File

@ -1,7 +1,7 @@
/* /*
* @Author: weisheng * @Author: weisheng
* @Date: 2023-07-27 10:26:09 * @Date: 2023-07-27 10:26:09
* @LastEditTime: 2023-08-01 17:31:40 * @LastEditTime: 2023-08-22 19:02:54
* @LastEditors: weisheng * @LastEditors: weisheng
* @Description: * @Description:
* @FilePath: \wot-design-uni\docs\.vitepress\config.ts * @FilePath: \wot-design-uni\docs\.vitepress\config.ts
@ -35,6 +35,7 @@ export default defineConfig({
}, },
socialLinks: [ socialLinks: [
{ icon: 'github', link: 'https://github.com/Moonofweisheng/wot-design-uni' }, { icon: 'github', link: 'https://github.com/Moonofweisheng/wot-design-uni' },
{ icon: { svg: '<svg t="1692699544299" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4184" width="200" height="200"><path d="M512 1024C230.4 1024 0 793.6 0 512S230.4 0 512 0s512 230.4 512 512-230.4 512-512 512z m259.2-569.6H480c-12.8 0-25.6 12.8-25.6 25.6v64c0 12.8 12.8 25.6 25.6 25.6h176c12.8 0 25.6 12.8 25.6 25.6v12.8c0 41.6-35.2 76.8-76.8 76.8h-240c-12.8 0-25.6-12.8-25.6-25.6V416c0-41.6 35.2-76.8 76.8-76.8h355.2c12.8 0 25.6-12.8 25.6-25.6v-64c0-12.8-12.8-25.6-25.6-25.6H416c-105.6 0-188.8 86.4-188.8 188.8V768c0 12.8 12.8 25.6 25.6 25.6h374.4c92.8 0 169.6-76.8 169.6-169.6v-144c0-12.8-12.8-25.6-25.6-25.6z" fill="#6D6D72" p-id="4185"></path></svg>' }, link: "https://gitee.com/fant-mini/wot-design-uni", ariaLabel: 'Gitee' }
], ],
search: { search: {
provider: 'algolia', provider: 'algolia',
@ -45,18 +46,61 @@ export default defineConfig({
}, },
}, },
// carbonAds: {
// code: 'CEBIEK3N',
// placement: 'vitejsdev',
// },
footer: { footer: {
message: `Released under the MIT License.`, message: `Released under the MIT License.`,
copyright: 'Copyright © 2023-present weisheng', copyright: 'Copyright © 2023-present weisheng',
}, },
nav: [ nav: [
{ text: '指南', link: '/guide/quickUse', activeMatch: '/guide/' }, {
{ text: '组件', link: '/component/button', activeMatch: '/component/' }, text: '指南', activeMatch: '/guide/', items: [
{
text: '介绍',
link: '/guide/introduction',
},
{
text: '快速上手',
link: '/guide/quickUse',
},
{
text: '定制主题',
link: '/guide/customTheme',
},
{
text: '字体',
link: '/guide/typography',
},
{
text: '更新日志',
link: '/guide/changelog',
},
{
text: '常见问题',
link: '/guide/commonProblems',
}
]
},
{
text: '组件', activeMatch: '/component/', items: [
{
text: '基础组件',
link: "/component/button",
},
{
text: "导航组件",
link: "/component/pagination"
}, {
text: "数据输入",
link: "/component/calendar",
}, {
text: "反馈组件",
link: "/component/actionSheet",
}, {
text: "数据展示",
link: "/component/badge",
}
]
},
{ text: '捐赠作者', link: '/reward/reward', activeMatch: '/reward/' }, { text: '捐赠作者', link: '/reward/reward', activeMatch: '/reward/' },
{ {

View File

@ -1,6 +1,6 @@
# 介绍 # 介绍
该组件库基于`uni-app`+`vue3`构建,根据`wot desing mini`的设计规范进行开发旨在给开发者提供统一的UI交互同时提高研发的开发效率。 `wot-design-uni`组件库基于`vue3`+`Typescript`构建,参照`wot desing`的设计规范进行开发旨在给开发者提供统一的UI交互同时提高研发的开发效率。
## 快速上手 ## 快速上手
@ -18,11 +18,15 @@
<div style="text-align: center;">支付宝扫码</div> <div style="text-align: center;">支付宝扫码</div>
</div> </div>
## 特性 ## 特性
* 50+ 组件 - 🚀 支持 APP、H5、微信小程序 等平台.
* Vue3 + TypeScript 开发 - 🚀 50+ 个高质量组件,覆盖移动端主流场景.
* 支持 APP、H5、微信小程序、支付宝小程序、钉钉小程序 等平台 - 💪 使用 Typescript 构建,提供良好的组件类型系统.
- 💪 采用 Vue3 最新特性,提升组件性能.
- 📖 提供丰富的文档和组件示例.
- 🎨 支持主题定制可以定制scss变量以及组件的样式自定义.
- 🍭 支持暗黑模式
> 使用Vue3最新特性开发持续优化体验 > 使用Vue3最新特性开发持续优化体验

View File

@ -1,12 +1,18 @@
# 快速上手 # 快速上手
本节介绍如何在`uni-app`项目中使用 `Wot Design Uni` 本节介绍如何在`uni-app`项目中安装、配置并使用 `Wot Design Uni`
## 安装 :::warning 关于安装
`Wot Design Uni`提供了`uni_modules``npm`两种安装方式,按需选择。
- 使用`uni_modules`安装无需额外配置,即插即用,但是每次更新组件库需要处理代码差异(一般直接覆盖就可以)。
- 使用`npm`安装需要配置`easycom`,更新组件库时无需处理代码差异。
:::
`Wot Design Uni` 支持 uni_modules 规范,已经上架到 uni-app 的插件市场,故我们推荐使用 uni_modules 的方式引入,方便更新。 ## uni_modules 安装
`uni-app插件市场`选择使用`HBuildX`导入或者选择手动在src目录下创建uni_modules文件夹并将Wot Design Uni解压到uni_modules中结构如下: `Wot Design Uni` 支持 [uni_modules](https://uniapp.dcloud.net.cn/plugin/uni_modules.html#uni-modules) 规范,已经上架到 uni-app 的插件市场,故我们推荐使用 uni_modules 的方式引入,方便更新。
`uni-app插件市场`选择使用`HBuildX`导入或者选择手动在src目录下创建uni_modules文件夹并将`Wot Design Uni`解压到uni_modules中结构如下:
``` ```
- uni_modules - uni_modules
- - - wot-design-uni - - - wot-design-uni
@ -15,8 +21,71 @@
下载地址:<a href="https://ext.dcloud.net.cn/plugin?id=13889"><span >wot-design-uni</span></a> 下载地址:<a href="https://ext.dcloud.net.cn/plugin?id=13889"><span >wot-design-uni</span></a>
## npm 安装
::: code-group
```bash [npm]
npm i wot-design-uni
```
```bash [yarn]
yarn add wot-design-uni
```
```bash [pnpm]
pnpm add wot-design-uni
```
:::
### 配置easycom
传统vue组件需要安装、引用、注册三个步骤后才能使用组件。`easycom`将其精简为一步。
只要组件路径符合规范(具体见[easycom](https://uniapp.dcloud.net.cn/collocation/pages.html#easycom)),就可以不用引用、注册,直接在页面中使用。
:::tip 温馨提醒
- uni-app 考虑到编译速度,直接在`pages.json`内修改`easycom`不会触发重新编译,需要改动页面内容触发。
- 请确保您的pages.json中只有一个easycom字段否则请自行合并多个引入规则。
:::
```JSON
// pages.json
{
"easycom": {
"autoscan": true,
"custom": {
"^wd-(.*)": "wot-design-uni/components/wd-$1/wd-$1.vue"
}
},
// 此为本身已有的内容
"pages": [
// ......
]
}
```
## Volar 支持
如果您使用 `Volar`,请在 `tsconfig.json` 中通过 `compilerOptions.type` 指定全局组件类型。
:::tip
cli项目使用`uni_modules`安装无需配置,对`Volar`的支持自动生效,`HbuildX`项目不支持此配置,故此步骤仅在`cli`项目使用`npm`安装时需要配置。
:::
```json
// tsconfig.json
{
"compilerOptions": {
"types": ["wot-design-uni/global.d.ts"]
}
}
```
## 使用 ## 使用
`Wot Design Uni`的组件支持easycom规范故可以直接在.vue中使用无需在页面内import也不需要在components内声明即可在任意页面使用。值得注意的是uni-app平台不支持全局挂载组件所以```Message```、```Toast```等组件仍需在SFC中显式使用例如: `Wot Design Uni`安装完成之后支持easycom规范故可以直接在SFC中使用无需在页面内import也不需要在components内声明即可在任意页面使用。值得注意的是`uni-app`平台不支持全局挂载组件,所以```Message```、```Toast```等组件仍需在SFC中显式使用例如:
``` html ``` html
<wd-toast></wd-toast> <wd-toast></wd-toast>
``` ```
:::tip 温馨提醒
使用uni_modules 安装时`Wot Design Uni`的组件天然支持`easycom`规范无需额外配置而使用npm安装需要自行配置`easycom`
:::

View File

@ -25,7 +25,7 @@ hero:
features: features:
- icon: 🚀 - icon: 🚀
title: 多平台覆盖 title: 多平台覆盖
details: 支持 APP、H5、微信小程序、支付宝小程序、钉钉小程序 等平台。 details: 支持 APP、H5、微信小程序 等平台。
- icon: 🚀 - icon: 🚀
title: 50+ 组件 title: 50+ 组件
details: 超过50个高质量组件覆盖移动端主流场景。 details: 超过50个高质量组件覆盖移动端主流场景。

View File

@ -22,7 +22,6 @@
<title></title> <title></title>
<!--preload-links--> <!--preload-links-->
<!--app-context--> <!--app-context-->
<script src="https://cdn.jsdelivr.net/npm/@vant/touch-emulator"></script>
</head> </head>
<body> <body>
<div id="app"><!--app-html--></div> <div id="app"><!--app-html--></div>

View File

@ -82,6 +82,7 @@
"@typescript-eslint/eslint-plugin": "^5.55.0", "@typescript-eslint/eslint-plugin": "^5.55.0",
"@typescript-eslint/parser": "^5.55.0", "@typescript-eslint/parser": "^5.55.0",
"@vant/area-data": "^1.4.1", "@vant/area-data": "^1.4.1",
"@vant/touch-emulator": "^1.4.0",
"@vue/tsconfig": "^0.1.3", "@vue/tsconfig": "^0.1.3",
"eslint": "^8.36.0", "eslint": "^8.36.0",
"eslint-config-prettier": "^8.7.0", "eslint-config-prettier": "^8.7.0",

View File

@ -29,16 +29,18 @@ import { ref, watch } from 'vue'
interface Props { interface Props {
customClass?: string customClass?: string
title: string title?: string
ver: number ver?: number
hor: number hor?: number
transparent: boolean transparent?: boolean
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
title: '',
customClass: '', customClass: '',
ver: 10, ver: 10,
hor: 15 hor: 15,
transparent: false
}) })
const style = ref<string>('') const style = ref<string>('')

View File

@ -1,7 +1,7 @@
/* /*
* @Author: weisheng * @Author: weisheng
* @Date: 2023-03-09 19:23:03 * @Date: 2023-03-09 19:23:03
* @LastEditTime: 2023-06-10 23:01:56 * @LastEditTime: 2023-08-22 23:02:46
* @LastEditors: weisheng * @LastEditors: weisheng
* @Description: * @Description:
* @FilePath: \wot-design-uni\src\main.ts * @FilePath: \wot-design-uni\src\main.ts
@ -9,9 +9,13 @@
*/ */
import { createSSRApp } from 'vue' import { createSSRApp } from 'vue'
import App from './App.vue' import App from './App.vue'
// #ifdef H5
import '@vant/touch-emulator'
// #endif
export function createApp() { export function createApp() {
const app = createSSRApp(App) const app = createSSRApp(App)
app.config.warnHandler = () => null // app.config.warnHandler = () => null
return { return {
app app
} }

View File

@ -1,7 +1,6 @@
<template> <template>
<page-wraper> <page-wraper>
<wd-message-box></wd-message-box> <wd-message-box></wd-message-box>
<wd-toast></wd-toast>
<wd-message-box selector="wd-message-box-slot" use-slot> <wd-message-box selector="wd-message-box-slot" use-slot>
<wd-rate custom-class="custom-rate-class" v-model="value" /> <wd-rate custom-class="custom-rate-class" v-model="value" />
</wd-message-box> </wd-message-box>
@ -31,7 +30,7 @@
</page-wraper> </page-wraper>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { useMessage } from '@/uni_modules/wot-design-uni/components/wd-message-box' import { useMessage } from '@/uni_modules/wot-design-uni'
import { ref } from 'vue' import { ref } from 'vue'
const value = ref<number>(1) const value = ref<number>(1)
const value1 = ref<string>('') const value1 = ref<string>('')

View File

@ -44,7 +44,9 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref } from 'vue' import { ref } from 'vue'
import { clickOut } from '@/uni_modules/wot-design-uni' import { clickOut, useToast } from '@/uni_modules/wot-design-uni'
const toast = useToast()
function clickoutside() { function clickoutside() {
clickOut.closeOutside() clickOut.closeOutside()

View File

@ -2,8 +2,8 @@ import { getCurrentInstance, inject, nextTick, onBeforeMount, onMounted, ref, wa
export function useCell() { export function useCell() {
const border = ref<boolean>(false) // 是否展示边框 const border = ref<boolean>(false) // 是否展示边框
const cellGroup: any = inject('cell-group') || {} const cellGroup: any = inject('cell-group', null) || {}
const cellList: any = inject('cell-list') || ref<any[]>([]) const cellList: any = inject('cell-list', null) || ref<any[]>([])
const { proxy } = getCurrentInstance() as any const { proxy } = getCurrentInstance() as any
watch( watch(

View File

@ -94,16 +94,16 @@ interface Props {
customClass?: string customClass?: string
customHeaderClass?: string customHeaderClass?: string
show: boolean show: boolean
actions: Array<Action> actions?: Array<Action>
panels: Array<Panel> panels?: Array<Panel>
title?: string title?: string
cancelText?: string cancelText?: string
closeOnClickAction: boolean closeOnClickAction?: boolean
closeOnClickModal: boolean closeOnClickModal?: boolean
duration: number duration?: number
zIndex: number zIndex?: number
lazyRender: boolean lazyRender?: boolean
safeAreaInsetBottom: boolean safeAreaInsetBottom?: boolean
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -1,7 +1,7 @@
<!-- <!--
* @Author: weisheng * @Author: weisheng
* @Date: 2023-06-12 18:40:59 * @Date: 2023-06-12 18:40:59
* @LastEditTime: 2023-08-15 15:47:51 * @LastEditTime: 2023-08-22 23:23:37
* @LastEditors: weisheng * @LastEditors: weisheng
* @Description: * @Description:
* @FilePath: \wot-design-uni\src\uni_modules\wot-design-uni\components\wd-badge\wd-badge.vue * @FilePath: \wot-design-uni\src\uni_modules\wot-design-uni\components\wd-badge\wd-badge.vue
@ -33,7 +33,7 @@ export default {
import { computed, ref, watch } from 'vue' import { computed, ref, watch } from 'vue'
type BadgeType = 'primary' | 'success' | 'warning' | 'danger' | 'info' type BadgeType = 'primary' | 'success' | 'warning' | 'danger' | 'info'
interface Props { interface Props {
modelValue: number | string | null modelValue?: number | string | null
bgColor?: string bgColor?: string
max?: number max?: number
isDot?: boolean isDot?: boolean
@ -41,7 +41,7 @@ interface Props {
type?: BadgeType type?: BadgeType
top?: number top?: number
right?: number right?: number
customClass: string customClass?: string
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
customClass: '', customClass: '',

View File

@ -71,15 +71,15 @@ type ButtonType = 'primary' | 'success' | 'info' | 'warning' | 'error' | 'defaul
type ButtonSize = 'small' | 'medium' | 'large' type ButtonSize = 'small' | 'medium' | 'large'
interface Props { interface Props {
plain: boolean plain?: boolean
disabled: boolean disabled?: boolean
round: boolean round?: boolean
suck: boolean suck?: boolean
block: boolean block?: boolean
type: ButtonType type?: ButtonType
size: ButtonSize size?: ButtonSize
icon?: string icon?: string
loading: boolean loading?: boolean
loadingColor?: string loadingColor?: string
openType?: string openType?: string
formType?: string formType?: string
@ -91,8 +91,8 @@ interface Props {
sendMessageImg?: string sendMessageImg?: string
appParameter?: string appParameter?: string
showMessageCard?: boolean showMessageCard?: boolean
customClass: string customClass?: string
customStyle: string customStyle?: string
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
type: 'primary', type: 'primary',

View File

@ -1,6 +1,7 @@
<template> <template>
<view>
<wd-toast selector="wd-month" /> <wd-toast selector="wd-month" />
<view class="month" :data-date="date"> <view class="month">
<view class="wd-month"> <view class="wd-month">
<view class="wd-month__title">{{ monthTitle(date) }}</view> <view class="wd-month__title">{{ monthTitle(date) }}</view>
<view class="wd-month__days"> <view class="wd-month__days">
@ -22,6 +23,7 @@
</view> </view>
</view> </view>
</view> </view>
</view>
</template> </template>
<script lang="ts"> <script lang="ts">
@ -61,7 +63,7 @@ interface Props {
formatter?: Function formatter?: Function
maxRange?: number maxRange?: number
rangePrompt?: string rangePrompt?: string
allowSameDay: boolean allowSameDay?: boolean
defaultTime: Array<number> defaultTime: Array<number>
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -78,13 +78,13 @@ interface Props {
formatter?: Function formatter?: Function
maxRange?: number maxRange?: number
rangePrompt?: string rangePrompt?: string
allowSameDay: boolean allowSameDay?: boolean
showPanelTitle: boolean showPanelTitle?: boolean
defaultTime: Array<number> defaultTime: Array<number>
panelHeight: number panelHeight: number
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types
timeFilter?: Function timeFilter?: Function
hideSecond: boolean hideSecond?: boolean
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
allowSameDay: false, allowSameDay: false,

View File

@ -63,13 +63,13 @@ interface Props {
// 13 // 13
modelValue: number | Array<number> | null modelValue: number | Array<number> | null
// //
type: CalendarType type?: CalendarType
// 13 // 13
minDate: number minDate?: number
// 13 // 13
maxDate: number maxDate?: number
// //
firstDayOfWeek: number firstDayOfWeek?: number
// //
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types
formatter?: Function formatter?: Function
@ -78,18 +78,18 @@ interface Props {
// type // type
rangePrompt?: string rangePrompt?: string
// type // type
allowSameDay: boolean allowSameDay?: boolean
// //
showPanelTitle: boolean showPanelTitle?: boolean
// 使 // 使
defaultTime: string | Array<string> defaultTime?: string | Array<string>
// //
panelHeight: number panelHeight?: number
// type 'datetime' 'datetimerange' // type 'datetime' 'datetimerange'
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types
timeFilter?: Function timeFilter?: Function
// type 'datetime' 'datetimerange' // type 'datetime' 'datetimerange'
hideSecond: boolean hideSecond?: boolean
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
customClass: '', customClass: '',

View File

@ -43,7 +43,7 @@ interface Props {
formatter?: Function formatter?: Function
maxRange?: number maxRange?: number
rangePrompt?: string rangePrompt?: string
allowSameDay: boolean allowSameDay?: boolean
defaultTime: Array<number> defaultTime: Array<number>
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -48,8 +48,8 @@ interface Props {
formatter?: Function formatter?: Function
maxRange?: number maxRange?: number
rangePrompt?: string rangePrompt?: string
allowSameDay: boolean allowSameDay?: boolean
showPanelTitle: boolean showPanelTitle?: boolean
defaultTime: Array<number> defaultTime: Array<number>
panelHeight: number panelHeight: number
} }
@ -61,11 +61,6 @@ const props = withDefaults(defineProps<Props>(), {
const title = ref<string>('') const title = ref<string>('')
const scrollTop = ref<number>(0) // const scrollTop = ref<number>(0) //
const scrollIntoViewValue = ref<string>('')
let contentObserver: null | UniApp.IntersectionObserver = null
const instance = getCurrentInstance() as any
// //
const scrollHeight = computed(() => { const scrollHeight = computed(() => {
const scrollHeight: number = (props.panelHeight || 378) + (props.showPanelTitle ? 26 : 16) const scrollHeight: number = (props.panelHeight || 378) + (props.showPanelTitle ? 26 : 16)

View File

@ -45,8 +45,8 @@ interface Props {
customClass?: string customClass?: string
title?: string title?: string
value?: string value?: string
useSlot: boolean useSlot?: boolean
border: boolean border?: boolean
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
useSlot: false, useSlot: false,

View File

@ -64,15 +64,15 @@ interface Props {
value?: string value?: string
icon?: string icon?: string
label?: string label?: string
isLink: boolean isLink?: boolean
to?: string to?: string
replace: boolean replace?: boolean
clickable: boolean clickable?: boolean
size?: string size?: string
titleWidth?: string titleWidth?: string
center: boolean center?: boolean
required: boolean required?: boolean
vertical: boolean vertical?: boolean
customClass?: string customClass?: string
customIconClass?: string customIconClass?: string
customLabelClass?: string customLabelClass?: string
@ -81,6 +81,7 @@ interface Props {
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
customClass: '',
customIconClass: '', customIconClass: '',
customLabelClass: '', customLabelClass: '',
customValueClass: '', customValueClass: '',

View File

@ -22,13 +22,13 @@ type checkShape = 'circle' | 'square' | 'button'
interface Props { interface Props {
customClass?: string customClass?: string
modelValue: Array<string | number | boolean> modelValue: Array<string | number | boolean>
cell: boolean cell?: boolean
shape: checkShape shape?: checkShape
checkedColor: string checkedColor?: string
disabled: boolean disabled?: boolean
min: number min?: number
max: number max?: number
inline: boolean inline?: boolean
size?: string size?: string
name?: string name?: string
} }

View File

@ -50,11 +50,11 @@ interface Props {
customShapeClass?: string customShapeClass?: string
customClass?: string customClass?: string
modelValue: string | number | boolean modelValue: string | number | boolean
shape: checkShape shape?: checkShape
checkedColor?: string checkedColor?: string
disabled: boolean | null disabled?: boolean | null
trueValue: string | number | boolean trueValue?: string | number | boolean
falseValue: string | number | boolean falseValue?: string | number | boolean
size?: string size?: string
maxWidth?: string maxWidth?: string
} }
@ -75,7 +75,7 @@ const inited = ref<boolean>(false)
// last-childfirst-child // last-childfirst-child
const isFirst = ref<boolean>(false) const isFirst = ref<boolean>(false)
const isLast = ref<boolean>(false) const isLast = ref<boolean>(false)
const parent = inject<any>('checkGroup') const parent = inject<any>('checkGroup', null)
const { proxy } = getCurrentInstance() as any const { proxy } = getCurrentInstance() as any
watch( watch(

View File

@ -104,12 +104,12 @@ interface Props {
modelValue: Array<Record<string, any>> modelValue: Array<Record<string, any>>
columns: Array<Array<Record<string, any>>> columns: Array<Array<Record<string, any>>>
label?: string label?: string
labelWidth: string labelWidth?: string
useLabelSlot: boolean useLabelSlot?: boolean
useDefaultSlot: boolean useDefaultSlot?: boolean
disabled: boolean disabled?: boolean
readonly: boolean readonly?: boolean
placeholder: string placeholder?: string
title?: string title?: string
// item resolve finish // item resolve finish
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types
@ -119,19 +119,19 @@ interface Props {
displayFormat?: Function displayFormat?: Function
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types
beforeConfirm?: Function beforeConfirm?: Function
alignRight: boolean alignRight?: boolean
error: boolean error?: boolean
required: boolean required?: boolean
size?: string size?: string
valueKey: string valueKey?: string
labelKey: string labelKey?: string
tipKey: string tipKey?: string
loadingColor: string loadingColor?: string
closeOnClickModal: boolean closeOnClickModal?: boolean
autoComplete: boolean autoComplete?: boolean
zIndex: number zIndex?: number
safeAreaInsetBottom: boolean safeAreaInsetBottom?: boolean
ellipsis: boolean ellipsis?: boolean
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -1,7 +1,7 @@
<!-- <!--
* @Author: weisheng * @Author: weisheng
* @Date: 2023-06-13 11:34:35 * @Date: 2023-06-13 11:34:35
* @LastEditTime: 2023-08-15 13:06:34 * @LastEditTime: 2023-08-22 22:26:37
* @LastEditors: weisheng * @LastEditors: weisheng
* @Description: * @Description:
* @FilePath: \wot-design-uni\src\uni_modules\wot-design-uni\components\wd-col\wd-col.vue * @FilePath: \wot-design-uni\src\uni_modules\wot-design-uni\components\wd-col\wd-col.vue
@ -35,7 +35,8 @@ interface Props {
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
span: 24, span: 24,
offset: 0 offset: 0,
customClass: ''
}) })
const style = ref<string>('') const style = ref<string>('')

View File

@ -1,7 +1,7 @@
<!-- <!--
* @Author: weisheng * @Author: weisheng
* @Date: 2023-08-01 11:12:05 * @Date: 2023-08-01 11:12:05
* @LastEditTime: 2023-08-15 16:30:17 * @LastEditTime: 2023-08-22 22:28:28
* @LastEditors: weisheng * @LastEditors: weisheng
* @Description: * @Description:
* @FilePath: \wot-design-uni\src\uni_modules\wot-design-uni\components\wd-collapse-item\wd-collapse-item.vue * @FilePath: \wot-design-uni\src\uni_modules\wot-design-uni\components\wd-collapse-item\wd-collapse-item.vue
@ -41,7 +41,7 @@ const $body = '.wd-collapse-item__body'
interface Props { interface Props {
customClass?: string customClass?: string
title?: string title?: string
disabled: boolean disabled?: boolean
name: string name: string
// false Promise // false Promise
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types

View File

@ -1,7 +1,7 @@
<!-- <!--
* @Author: weisheng * @Author: weisheng
* @Date: 2023-08-01 11:12:05 * @Date: 2023-08-01 11:12:05
* @LastEditTime: 2023-08-04 13:34:15 * @LastEditTime: 2023-08-22 22:28:17
* @LastEditors: weisheng * @LastEditors: weisheng
* @Description: * @Description:
* @FilePath: \wot-design-uni\src\uni_modules\wot-design-uni\components\wd-collapse\wd-collapse.vue * @FilePath: \wot-design-uni\src\uni_modules\wot-design-uni\components\wd-collapse\wd-collapse.vue
@ -58,10 +58,10 @@ interface Props {
customClass?: string customClass?: string
customMoreSlotClass?: string customMoreSlotClass?: string
modelValue: string | Array<string> | boolean modelValue: string | Array<string> | boolean
accordion: boolean accordion?: boolean
viewmore: boolean viewmore?: boolean
useMoreSlot: boolean useMoreSlot?: boolean
lineNum: number lineNum?: number
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -28,8 +28,8 @@ export default {
import { computed } from 'vue' import { computed } from 'vue'
type ConfigProviderTheme = 'light' | 'dark' type ConfigProviderTheme = 'light' | 'dark'
interface Props { interface Props {
theme: ConfigProviderTheme theme?: ConfigProviderTheme
themeVars: Record<string, any> themeVars?: Record<string, any>
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -6,14 +6,13 @@
position="center" position="center"
:close-on-click-modal="closeOnClickModal" :close-on-click-modal="closeOnClickModal"
:hide-when-close="hideWhenClose" :hide-when-close="hideWhenClose"
@beforeenter="beforeenter" @before-enter="beforeenter"
@enter="enter" @enter="enter"
@afterenter="afterenter" @after-enter="afterenter"
@beforeleave="beforeleave" @before-leave="beforeleave"
@leave="leave" @leave="leave"
@afterleave="afterleave" @after-leave="afterleave"
@close="close" @close="close"
@closed="closed"
@clickmodal="clickModal" @clickmodal="clickModal"
:custom-class="`wd-curtain ${customClass}`" :custom-class="`wd-curtain ${customClass}`"
> >
@ -42,12 +41,12 @@ type ClosePosition = 'inset' | 'top' | 'bottom' | 'top-left' | 'top-right' | 'bo
interface Props { interface Props {
customClass?: string customClass?: string
value: boolean value: boolean
closePosition: ClosePosition closePosition?: ClosePosition
src?: string src?: string
to?: string to?: string
width?: number width?: number
closeOnClickModal: boolean closeOnClickModal?: boolean
hideWhenClose: boolean hideWhenClose?: boolean
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
@ -139,6 +138,7 @@ function leave() {
function afterleave() { function afterleave() {
emit('afterleave') emit('afterleave')
emit('closed')
} }
function close() { function close() {
@ -146,10 +146,6 @@ function close() {
emit('close') emit('close')
} }
function closed() {
emit('closed')
}
function clickModal() { function clickModal() {
emit('clickmodal') emit('clickmodal')
} }

View File

@ -63,17 +63,17 @@ interface Props {
modelValue: string | number | Date modelValue: string | number | Date
// PickerViewProps // PickerViewProps
// //
loading: boolean loading?: boolean
loadingColor: string loadingColor?: string
// //
columnsHeight: number columnsHeight?: number
// value key // value key
valueKey: string valueKey?: string
// key // key
labelKey: string labelKey?: string
// PickerViewProps // PickerViewProps
// //
type: DateTimeType type?: DateTimeType
// //
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types
filter?: Function filter?: Function
@ -84,18 +84,18 @@ interface Props {
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types
columnFormatter?: Function columnFormatter?: Function
// 20(x-10)11 // 20(x-10)11
minDate: number minDate?: number
// 20(x+10)11 // 20(x+10)11
maxDate: number maxDate?: number
// //
minHour: number minHour?: number
// //
maxHour: number maxHour?: number
// //
minMinute: number minMinute?: number
// //
maxMinute: number maxMinute?: number
startSymbol: boolean startSymbol?: boolean
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -138,60 +138,60 @@ import { deepClone, getType, isArray, isDef, isEqual, padZero } from '../common/
import { useCell } from '../mixins/useCell' import { useCell } from '../mixins/useCell'
import { DateTimeType, getPickerValue } from '../wd-datetime-picker-view/type' import { DateTimeType, getPickerValue } from '../wd-datetime-picker-view/type'
interface Props { interface Props {
customClass: string customClass?: string
customViewClass: string customViewClass?: string
customLabelClass: string customLabelClass?: string
customValueClass: string customValueClass?: string
// //
label?: string label?: string
// //
placeholder: string placeholder?: string
// //
disabled: boolean disabled?: boolean
// //
readonly: boolean readonly?: boolean
loading: boolean loading?: boolean
loadingColor: string loadingColor?: string
/* popup */ /* popup */
// //
title?: string title?: string
// //
cancelButtonText: string cancelButtonText?: string
// //
confirmButtonText: string confirmButtonText?: string
// //
required: boolean required?: boolean
size?: string size?: string
labelWidth: string labelWidth?: string
useDefaultSlot: boolean useDefaultSlot?: boolean
useLabelSlot: boolean useLabelSlot?: boolean
error: boolean error?: boolean
alignRight: boolean alignRight?: boolean
closeOnClickModal: boolean closeOnClickModal?: boolean
safeAreaInsetBottom: boolean safeAreaInsetBottom?: boolean
ellipsis: boolean ellipsis?: boolean
// //
columnsHeight: number columnsHeight?: number
// value key // value key
valueKey: string valueKey?: string
// key // key
labelKey: string labelKey?: string
// type time // type time
modelValue: string | number | Date | Array<string | number | Date> modelValue: string | number | Date | Array<string | number | Date>
// //
type: DateTimeType type?: DateTimeType
// 20(x-10)11 // 20(x-10)11
minDate: number minDate?: number
// 20(x+10)11 // 20(x+10)11
maxDate: number maxDate?: number
// //
minHour: number minHour?: number
// //
maxHour: number maxHour?: number
// //
minMinute: number minMinute?: number
// //
maxMinute: number maxMinute?: number
// //
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types
filter?: Function filter?: Function
@ -208,7 +208,7 @@ interface Props {
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types
displayFormatTabLabel?: Function displayFormatTabLabel?: Function
defaultValue?: string | number | Date | Array<string | number | Date> defaultValue?: string | number | Date | Array<string | number | Date>
zIndex: number zIndex?: number
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -21,7 +21,7 @@ export default {
<script lang="ts" setup> <script lang="ts" setup>
interface Props { interface Props {
customClass?: string customClass?: string
color: string color?: string
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -61,14 +61,14 @@ interface Props {
// value // value
modelValue?: string | number modelValue?: string | number
// array || String // array || String
options: Array<Record<string, any>> options?: Array<Record<string, any>>
useDropItemSlot: boolean useDropItemSlot?: boolean
disabled: boolean disabled?: boolean
iconName: string iconName?: string
title?: string title?: string
valueKey: string valueKey?: string
labelKey: string labelKey?: string
tipKey: string tipKey?: string
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -34,13 +34,13 @@ import { getRect } from '../common/util'
type DropDirction = 'up' | 'down' type DropDirction = 'up' | 'down'
interface Props { interface Props {
customClass: string customClass?: string
customStyle: string customStyle?: string
zIndex: number zIndex?: number
direction: DropDirction direction?: DropDirction
modal: boolean modal?: boolean
closeOnClickModal: boolean closeOnClickModal?: boolean
duration: number duration?: number
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -37,16 +37,16 @@ interface Props {
customText?: string customText?: string
customIcon?: string customIcon?: string
customClass?: string customClass?: string
icon: string icon?: string
iconSize: string iconSize?: string
text?: string text?: string
url?: string url?: string
linkType: LinkType linkType?: LinkType
useSlot: boolean useSlot?: boolean
useIconSlot: boolean useIconSlot?: boolean
useTextSlot: boolean useTextSlot?: boolean
// badge // badge
isDot: boolean isDot?: boolean
type?: BadgeType type?: BadgeType
value?: number value?: number
max?: number max?: number

View File

@ -22,11 +22,11 @@ const nextTick = () => new Promise((resolve) => setTimeout(resolve, 20))
interface Props { interface Props {
customClass?: string customClass?: string
clickable: boolean clickable?: boolean
square: boolean square?: boolean
column?: number column?: number
border: boolean border?: boolean
bgColor: string bgColor?: string
gutter?: number gutter?: number
} }

View File

@ -96,26 +96,26 @@ const TOP_PERCENT = 0.85
interface Props { interface Props {
customClass?: string customClass?: string
modelValue: boolean modelValue: boolean
cancelButtonText: string cancelButtonText?: string
confirmButtonText: string confirmButtonText?: string
// //
disabledRotate: boolean disabledRotate?: boolean
/** canvas绘图参数 start **/ /** canvas绘图参数 start **/
// canvasToTempFilePath fileType // canvasToTempFilePath fileType
fileType: string fileType?: string
// canvasToTempFilePath quality // canvasToTempFilePath quality
quality: number quality?: number
// //
exportScale: number exportScale?: number
/** canvas绘图参数 end **/ /** canvas绘图参数 end **/
// //
imgSrc: string imgSrc?: string
// //
imgWidth: string | number imgWidth?: string | number
// //
imgHeight: string | number imgHeight?: string | number
// //
maxScale: number maxScale?: number
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
@ -646,7 +646,7 @@ defineExpose({
}) })
</script> </script>
<!-- #ifdef MP-WEIXIN || MP-QQ --> <!-- #ifdef MP-WEIXIN || MP-QQ || H5 -->
<script module="animation" lang="wxs"> <script module="animation" lang="wxs">
function setAnimation(newValue, oldValue, ownerInstance){ function setAnimation(newValue, oldValue, ownerInstance){

View File

@ -1,7 +1,7 @@
<!-- <!--
* @Author: weisheng * @Author: weisheng
* @Date: 2023-06-12 10:04:19 * @Date: 2023-06-12 10:04:19
* @LastEditTime: 2023-08-15 13:11:35 * @LastEditTime: 2023-08-22 22:37:02
* @LastEditors: weisheng * @LastEditors: weisheng
* @Description: * @Description:
* @FilePath: \wot-design-uni\src\uni_modules\wot-design-uni\components\wd-img\wd-img.vue * @FilePath: \wot-design-uni\src\uni_modules\wot-design-uni\components\wd-img\wd-img.vue
@ -32,9 +32,9 @@ interface Props {
customStyle?: string customStyle?: string
customImage?: string customImage?: string
src: string src: string
round: boolean round?: boolean
mode: string mode?: string
lazyLoad: boolean lazyLoad?: boolean
width?: string | number width?: string | number
height?: string | number height?: string | number
} }

View File

@ -41,17 +41,17 @@ import { debounce, getType } from '../common/util'
interface Props { interface Props {
customClass?: string customClass?: string
modelValue: number | string modelValue: number | string
min: number min?: number
max: number max?: number
step: number step?: number
stepStrictly: boolean stepStrictly?: boolean
precision: number precision?: number
disabled: boolean disabled?: boolean
withoutInput: boolean withoutInput?: boolean
inputWidth: string | number inputWidth?: string | number
allowNull: boolean allowNull?: boolean
placeholder: string placeholder?: string
name: string name?: string
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -141,55 +141,55 @@ import { objToStyle, requestAnimationFrame } from '../common/util'
import { useCell } from '../mixins/useCell' import { useCell } from '../mixins/useCell'
interface Props { interface Props {
customTextareaContainerClass: string customTextareaContainerClass?: string
customTextareaClass: string customTextareaClass?: string
customInputClass: string customInputClass?: string
customLabelClass: string customLabelClass?: string
customClass: string customClass?: string
customStyle: string customStyle?: string
// //
placeholder: string placeholder?: string
placeholderStyle?: string placeholderStyle?: string
placeholderClass: string placeholderClass?: string
autoHeight: boolean autoHeight?: boolean
fixed: boolean fixed?: boolean
cursorSpacing: number cursorSpacing?: number
cursor: number cursor?: number
showConfirmBar: boolean showConfirmBar?: boolean
selectionStart: number selectionStart?: number
selectionEnd: number selectionEnd?: number
adjustPosition: boolean adjustPosition?: boolean
holdKeyboard: boolean holdKeyboard?: boolean
confirmType: string confirmType?: string
confirmHold: boolean confirmHold?: boolean
focus: boolean focus?: boolean
type: string type?: string
maxlength: number maxlength?: number
disabled: boolean disabled?: boolean
alignRight: boolean alignRight?: boolean
// //
modelValue: string | number modelValue: string | number
minlength?: number minlength?: number
showPassword: boolean showPassword?: boolean
clearable: boolean clearable?: boolean
showClear: boolean showClear?: boolean
readonly: boolean readonly?: boolean
useSuffixSlot: boolean useSuffixSlot?: boolean
usePrefixSlot: boolean usePrefixSlot?: boolean
prefixIcon?: string prefixIcon?: string
suffixIcon?: string suffixIcon?: string
showWordLimit: boolean showWordLimit?: boolean
showWordCount: boolean showWordCount?: boolean
suffix?: string suffix?: string
suffixCount?: number suffixCount?: number
label?: string label?: string
labelWidth: string labelWidth?: string
useLabelSlot: boolean useLabelSlot?: boolean
size?: string size?: string
error: boolean error?: boolean
center: boolean center?: boolean
noBorder: boolean noBorder?: boolean
required: boolean required?: boolean
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -23,15 +23,16 @@ export default {
<script lang="ts" setup> <script lang="ts" setup>
interface Props { interface Props {
show: boolean show: boolean
duration: Record<string, number> | number | boolean duration?: Record<string, number> | number | boolean
zIndex: number zIndex?: number
customStyle?: string customStyle?: string
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
show: false, show: false,
duration: 300, duration: 300,
zIndex: 10 zIndex: 10,
customStyle: ''
}) })
const emit = defineEmits(['click']) const emit = defineEmits(['click'])

View File

@ -36,12 +36,12 @@ type NoticeBarType = 'warning' | 'info' | 'danger' | ''
interface Props { interface Props {
customClass?: string customClass?: string
text?: string text?: string
type: NoticeBarType type?: NoticeBarType
scrollable: boolean scrollable?: boolean
delay: number delay?: number
speed: number speed?: number
closable: boolean closable?: boolean
wrapable: boolean wrapable?: boolean
prefix?: string prefix?: string
color?: string color?: string
backgroundColor?: string backgroundColor?: string

View File

@ -57,14 +57,14 @@ import { ref, watch } from 'vue'
interface Props { interface Props {
customClass?: string customClass?: string
modelValue: number // modelValue: number //
totalPage: number totalPage?: number
showIcon: boolean // Icon showIcon?: boolean // Icon
showMessage: boolean showMessage?: boolean
total: number total?: number
pageSize: number pageSize?: number
prevText: string prevText?: string
nextText: string nextText?: string
hideIfOnePage: boolean hideIfOnePage?: boolean
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -49,14 +49,14 @@ import { ColumnItem, formatArray } from './type'
interface Props { interface Props {
customClass?: string customClass?: string
// //
loading: boolean loading?: boolean
loadingColor: string loadingColor?: string
// //
columnsHeight: number columnsHeight?: number
// value key // value key
valueKey: string valueKey?: string
// key // key
labelKey: string labelKey?: string
// //
modelValue: string | number | boolean | Array<string | number | boolean> modelValue: string | number | boolean | Array<string | number | boolean>
// //

View File

@ -91,44 +91,44 @@ interface Props {
// //
label?: string label?: string
// //
placeholder: string placeholder?: string
// //
disabled: boolean disabled?: boolean
// //
readonly: boolean readonly?: boolean
loading: boolean loading?: boolean
loadingColor: string loadingColor?: string
/* popup */ /* popup */
// //
title?: string title?: string
// //
cancelButtonText: string cancelButtonText?: string
// //
confirmButtonText: string confirmButtonText?: string
// //
required: boolean required?: boolean
size?: string size?: string
labelWidth?: string labelWidth?: string
useDefaultSlot: boolean useDefaultSlot?: boolean
useLabelSlot: boolean useLabelSlot?: boolean
error: boolean error?: boolean
alignRight: boolean alignRight?: boolean
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types
beforeConfirm?: Function beforeConfirm?: Function
closeOnClickModal: boolean closeOnClickModal?: boolean
safeAreaInsetBottom: boolean safeAreaInsetBottom?: boolean
ellipsis: boolean ellipsis?: boolean
// //
columnsHeight: number columnsHeight?: number
// value key // value key
valueKey: string valueKey?: string
// key // key
labelKey: string labelKey?: string
// //
modelValue: string | number | Array<string | number> modelValue?: string | number | Array<string | number>
// //
columns: Array<string | number | ColumnItem | Array<string | number | ColumnItem>> columns?: Array<string | number | ColumnItem | Array<string | number | ColumnItem>>
// //
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types
columnChange?: Function columnChange?: Function
@ -136,13 +136,15 @@ interface Props {
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types
displayFormat?: Function displayFormat?: Function
// //
zIndex: number zIndex?: number
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
modelValue: '', modelValue: '',
customClass: '', customClass: '',
customViewClass: '', customViewClass: '',
customLabelClass: '',
customValueClass: '',
// //
placeholder: '请选择', placeholder: '请选择',
// //

View File

@ -88,16 +88,16 @@ interface Props {
customPop?: string customPop?: string
customClass?: string customClass?: string
// popover // popover
visibleArrow: boolean visibleArrow?: boolean
// //
content: string | Record<string, any>[] content: string | Record<string, any>[]
placement: PlacementType placement?: PlacementType
offset: number offset?: number
useContentSlot: boolean useContentSlot?: boolean
disabled: boolean disabled?: boolean
showClose: boolean showClose?: boolean
modelValue: boolean modelValue: boolean
mode: PopoverMode mode?: PopoverMode
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
customClass: '', customClass: '',

View File

@ -31,19 +31,19 @@ import { isObj, requestAnimationFrame } from '../common/util'
interface Props { interface Props {
transition?: string transition?: string
closable: boolean closable?: boolean
position: string position?: string
closeOnClickModal: boolean closeOnClickModal?: boolean
duration: number | boolean duration?: number | boolean
modal: boolean modal?: boolean
zIndex: number zIndex?: number
hideWhenClose: boolean hideWhenClose?: boolean
modalStyle: string modalStyle?: string
safeAreaInsetBottom: boolean safeAreaInsetBottom?: boolean
modelValue: boolean modelValue: boolean
customStyle: string customStyle?: string
lazyRender: boolean lazyRender?: boolean
customClass: string customClass?: string
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -34,10 +34,10 @@ type ProgressStatus = 'success' | 'danger' // 状态类型
interface Props { interface Props {
customClass?: string customClass?: string
percentage: number percentage?: number
hideText?: boolean hideText?: boolean
color?: string | string[] | Record<string, any>[] color?: string | string[] | Record<string, any>[]
duration: number duration?: number
status?: ProgressStatus status?: ProgressStatus
} }

View File

@ -21,12 +21,12 @@ type RadioShape = 'dot' | 'button' | 'check'
interface Props { interface Props {
customClass?: string customClass?: string
modelValue: string | number | boolean modelValue: string | number | boolean
shape: RadioShape shape?: RadioShape
checkedColor: string checkedColor?: string
disabled: boolean disabled?: boolean
cell: boolean cell?: boolean
size: string size?: string
inline: boolean inline?: boolean
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -39,10 +39,10 @@ interface Props {
value?: string | number | boolean value?: string | number | boolean
shape?: RadioShape shape?: RadioShape
checkedColor?: string checkedColor?: string
disabled: boolean | null disabled?: boolean | null
cell: boolean | null cell?: boolean | null
size?: string size?: string
inline: boolean | null inline?: boolean | null
maxWidth?: string maxWidth?: string
} }

View File

@ -33,17 +33,17 @@ import { computed, ref, watch } from 'vue'
interface Props { interface Props {
customClass?: string customClass?: string
num: number num?: number
modelValue: string | number | null modelValue: string | number | null
readonly: boolean readonly?: boolean
size: string size?: string
space: string space?: string
color: string color?: string
activeColor: string | Array<string> activeColor?: string | Array<string>
icon: string icon?: string
activeIcon: string activeIcon?: string
disabled: boolean disabled?: boolean
disabledColor: string disabledColor?: string
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -63,18 +63,18 @@ import { computed, ref, watch } from 'vue'
import { requestAnimationFrame } from '../common/util' import { requestAnimationFrame } from '../common/util'
interface Props { interface Props {
useActionSlot: boolean useActionSlot?: boolean
useLabelSlot: boolean useLabelSlot?: boolean
userSuffixSlot: boolean userSuffixSlot?: boolean
placeholder: string placeholder?: string
cancelTxt: string cancelTxt?: string
light: boolean light?: boolean
hideCancel: boolean hideCancel?: boolean
disabled: boolean disabled?: boolean
maxlength: number | string maxlength?: number | string
modelValue: string modelValue?: string
placeholderLeft: boolean placeholderLeft?: boolean
customClass: string customClass?: string
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -110,40 +110,40 @@ interface Props {
customLabelClass?: string customLabelClass?: string
customValueClass?: string customValueClass?: string
label?: string label?: string
labelWidth: string labelWidth?: string
disabled: boolean disabled?: boolean
readonly: boolean readonly?: boolean
placeholder: string placeholder?: string
title?: string title?: string
alignRight: boolean alignRight?: boolean
error: boolean error?: boolean
required: boolean required?: boolean
useLabelSlot: boolean useLabelSlot?: boolean
useDefaultSlot: boolean useDefaultSlot?: boolean
size?: string size?: string
checkedColor: string checkedColor?: string
min: number min?: number
max: number max?: number
selectSize?: string selectSize?: string
loading: boolean loading?: boolean
loadingColor: string loadingColor?: string
closeOnClickModal: boolean closeOnClickModal?: boolean
modelValue: Array<number | boolean | string> | number | boolean | string modelValue: Array<number | boolean | string> | number | boolean | string
columns: Array<Record<string, any>> columns: Array<Record<string, any>>
type: SelectPickerType type?: SelectPickerType
valueKey: string valueKey?: string
labelKey: string labelKey?: string
confirmButtonText: string confirmButtonText?: string
// //
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types
displayFormat?: Function displayFormat?: Function
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types
beforeConfirm?: Function beforeConfirm?: Function
zIndex: number zIndex?: number
safeAreaInsetBottom: boolean safeAreaInsetBottom?: boolean
filterable: boolean filterable?: boolean
filterPlaceholder: string filterPlaceholder?: string
ellipsis: boolean ellipsis?: boolean
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -62,14 +62,14 @@ interface Props {
customMinClass?: string customMinClass?: string
customMaxClass?: string customMaxClass?: string
customClass?: string customClass?: string
hideMinMax: boolean hideMinMax?: boolean
hideLabel: boolean hideLabel?: boolean
disabled: boolean disabled?: boolean
inactiveColor: string inactiveColor?: string
activeColor: string activeColor?: string
max: number max?: number
min: number min?: number
step: number step?: number
modelValue: number | number[] modelValue: number | number[]
} }

View File

@ -26,11 +26,11 @@ export default {
<script lang="ts" setup> <script lang="ts" setup>
interface Props { interface Props {
customClass?: string customClass?: string
title: string title?: string
modelValue: number modelValue: number
allowReset: boolean allowReset?: boolean
descFirst: boolean descFirst?: boolean
line: boolean line?: boolean
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -31,10 +31,10 @@ import { ref, watch } from 'vue'
type StatusTipType = 'search' | 'network' | 'content' | 'collect' | 'comment' | 'halo' | 'message' type StatusTipType = 'search' | 'network' | 'content' | 'collect' | 'comment' | 'halo' | 'message'
interface Props { interface Props {
customClass: string customClass?: string
customStyle: string customStyle?: string
type: StatusTipType type?: StatusTipType
tip: string tip?: string
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -53,9 +53,9 @@ interface Props {
description?: string description?: string
icon?: string icon?: string
status?: StepStatus status?: StepStatus
iconSlot: boolean iconSlot?: boolean
titleSlot: boolean titleSlot?: boolean
descriptionSlot: boolean descriptionSlot?: boolean
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -27,11 +27,11 @@ import { getCurrentInstance, provide, watch } from 'vue'
interface Props { interface Props {
customClass?: string customClass?: string
active: number active?: number
vertical: boolean vertical?: boolean
dot: boolean dot?: boolean
space?: string space?: string
alignCenter: boolean alignCenter?: boolean
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -33,8 +33,8 @@ import { addUnit, getRect, objToStyle } from '../common/util'
interface Props { interface Props {
customStyle?: string customStyle?: string
customClass?: string customClass?: string
zIndex: number zIndex?: number
offsetTop: number offsetTop?: number
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
@ -52,9 +52,9 @@ const width = ref<number>(0)
const observerList = ref<UniApp.IntersectionObserver[]>([]) const observerList = ref<UniApp.IntersectionObserver[]>([])
const state = ref<string>('') const state = ref<string>('')
const boxHeight: Ref<number> = inject('box-height') || ref(0) const boxHeight: Ref<number> = inject('box-height', null) || ref(0)
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types
const observerForChild: Function | null = inject('observerForChild') || null const observerForChild: Function | null = inject('observerForChild', null)
const { proxy } = getCurrentInstance() as any const { proxy } = getCurrentInstance() as any
const instance = getCurrentInstance() as any const instance = getCurrentInstance() as any

View File

@ -35,7 +35,7 @@ export default {
} }
</script> </script>
<script lang="ts" setup> <script lang="ts" setup>
import { getCurrentInstance, nextTick, onBeforeMount, onBeforeUnmount, onMounted, ref, watch } from 'vue' import { getCurrentInstance, onBeforeMount, onBeforeUnmount, onMounted, ref, watch } from 'vue'
import { closeOther, pushToQueue, removeFromQueue } from '../common/clickoutside' import { closeOther, pushToQueue, removeFromQueue } from '../common/clickoutside'
import { useTouch } from '../mixins/useTouch' import { useTouch } from '../mixins/useTouch'
import { getRect } from '../common/util' import { getRect } from '../common/util'
@ -44,8 +44,8 @@ interface Props {
customClass?: string customClass?: string
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types
beforeClose?: Function beforeClose?: Function
disabled: boolean disabled?: boolean
modelValue: string modelValue?: string
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -20,15 +20,15 @@ import { getType, objToStyle } from '../common/util'
interface Props { interface Props {
modelValue: boolean | string | number modelValue: boolean | string | number
disabled: boolean disabled?: boolean
activeValue: boolean | string | number activeValue?: boolean | string | number
inactiveValue: boolean | string | number inactiveValue?: boolean | string | number
activeColor?: string activeColor?: string
inactiveColor?: string inactiveColor?: string
size: string size?: string
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types
beforeChange?: Function beforeChange?: Function
customClass: string customClass?: string
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -27,7 +27,7 @@ interface Props {
// tablabel // tablabel
title?: string title?: string
// tab // tab
disabled: boolean disabled?: boolean
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -143,19 +143,19 @@ interface Props {
// //
modelValue: number modelValue: number
// //
slidableNum: number slidableNum?: number
// //
mapNum: number mapNum?: number
// //
sticky: boolean sticky?: boolean
// //
offsetTop: number offsetTop?: number
// //
swipeable: boolean swipeable?: boolean
// //
lineWidth: number lineWidth?: number
// //
lineHeight: number lineHeight?: number
color?: string color?: string
inactiveColor?: string inactiveColor?: string
} }

View File

@ -40,17 +40,17 @@ import { objToStyle } from '../common/util'
import { computed, ref, watch } from 'vue' import { computed, ref, watch } from 'vue'
interface Props { interface Props {
useIconSlot: boolean useIconSlot?: boolean
type?: string type?: string
icon?: string icon?: string
closable: boolean closable?: boolean
plain: boolean plain?: boolean
dynamic: boolean dynamic?: boolean
color?: string color?: string
bgColor?: string bgColor?: string
round: boolean round?: boolean
mark: boolean mark?: boolean
customClass: string customClass?: string
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -55,19 +55,19 @@ type PlacementType =
| 'right-end' | 'right-end'
interface Props { interface Props {
customStyle: string customStyle?: string
customArrow: string customArrow?: string
customPop: string customPop?: string
customClass: string customClass?: string
// popover // popover
visibleArrow: boolean visibleArrow?: boolean
// //
content?: Record<string, any>[] | string content?: Record<string, any>[] | string
placement: PlacementType placement?: PlacementType
offset: number offset?: number
useContentSlot: boolean useContentSlot?: boolean
disabled: boolean disabled?: boolean
showClose: boolean showClose?: boolean
modelValue: boolean modelValue: boolean
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {

View File

@ -51,11 +51,11 @@ type TransitionName =
| 'zoom-out' | 'zoom-out'
interface Props { interface Props {
show: boolean show?: boolean
duration?: Record<string, number> | number | boolean duration?: Record<string, number> | number | boolean
name: TransitionName | '' name?: TransitionName | ''
customStyle: string customStyle?: string
lazyRender: boolean lazyRender?: boolean
customClass?: string customClass?: string
// //
enterClass?: string enterClass?: string

View File

@ -56,31 +56,31 @@ import { context, getType, isDef, isEqual } from '../common/util'
import { chooseFile } from './utils' import { chooseFile } from './utils'
interface Props { interface Props {
customClass: string customClass?: string
customEvokeClass: string customEvokeClass?: string
customPreviewClass: string customPreviewClass?: string
// //
multiple: boolean multiple?: boolean
// //
accept: string accept?: string
sizeType: Array<string> sizeType?: Array<string>
sourceType: Array<string> sourceType?: Array<string>
header: Record<string, any> header?: Record<string, any>
name: string name?: string
formData: Record<string, any> formData?: Record<string, any>
// //
action: string action: string
fileList: Record<string, any>[] fileList?: Record<string, any>[]
statusKey: string statusKey?: string
maxSize: number maxSize?: number
limit?: number limit?: number
showLimitMum: boolean showLimitMum?: boolean
disabled: boolean disabled?: boolean
useDefaultSlot: boolean useDefaultSlot?: boolean
// loading // loading
loadingType: string loadingType?: string
loadingColor: string loadingColor?: string
loadingSize: string loadingSize?: string
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types
beforePreview?: Function beforePreview?: Function
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types

View File

@ -6,19 +6,40 @@
<p align="center">📱 一个参照<a href="https://ftf.jd.com/wot-design/">Wot-design</a>,基于 Vue3 打造的uni-app组件库</p> <p align="center">📱 一个参照<a href="https://ftf.jd.com/wot-design/">Wot-design</a>,基于 Vue3 打造的uni-app组件库</p>
<p align="center"> <p align="center">
<a href="https://github.com/Moonofweisheng/wot-design-uni">
<img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/Moonofweisheng/wot-design-uni?logo=github&color=%234d80f0&link=https%3A%2F%2Fgithub.com%2FMoonofweisheng%2Fwot-design-uni">
</a>
<a href="https://www.npmjs.com/package/wot-design-uni">
<img alt="npm" src="https://img.shields.io/npm/v/wot-design-uni?logo=npm&color=%234d80f0&link=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Fwot-design-uni">
</a>
<a href="https://www.npmjs.com/package/wot-design-uni">
<img alt="npm" src="https://img.shields.io/npm/dw/wot-design-uni?logo=npm&link=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Fwot-design-uni">
</a>
<a href="https://www.npmjs.com/package/wot-design-uni">
<img src="https://img.shields.io/npm/dt/wot-design-uni?style=flat-square">
</a>
<a href="https://github.com/Moonofweisheng/wot-design-uni">
<img alt="GitHub" src="https://img.shields.io/github/license/Moonofweisheng/wot-design-uni?logo=github">
</a>
<a href="https://app.netlify.com/sites/wot-design-uni/deploys" target="_blank" referrerpolicy="no-referrer"> <a href="https://app.netlify.com/sites/wot-design-uni/deploys" target="_blank" referrerpolicy="no-referrer">
<img src="https://api.netlify.com/api/v1/badges/0991d8a9-0fb0-483b-8961-5bde066bbd50/deploy-status" alt="deploy-status" /> <img src="https://api.netlify.com/api/v1/badges/0991d8a9-0fb0-483b-8961-5bde066bbd50/deploy-status" alt="deploy-status" />
</a> </a>
</p> </p>
<p align="center"> <p align="center">
🔥 <a href="https://wot-design-uni.netlify.app/">文档网站 (Netlify)</a> 🔥 <a href="https://wot-design-uni.netlify.app/">文档网站 (Netlify)</a>
</p> </p>
## ✨ 特性 ## ✨ 特性
- 🚀 支持 APP、H5、微信小程序、支付宝小程序、钉钉小程序 等平台. - 🚀 支持 APP、H5、微信小程序 等平台.
- 🚀 50+ 个高质量组件,覆盖移动端主流场景. - 🚀 50+ 个高质量组件,覆盖移动端主流场景.
- 💪 使用 Typescript 构建,提供良好的组件类型系统. - 💪 使用 Typescript 构建,提供良好的组件类型系统.
- 💪 采用 Vue3 最新特性,提升组件性能. - 💪 采用 Vue3 最新特性,提升组件性能.
@ -28,22 +49,13 @@
## 📱 预览 ## 📱 预览
手机扫描上的二维码访问演示: 扫描二维码访问演示:
<p> <p>
<img src="https://wot-design-uni.netlify.app/wx.jpg" width="200" height="200" style="margin-right:30px"/> <img src="https://wot-design-uni.netlify.app/wx.jpg" width="200" height="200" style="margin-right:30px"/>
<img src="https://wot-design-uni.netlify.app/alipay.png" width="200" height="200" /> <img src="https://wot-design-uni.netlify.app/alipay.png" width="200" height="200" />
</p> </p>
## 安装
```bash
yarn add wot-design-uni
```
## 快速上手 ## 快速上手
详细说明见 [快速上手](https://wot-design-uni.netlify.app/guide/quickUse.html) 详细说明见 [快速上手](https://wot-design-uni.netlify.app/guide/quickUse.html)
@ -51,5 +63,3 @@ yarn add wot-design-uni
## LICENSE ## LICENSE
[MIT](https://github.com/Moonofweisheng/wot-design-uni/blob/develop/LICENSE) [MIT](https://github.com/Moonofweisheng/wot-design-uni/blob/develop/LICENSE)

View File

@ -3084,6 +3084,11 @@
resolved "https://registry.npmmirror.com/@vant/area-data/-/area-data-1.4.1.tgz#b4f1bce05dbb147dc08fd2ed9b2a0f63d3329b29" resolved "https://registry.npmmirror.com/@vant/area-data/-/area-data-1.4.1.tgz#b4f1bce05dbb147dc08fd2ed9b2a0f63d3329b29"
integrity sha512-D8zI/rfxREhnIKGoYzsEJZ73fte4JARhFeFftLIH7ynu1sPrCBEgPkLEbwPyvw3VC4JdSIuzaK5uOhu+BcoPXw== integrity sha512-D8zI/rfxREhnIKGoYzsEJZ73fte4JARhFeFftLIH7ynu1sPrCBEgPkLEbwPyvw3VC4JdSIuzaK5uOhu+BcoPXw==
"@vant/touch-emulator@^1.4.0":
version "1.4.0"
resolved "https://registry.yarnpkg.com/@vant/touch-emulator/-/touch-emulator-1.4.0.tgz#02420ca5f312a7eb6c36c349cbb8e80e6f29ff2f"
integrity sha512-Zt+zISV0+wpOew2S1siOJ3G22y+hapHAKmXM+FhpvWzsRc4qahaYXatCAITuuXt0EcDp7WvEeTO4F7p9AtX/pw==
"@vitejs/plugin-legacy@^4.0.3": "@vitejs/plugin-legacy@^4.0.3":
version "4.1.1" version "4.1.1"
resolved "https://registry.yarnpkg.com/@vitejs/plugin-legacy/-/plugin-legacy-4.1.1.tgz#27aad7ab082d2d554cf48a8e4f1c0ae9f3eca522" resolved "https://registry.yarnpkg.com/@vitejs/plugin-legacy/-/plugin-legacy-4.1.1.tgz#27aad7ab082d2d554cf48a8e4f1c0ae9f3eca522"