diff --git a/docs/.vuepress/generate-ts/README.md b/docs/.vuepress/generate-ts/README.md
new file mode 100644
index 000000000..b255aad31
--- /dev/null
+++ b/docs/.vuepress/generate-ts/README.md
@@ -0,0 +1,126 @@
+# 生成 ts`*.d.ts`文件
+
+## RoadMap
+
+- [x] 全部内部组件vue ts 声明文件
+
+- [ ] markdown格式规范声明
+
+ 1. 属性声明标题格式为`**属性声明**`
+ 2. 表格行声明,必须以`|`开始,以`|`结束,例如:`|属性|类型|说明|`
+ 3. 属性声明表格合法表头属性字段
+
+ |合法属性名|解析时字段名|
+ |:-|:-|
+ |备注|notes|
+ |属性|property|
+ |类型|type|
+ |默认值|default|
+ |说明|comment|
+ |必填|must|
+ |生效时机|effectiveTiming|
+ |平台差异说明|platformDifferences|
+
+ 4. 枚举值声明
+
+ 标题声明:`**AudioReverbType**`, 引用枚举值时声明
+
+```ts
+interface LivePusherProps{
+ audioReverbType: AudioReverbType
+}
+```
+
+ 枚举值value
+ |名称|表格标题|
+ |:-|:-|
+ |枚举值key|键|
+ |枚举值Value|值|
+ |枚举值备注/说明|说明|
+
+- [ ] 属性枚举值生成
+- [ ] 一个组件内包含多个接口或类型声明,声明 [type-relations.json][type-relations.json]
+ - [x] map
+ - [x] radio
+ - [ ] image 有枚举值
+ - [ ] live-pusher
+ - [ ] 其他待排查的组件文档
+
+## 为什么需要这个功能
+
+1. 方便 Volar 展现内置组件类型,方便开发者查看组件内置组件属性和事件,提高工作效率
+2. 基于项目 markdown 文档生成,便于后续 markdown 修改时,通过脚本生成的方式,同步修改内置组件 types
+
+## 生产`*.d.ts`
+
+### node环境
+
+node: `v20.10.0`
+
+### 构建命令
+
+```shell
+pnpm generate-ts
+```
+### 产物文件列表
+[docs/.vuepress/types/inner-components](docs/.vuepress/types/inner-components)目录下生成文件
+```log
+animation-view.d.ts
+camera.d.ts
+cover-image.d.ts
+index.d.ts
+map.d.ts
+movable-view.d.ts
+progress.d.ts
+slider.d.ts
+textarea.d.ts
+view.d.ts
+audio.d.ts
+canvas.d.ts
+form.d.ts
+label.d.ts
+match-media.d.ts
+picker.d.ts
+radio.d.ts
+swiper.d.ts
+types.d.ts
+web-view.d.ts
+button.d.ts
+checkbox.d.ts
+icon.d.ts
+live-player.d.ts
+movable-area.d.ts
+picker-view.d.ts
+rich-text.d.ts
+switch.d.ts
+video.d.ts
+```
+
+## 产物发布
+
+建议放`@dcloudio/types`包内`inner-components`
+
+### 使用并配置
+
+基于发布产物目标`@dcloudio/types/inner-components`
+
+在[quickstart-cli][quickstart-cli]中的[uni-preset-vue typescript][uni-preset-vue:ts]项目`src/shime-uni.d.ts`中增加一行
+
+```ts
+///
+```
+
+#### IDE工具提示
+
+- VSCode
+
+vscode需要安装Vue[Volar]插件,内置组件内置组件的属性和事件正常提示。
+
+- WebStorm
+
+IDE工具`webstorm`暂无测试条件,支持效果未知。
+
+[quickstart-cli]: https://uniapp.dcloud.net.cn/quickstart-cli.html
+[uni-preset-vue:ts]: https://gitee.com/dcloud/uni-preset-vue/repository/archive/vite.zip
+[Volar]: https://marketplace.visualstudio.com/items?itemName=Vue.volar
+[type-relations.json]: https://github.com/weiquanju/unidocs-zh/blob/master/docs/.vuepress/generate-ts/type-relations.json
\ No newline at end of file
diff --git a/docs/.vuepress/generate-ts/index.mjs b/docs/.vuepress/generate-ts/index.mjs
new file mode 100644
index 000000000..392e9b349
--- /dev/null
+++ b/docs/.vuepress/generate-ts/index.mjs
@@ -0,0 +1,57 @@
+import { readFile, writeFile } from "fs/promises"
+import { existsSync, mkdirSync } from 'node:fs'
+import { resolve, dirname } from "path"
+import generateInterface, { addIndex, getIndexDoc, getTypeDoc } from "./interface.mjs";
+
+
+/**
+ * 生成组件路径
+ * @param {string} name 组件名称
+ * @returns
+ */
+const getPath = (name) => resolve(process.cwd(), `docs/component/${name}.md`)
+
+/**
+ * 生成组件文档
+ * @param {string[]} componentNames
+ */
+const main = async (componentNames) => {
+ for (const i in componentNames) {
+ const comp = componentNames[i]
+ const path = getPath(comp)
+ const data = await readFile(path, { encoding: 'utf-8' })
+ const tsDoc = generateInterface(comp, data)
+
+ const savePath = resolve(process.cwd(), `docs/.vuepress/types/inner-components/${comp}.d.ts`)
+ const dir = dirname(savePath)
+ if (!existsSync(dir)) {
+ mkdirSync(dir, { recursive: true });
+ }
+ if (tsDoc) {
+ addIndex(`export * from './${comp}'`)
+ writeFile(savePath, tsDoc, { encoding: 'utf-8' }).catch((err) => console.error(err))
+ } else {
+ console.warn('loss doc: ' + comp)
+ }
+ }
+ //并入types
+ addIndex(`export * from './types'`)
+ /**
+ * 生成index索引文件
+ */
+ const saveIndexPath = resolve(process.cwd(), `docs/.vuepress/types/inner-components/index.d.ts`)
+ const indexDoc = getIndexDoc()
+ indexDoc && writeFile(saveIndexPath, indexDoc, { encoding: 'utf-8' }).catch((err) => console.error(err))
+
+ /**
+ * 生成vue Volor ide文件,自动对uniapp内置组件进行提示
+ */
+ const saveTypePath = resolve(process.cwd(), `docs/.vuepress/types/inner-components/types.d.ts`)
+ const typeDoc = getTypeDoc()
+ typeDoc && writeFile(saveTypePath, typeDoc, { encoding: 'utf-8' }).catch((err) => console.error(err))
+}
+
+const innerComponents = 'view,scroll-view,swiper,match-media,movable-area,movable-view,cover-view,cover-image,icon,text,rich-text,progress,button,checkbox,editor,form,input,label,picker,picker-view,radio,slider,switch,textarea,animation-view,audio,camera,image,video,live-player,live-pusher,map,canvas,web-view'.split(',')
+
+main(innerComponents)
+console.log('finish!')
\ No newline at end of file
diff --git a/docs/.vuepress/generate-ts/interface.mjs b/docs/.vuepress/generate-ts/interface.mjs
new file mode 100644
index 000000000..92acdd4a8
--- /dev/null
+++ b/docs/.vuepress/generate-ts/interface.mjs
@@ -0,0 +1,412 @@
+import { getFieldCN, getFieldEN, getFieldMap, mustMap } from "./utils.mjs";
+import generateRelation from "./relation.mjs";
+
+/**
+ * @typedef {{ [k: string]: number; }} FieldMap
+ */
+/**
+ * @typedef {{table: string[][]; events?: string[][]; fieldCN: string[]; fieldEN: any; fieldMap: FieldMap} TableConfig
+ */
+/**
+ * 根据table,生成格式化的接口数据
+ * @param {string} str
+ * @returns
+ */
+const generateInterfaceTable = (str) => {
+ const titleContent = /\*\*属性说明\*\*\n+([^\n]+\n)*/mg
+
+ const data = titleContent.exec(str)
+ if (!data?.[0]) return
+ const table = data[0].replace('**属性说明**', '').trim().split("\n").filter(Boolean)
+ return generateInterfaceTableFields(table)
+}
+
+/**
+ *
+ * @param {string[]} table
+ * @returns
+ */
+export const generateInterfaceTableFields = (table) => {
+ // console.log(table)
+ const fieldCN = getFieldCN(table.shift())
+ table.shift()
+
+ // |属性|说明|类型|平台差异说明|
+ // const fieldCN = '|属性名|类型|默认值|说明|生效时机|平台差异说明|'.split('|')
+ const fieldEN = getFieldEN(fieldCN)
+
+ const fieldMap = getFieldMap(fieldEN)
+
+ const { property } = fieldMap
+ const t = table.map(s => s.split('|').map(s => s.trim())).filter(Boolean)
+
+ const events = t.filter((item) => item[property].startsWith('@') === true)
+ return {
+ table: t.filter((item) => item[property].startsWith('@') === false),
+ events,
+ fieldCN,
+ fieldEN,
+ fieldMap
+ }
+}
+
+
+/**
+ * 生成一条数据类型的内容
+ * @param {string[]} arr
+ * @param {TableConfig} files
+ * @param {import("./relation.mjs").Property} propertyIns 读取的原始字符串
+ * @returns
+ */
+const generateInterfaceProperty = (arr, files, propertyIns) => {
+ const { fieldMap, fieldCN } = files
+ const { property, type, default: defaultIndex, comment, effectiveTiming, platformDifferences, must } = fieldMap
+
+ if (!arr[property]) return
+
+
+ const baseName = arr[property].trim()
+ // if(baseName === 'content') {
+ // debugger
+ // }
+ let relativeType = propertyIns ? propertyIns.getType(baseName) : undefined
+
+ if (!relativeType) { /**
+ * 处理`string/Array`
+ */
+ const types = arr[type].replace(/(|)|(\\|\/)/g, '|').split('|').map(s => s.trim())
+ relativeType = types.map(t => {
+ switch (t) {
+ case 'Array<Number>':
+ case 'Array<number>':
+ case 'Array<Number>':
+ return 'number[]';
+ case 'Array<Object>':
+ case 'Array<object>':
+ case 'Array<Object>':
+ return 'Record[]';
+ case 'Array<String>':
+ case 'Array<string>':
+ case 'Array<String>':
+ return 'string[]';
+ case 'Array<Boolean>':
+ case 'Array<boolean>':
+ case 'Array<Boolean>':
+ return 'boolean[]';
+ case 'Color':
+ case 'color':
+ return 'string';
+
+ default:
+ return t && ['String', 'Number', 'Boolean', 'Null'].includes(t) ? t.toLowerCase() : t
+ }
+ }).join(' | ')
+ }
+
+ const name = toCamel(baseName)
+
+ //处理defaultVal为字符串的情况
+ let defaultVal = (arr[defaultIndex] || '').trim()
+ // console.log({ defaultVal })
+ let defaultLine = ''
+ switch (defaultVal) {
+ case 'true':
+ case 'false':
+ case '无':
+ case '[]':
+ case '{}':
+ case 'null':
+ defaultLine = ` * @default ${defaultVal}`
+ break;
+
+ default:
+ //默认值是字符串
+ if (defaultVal && /^-?\d+\.?\d*$/.test(defaultVal) === false) {
+ const val = defaultVal.replace(/"|'/g, '').trim()
+ defaultLine = !val ? '' : ` * @default "${val}"`
+ } else {
+ defaultLine = ` * @default ${defaultVal}`
+ }
+ break;
+ }
+
+ const effectiveTimingLine = arr[effectiveTiming] ? `\n * @effectiveTiming ${fieldCN[effectiveTiming]} ${arr[effectiveTiming]}` : ''
+ const platformDifferencesLine = arr[platformDifferences] ? `\n * @platformDifferences ${fieldCN[platformDifferences]}:${arr[platformDifferences]}` : ''
+
+ const isMust = arr[must] === mustMap['true']
+ const mustSymbol = isMust ? '' : '?'
+ return `
+ /**
+ * ${[arr[comment], defaultLine].filter(Boolean).join('\n')}
+ * @name ${name} ${effectiveTimingLine}${platformDifferencesLine}
+ */
+ ${name}${mustSymbol}: ${relativeType}`
+}
+
+
+/**
+ * 生成事件接口
+ * @param {string} interfaceName
+ * @param {TableConfig} data
+ * @returns
+ */
+const generateEvent = (interfaceName, data) => {
+ const lines = data.table.map((item) => generateEventProperty(item, data))
+
+ if (!lines.length) return
+
+ return `
+export interface ${getEventName(toUpperCamel(interfaceName))} {
+ ${lines.join('\n')}
+}
+
+`
+}
+/**
+ * 生成事件接口名称
+ * @param {string} interfaceName 接口名称
+ * @returns
+ */
+const getEventName = (interfaceName) => `${toUpperCamel(interfaceName)}Events`
+
+/**
+ * 根据备注内容生成事件属性
+ * @param {string} comment 单元格的备注内容
+ * @returns
+ */
+const getEventTypeByComment = (comment) => (/detail\s*=\s*\{[^\]]+\}/mg.exec(comment)?.[0] || '').replace('=', ':')
+
+/**
+ * 生成一条事件类型的内容
+ * @param {string[]} arr
+ * @param {TableConfig}
+ * @returns
+ */
+const generateEventProperty = (arr, { fieldMap, fieldCN }) => {
+ // "update:modelValue": (value: string) => boolean;
+
+ const { property, comment, platformDifferences, effectiveTiming } = fieldMap
+ if (!arr[property]) return ''
+ let name = arr[property].trim()
+
+ name = toCamel(name.startsWith('@') ? name.replace('@', 'on-') : `on-${name}`)
+
+ const type = getEventTypeByComment(arr[comment])
+ const eventType = type ? `{${type}}` : 'any'
+
+ const effectiveTimingLine = arr[effectiveTiming] ? `\n * @effectiveTiming ${fieldCN[effectiveTiming]} ${arr[effectiveTiming]}` : ''
+ const platformDifferencesLine = arr[platformDifferences] ? `\n * @platformDifferences ${fieldCN[platformDifferences]}:${arr[platformDifferences]}` : ''
+ return `
+ /**
+ * ${arr[comment]}
+ * @name ${name} ${effectiveTimingLine}${platformDifferencesLine}
+ */
+ ${name}?: (event: ${eventType}) => void;
+ `
+}
+/**
+ * 转大驼峰命名风格
+ * @param {string} s 字符串
+ * @returns
+ */
+const toUpperCamel = s => toCamel(s.toString()).replace(/^\w/, (s) => s.toUpperCase())
+/**
+ * 转小驼峰命名风格
+ * @param {string} s 字符串
+ * @returns
+ */
+const toCamel = (s) => s.toString().replace(/-(\w)/g, (m0, m1) => m1.toUpperCase())
+
+/**
+ * 驼峰转下中横线风格
+ * @param {string} s
+ * @returns
+ */
+const toSnackCase = (s) => s.toString().replace(/[A-Z]/g, (m, i) => {
+ return i === 0 ? m.toLowerCase() : `-${m.toLowerCase()}`
+}).replace('_', '-')
+/**
+ * 获取接口名称的注释说明
+ * @param {string} name
+ * @param {string} str
+ * @returns
+ */
+const getInterfaceComment = (name, str) => {
+ const reg = new RegExp(`#\\s+${name}\\n+([^\\n]+)`)
+ const res = str.match(reg)
+ if (res && res[1]) {
+ return res[1].replace(/。$/, '')
+ }
+}
+
+/**
+ * @typedef {{str: string;property: import("./relation.mjs").Property; file?: string; isComponent?: boolean}} GenerateInterfaceOptions
+ */
+/**
+ * 生成接口
+ * @param {string} interfaceName 接口名称
+ * @param {TableConfig} data 格式化的表格数据和字段
+ * @param {GenerateInterfaceOptions}
+ * @returns
+ */
+export const generateInterface = (interfaceName, data, { str, property, isComponent, file }) => {
+ const comp = file || interfaceName.toString()
+
+ const { fieldMap, fieldEN, fieldCN, table: interfacePropertyTable, events } = data
+
+ // 获取接口说明
+ const interfaceComment = getInterfaceComment(interfaceName, str)
+ const interfaceCommentContent = interfaceComment ? `/**
+* ${interfaceComment}
+*/` : ''
+
+
+
+ const interfaceCamel = toUpperCamel(interfaceName)
+
+ const interfaceProps = isComponent === false ? interfaceCamel : `${interfaceCamel}Props`
+
+
+ const eventDoc = generateEvent(interfaceName, { table: events, fieldMap, fieldEN, fieldCN })
+
+
+ /**
+ * @type {string[]}
+ */
+ const propsLines = interfacePropertyTable.map((item) => generateInterfaceProperty(item, data, property)).filter(Boolean)
+
+ const propsDoc = !propsLines.length ? undefined : `${interfaceCommentContent}
+export interface ${interfaceProps}{
+ ${propsLines.join('\n')}
+}`
+
+
+ const interfaceOfEvent = eventDoc && getEventName(interfaceCamel)
+
+ const joinPropsArr = [propsDoc && interfaceProps, interfaceOfEvent].filter(Boolean)
+
+ const exportNamedComponent = `
+export declare type ${interfaceCamel}Component = import("vue").DefineComponent<${joinPropsArr.join(' & ') || 'any'}>;
+`
+
+ if (isComponent !== false) {
+ addType(` ${interfaceCamel}: import('./${comp}').${interfaceCamel}Component`)
+ addType(` "${toSnackCase(interfaceCamel)}": import('./${comp}').${interfaceCamel}Component`)
+ const joinProps = joinPropsArr.map((name) => `import('./${comp}').${name}`).join(' & ')
+ jsxList.push(` "${toSnackCase(interfaceCamel)}": ${joinProps} & JSXElementAttr;`)
+ }
+
+ return [propsDoc, eventDoc, isComponent === false ? '' : exportNamedComponent].filter(Boolean).join('\n')
+}
+
+
+/**
+ * 生成接口
+ * @param {string} name 组件名称,生成的接口将以这个名称命名,例如button
+ * @param {string} str 要解析的文本内容
+ * @returns
+ * @example
+const str = `
+
+**属性说明**
+
+|属性名|类型|默认值|说明|生效时机|平台差异说明|
+|:-|:-|:-|:-|:-|:-|
+|size|String|default|按钮的大小|||
+|type|String|default|按钮的样式类型|||
+`
+toInterface('button',str)
+ *
+ */
+const toInterface = (name, str) => {
+ const clearStr = str.replace(/\r?\n/gm, '\n')
+ /**
+ * 通过配置关系解析当个md中多个组件声明
+ */
+ const relationInterfaces = generateRelation(name.toString(), clearStr)
+ if (relationInterfaces) {
+ return relationInterfaces
+ }
+ /**
+ * 通过当个md生成声明
+ */
+ const table = generateInterfaceTable(clearStr)
+ if (table) {
+ return generateInterface(name.toString(), table, { str: clearStr })
+ }
+}
+
+const indexList = []
+
+/**
+ * 为索引文件添加导出项
+ * @param {string} str 导出项,例如: `export * from './view'`
+ */
+export const addIndex = (str) => {
+ indexList.push(str)
+}
+
+export const getIndexDoc = () => {
+ return `/**
+ * @author weiquanju
+ */
+
+export {}
+
+${Array.from(new Set(indexList)).join('\n')}
+`
+}
+const typeList = []
+
+/**
+ * 为索引文件添加导出项
+ * @param {string} str 导出项,例如: `export * from './view'`
+ */
+const addType = (str) => {
+ typeList.push(str)
+}
+const jsxList = []
+export const getTypeDoc = () => {
+ return `/* eslint-disable */
+/* prettier-ignore */
+// @ts-nocheck
+// Generated by weiquanju
+// Read more: https://github.com/vuejs/core/pull/3399
+export {}
+
+import { StyleValue } from "vue";
+interface JSXElementAttr {
+ class?: any
+ style?: StyleValue
+}
+
+export interface MPComponents {
+${typeList.join('\n')}
+}
+
+declare global {
+ namespace JSX {
+ //避免jsx命名冲突
+ interface IntrinsicElements {
+${jsxList.join('\n')}
+ }
+ }
+}
+
+declare module "@vue/runtime-core" {
+
+ export interface IntrinsicElementAttributes {
+${jsxList.join('\n')}
+ }
+
+ export type NativeElements = {
+ [K in keyof IntrinsicElementAttributes]: IntrinsicElementAttributes[K];
+ };
+}
+declare module "vue" {
+ export interface GlobalComponents extends MPComponents {}
+}
+`
+}
+
+export default toInterface
\ No newline at end of file
diff --git a/docs/.vuepress/generate-ts/relation.mjs b/docs/.vuepress/generate-ts/relation.mjs
new file mode 100644
index 000000000..a535c5760
--- /dev/null
+++ b/docs/.vuepress/generate-ts/relation.mjs
@@ -0,0 +1,172 @@
+// import relationConfig from './type-relations.json' with { type: "json" } /** node v22 */
+// import relationConfig from './type-relations.json' assert { type: "json" } /** node v17-v21 */
+import { readFile } from 'node:fs/promises'
+import { join } from 'node:path'
+import { generateInterface, generateInterfaceTableFields } from "./interface.mjs";
+
+const relationConfig = await readFile(join(import.meta.dirname, './type-relations.json'), { encoding: 'utf8' }).then(r => JSON.parse(r))
+
+/**
+ * json声明接口的属性
+ * @typedef {{name: string;type: string;}} PropertyDefine
+ */
+
+/**
+ * json声明接口
+ * @typedef {{name: string; titleName: string; titleLevel: string; property?:PropertyDefine[];isComponent?:boolean}} InterfaceDefine
+ */
+
+/**
+ * 接口
+ * @typedef {{name: string; titleName: string; titleLevel: string; property?:Property;isComponent?:boolean}} Interface
+ */
+
+/**
+ * json声明组件
+ * @typedef {component: string; interfaces: Interfaces[]} ComponentDefine
+ */
+
+export class Property {
+ /**
+ * @type {Map}
+ */
+ #propertyMap
+ /**
+ *
+ * @param {PropertyDefine[]} param
+ */
+ constructor(param) {
+ this.#propertyMap = new Map(param.map(({ name, type }) => [name, type]))
+ }
+ /**
+ * 根据属性名称获取属性类型
+ * @param {string} name
+ * @returns
+ */
+ getType(name) {
+ return this.#propertyMap.get(name)
+ }
+}
+
+class Relation {
+
+ /**
+ * 关系map
+ * @type {Map}
+ */
+ #relation
+
+ /**
+ * 初始化
+ * @param {ComponentDefine[]} config 接口关系配置,json
+ */
+ constructor(config) {
+ this.#relation = new Map(config.map(({ component, interfaces }) => {
+ /**
+ * @type {Interface[]}
+ */
+ const interfaceMap = interfaces.map(({ name, titleLevel, titleName, property, isComponent }) => ({
+ name,
+ titleLevel,
+ titleName,
+ isComponent,
+ property: property && Array.isArray(property) ? new Property(property) : undefined
+ }))
+ return [component, interfaceMap]
+ }))
+ }
+
+ /**
+ * 设置当前组件名称
+ * @param {string} name 组件名称
+ * @returns
+ */
+ getComponent(name) {
+ return this.#relation.get(name)
+ }
+}
+/**
+ * markdown表格正则表达式
+ */
+export const mdTableRegex = /^((?:\|.*?\|)+)\r?\n((?:\|.*?\|)*)(?:\r?\n)?$/gm;
+
+/**
+ * 根据Interface标题获取正则
+ * @param {Interface['titleName']} titleName 标题名称
+ * @param {Interface['titleLevel']} titleLevel 标题级别
+ * @returns
+ */
+export const getTitleRegExp = (titleName, titleLevel) => {
+
+ switch (titleLevel) {
+ case 'h1':
+ return new RegExp(`#\\s*${titleName}`, 'gm')
+ case 'h2':
+ return new RegExp(`##\\s*${titleName}`, 'gm')
+ case 'h3':
+ return new RegExp(`###\\s*${titleName}`, 'gm')
+ case 'null':
+ return new RegExp(titleName, 'gm')
+
+ default:
+ return new RegExp(`\\*{2}\\s*${titleName}\s*\\*{2}`, 'gm')
+ }
+}
+
+
+
+/**
+ * 分割表格,获取要解析的表格
+ * @param {string} str
+ * @param {string} titleName
+ * @param {string} titleLevel
+ * @returns string[]
+ */
+const getTableContent = (str, titleName, titleLevel) => {
+
+
+ const sp = str.split(getTitleRegExp(titleName, titleLevel)).filter(Boolean)
+ if (sp && sp[1]) {
+
+ let dataStr = sp[1].trim()
+ const indexStart = dataStr.indexOf("|")
+
+ if (indexStart > -1) {
+ dataStr = dataStr.substring(indexStart - 1)
+ }
+ const indexEnd = dataStr.indexOf('\n\n')
+
+ if (indexEnd > -1) {
+ dataStr = dataStr.substring(0, indexEnd)
+ }
+
+ if (!dataStr) return
+ const table = dataStr.trim().split('\n').filter(Boolean)
+ if (!table) return
+ return table.filter(Boolean)
+ }
+}
+export const relation = new Relation(relationConfig)
+
+/**
+ * 通过relation配置,生成接口声明文件
+ * @param {string} str
+ * @param {string} componentName
+ * @returns
+ */
+const generateRelation = (componentName, str) => {
+
+ const component = relation.getComponent(componentName)
+ if (!component) return
+ return component.map(({ titleName, titleLevel, name, property, isComponent }) => {
+ const table = getTableContent(str, titleName, titleLevel)
+ if (!table?.length) return
+
+ const config = generateInterfaceTableFields(table)
+ if (config) {
+ return generateInterface(name, config, { str, property, file: componentName, isComponent })
+ }
+ }).filter(Boolean).join('\n\n')
+}
+
+export default generateRelation
\ No newline at end of file
diff --git a/docs/.vuepress/generate-ts/type-relations.json b/docs/.vuepress/generate-ts/type-relations.json
new file mode 100644
index 000000000..562e59c5f
--- /dev/null
+++ b/docs/.vuepress/generate-ts/type-relations.json
@@ -0,0 +1,81 @@
+[
+ {
+ "component": "map",
+ "interfaces": [
+ {
+ "name": "Map",
+ "titleName": "属性说明",
+ "titleLevel": "bold"
+ },
+ {
+ "name": "MapMarker",
+ "titleName": "MapMarker",
+ "titleLevel": "bold",
+ "isComponent": false
+ },
+ {
+ "name": "MapMarkerLabel",
+ "titleName": "MapMarkerLabel",
+ "titleLevel": "bold",
+ "isComponent": false
+ },
+ {
+ "name": "MapMarkerCallOut",
+ "titleName": "MapMarkerCallOut",
+ "titleLevel": "bold",
+ "isComponent": false
+ },
+ {
+ "name": "MapPolyLine",
+ "titleName": "MapPolyLine",
+ "titleLevel": "bold",
+ "isComponent": false
+ },
+ {
+ "name": "MapPolygon",
+ "titleName": "MapPolygon",
+ "titleLevel": "bold",
+ "isComponent": false
+ },
+ {
+ "name": "MapCircle",
+ "titleName": "MapCircle",
+ "titleLevel": "bold",
+ "isComponent": false
+ },
+ {
+ "name": "MapControl",
+ "titleName": "MapControl",
+ "titleLevel": "bold",
+ "isComponent": false
+ },
+ {
+ "name": "MapPosition",
+ "titleName": "MapPosition",
+ "titleLevel": "bold",
+ "isComponent": false
+ },
+ {
+ "name": "MapPoint",
+ "titleName": "MapPoint",
+ "titleLevel": "bold",
+ "isComponent": false
+ }
+ ]
+ },
+ {
+ "component": "radio",
+ "interfaces": [
+ {
+ "name": "RadioGroup",
+ "titleName": "radio-group",
+ "titleLevel": "h3"
+ },
+ {
+ "name": "Radio",
+ "titleName": "radio\\n",
+ "titleLevel": "h3"
+ }
+ ]
+ }
+]
diff --git a/docs/.vuepress/generate-ts/utils.mjs b/docs/.vuepress/generate-ts/utils.mjs
new file mode 100644
index 000000000..18cdcf6a5
--- /dev/null
+++ b/docs/.vuepress/generate-ts/utils.mjs
@@ -0,0 +1,106 @@
+/**
+ * 获取中文字段
+ * @param {string} str
+ * @returns
+ */
+export const getFieldCN = (str) => str.trim().split("|").map(s => s.trim()).map((field) => {
+ switch (field) {
+ case '属性名':
+ case '属性':
+ return '属性';
+
+ case '平台兼容':
+ case '平台差异':
+ case '平台差异说明':
+ return '平台差异说明';
+
+ default:
+ if (field.includes('平台差异')) {
+ return '平台差异说明'
+ } else if (field.startsWith('属性')) {
+ return '属性'
+ } else if (field.toLowerCase().startsWith('google地图')) {
+ return 'google地图'
+ } else if (field.startsWith('高德')) {
+ return '高德'
+ } else if (['类型', '默认值', '说明', '生效时机', '必填', '高德是否支持', '备注', ''].includes(field)) {
+ return field
+ } else {
+ throw new Error(`警告:有未判断字段: "${field}", ${str}`)
+ return field
+ }
+ }
+})
+
+export const mustMap = {
+ '是': true,
+ '否': false,
+ 'true': '是',
+ 'false': '否'
+}
+
+const mapRelation = {
+ '高德': 'AMapSupported',
+ 'AMapSupported': '高德',
+
+ 'google地图': 'GoogleMapSupported',
+ 'GoogleMapSupported': 'google地图',
+
+ '备注': 'notes',
+ 'notes': '备注',
+
+ '属性': 'property',
+ 'property': '属性',
+
+ '类型': 'type',
+ 'type': '类型',
+
+ '默认值': 'default',
+ 'default': '默认值',
+
+ '说明': 'comment',
+ 'comment': '说明',
+
+ '必填': 'must',
+ 'must': '必填',
+
+ '生效时机': 'effectiveTiming',
+ 'effectiveTiming': '生效时机',
+
+ '平台差异说明': 'platformDifferences',
+ 'platformDifferences': '平台差异说明',
+
+ '': ''
+}
+
+/**
+ * 通过`fieldsCN`获取fieldEN
+ * @param {keyof typeof map[]} fieldsCN
+ * @returns string[]
+ */
+export const getFieldEN = (fieldsCN) => {
+ return fieldsCN.map(field => mapRelation[field])
+}
+
+/**
+ * @typedef {property: number;type: number;default: number;comment: number;effectiveTiming: number;platformDifferences: number;} FieldMap
+ */
+
+/**
+ * 通过`fieldsEN`获取字段和index的map
+ * @param {keyof typeof map[]} fieldsEN
+ * @returns FieldMap
+ */
+export const getFieldMap = (fieldsEN) => {
+ return Object.fromEntries(fieldsEN.map((field, index) => {
+ if (field !== '') return [field, index]
+ }).filter(Boolean))
+}
+
+/**
+ * 生成泛型字符串
+ * @param {string} genericType
+ * @param {string} paramsType
+ * @returns
+ */
+export const genericType = (genericType, paramsType) => `${genericType}<${paramsType}>`
\ No newline at end of file
diff --git a/docs/component/audio.md b/docs/component/audio.md
index f52d56522..cf0093761 100644
--- a/docs/component/audio.md
+++ b/docs/component/audio.md
@@ -26,7 +26,7 @@ app-nvue也不支持此组件。
|poster|String||默认控件上的音频封面的图片资源地址,如果 controls 属性值为 false 则设置 poster 无效|
|name|String|未知音频|默认控件上的音频名字,如果 controls 属性值为 false 则设置 name 无效|
|author|String|未知作者|默认控件上的作者名字,如果 controls 属性值为 false 则设置 author 无效|
-|@error|EventHandle||当发生错误时触发 error 事件,detail = {errMsg: MediaError.code}|
+|@error|EventHandle||当发生错误时触发 error 事件,detail = {errMsg: string, errCode: number}|
|@play|EventHandle||当开始/继续播放时触发play事件|
|@pause|EventHandle||当暂停播放时触发 pause 事件|
|@timeupdate|EventHandle||当播放进度改变时触发 timeupdate 事件,detail = {currentTime, duration}|
diff --git a/docs/component/camera.md b/docs/component/camera.md
index 04546e0b1..6a9cbac78 100644
--- a/docs/component/camera.md
+++ b/docs/component/camera.md
@@ -25,7 +25,7 @@
|@stop |EventHandle | |摄像头在非正常终止时触发,如退出后台等情况| |
|@error |EventHandle | |用户不允许使用摄像头时触发| |
|@initdone|eventhandle||相机初始化完成时触发,e.detail = {maxZoom}|微信小程序2.7.0、抖音小程序1.78.0、飞书小程序、快手小程序|
-|@ready |EventHandle | |相机初始化成功时触发。event.detail = {maxZoom}|支付宝小程序1.24.3 |
+|@ready |EventHandle | |相机初始化成功时触发。event.detail = {maxZoom:number}|支付宝小程序1.24.3 |
|@scancode |EventHandle | |在扫码识别成功时触发,仅在 mode="scanCode" 时生效|微信小程序、支付宝小程序、抖音小程序、飞书小程序、快手小程序|
diff --git a/docs/component/cover-view.md b/docs/component/cover-view.md
index e2f8362f8..16a0b0eda 100644
--- a/docs/component/cover-view.md
+++ b/docs/component/cover-view.md
@@ -15,9 +15,12 @@ app-vue和小程序框架,渲染引擎是webview的。但为了优化体验,
支持的事件:`click`
+**属性说明**
+
|属性名|类型|默认值|说明|平台差异说明|
|:-|:-|:-|:-|:-|
|scroll-top|number/string||设置顶部滚动偏移量,仅在设置了 overflow-y: scroll 成为滚动元素后生效|支付宝小程序不支持|
+|@click|EventHandler||||
diff --git a/docs/component/editor.md b/docs/component/editor.md
index 8acf4ffdf..729c48221 100644
--- a/docs/component/editor.md
+++ b/docs/component/editor.md
@@ -29,7 +29,7 @@
:::
-## 属性说明
+**属性说明**
| 属性 | 类型 | 默认值 | 必填 | 说明 |
| --- | --- | --- | --- | --- |
@@ -39,9 +39,9 @@
| show-img-toolbar | boolean | false | 否 | 点击图片时显示工具栏控件 |
| show-img-resize | boolean | false | 否 | 点击图片时显示修改尺寸控件 |
| @ready | eventhandle | | 否 | 编辑器初始化完成时触发 |
-| @focus | eventhandle | | 否 | 编辑器聚焦时触发,event.detail = {html, text, delta} |
-| @blur | eventhandle | | 否 | 编辑器失去焦点时触发,detail = {html, text, delta} |
-| @input | eventhandle | | 否 | 编辑器内容改变时触发,detail = {html, text, delta} |
+| @focus | eventhandle | | 否 | 编辑器聚焦时触发,event.detail = {html:string, text:string, delta: any[]} |
+| @blur | eventhandle | | 否 | 编辑器失去焦点时触发,detail = {html:string, text:string, delta: any[]} |
+| @input | eventhandle | | 否 | 编辑器内容改变时触发,detail = {html:string, text:string, delta: any[]} |
| @statuschange | eventhandle | | 否 | 通过 Context 方法改变编辑器内样式时触发,返回选区已设置的样式 |
## HTML 标签和 style 内联样式支持情况
diff --git a/docs/component/form.md b/docs/component/form.md
index 09db8f117..13eacb5d6 100644
--- a/docs/component/form.md
+++ b/docs/component/form.md
@@ -11,7 +11,7 @@
|:-|:-|:-|:-|
|report-submit|Boolean|是否返回 formId 用于发送[模板消息](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/template-message.html)|微信小程序、支付宝小程序|
|report-submit-timeout|number|等待一段时间(毫秒数)以确认 formId 是否生效。如果未指定这个参数,formId 有很小的概率是无效的(如遇到网络失败的情况)。指定这个参数将可以检测 formId 是否有效,以这个参数的时间作为这项检测的超时时间。如果失败,将返回 requestFormId:fail 开头的 formId|微信小程序2.6.2|
-|@submit|EventHandle|携带 form 中的数据触发 submit 事件,event.detail = {value : {'name': 'value'} , formId: ''},report-submit 为 true 时才会返回 formId||
+|@submit|EventHandle|携带 form 中的数据触发 submit 事件,event.detail = {value : {name: string} , formId: string},report-submit 为 true 时才会返回 formId||
|@reset|EventHandle|表单重置时会触发 reset 事件| |
diff --git a/docs/component/image.md b/docs/component/image.md
index abb8d7097..25cfdf97f 100644
--- a/docs/component/image.md
+++ b/docs/component/image.md
@@ -6,6 +6,8 @@
图片组件。
+**属性说明**
+
|属性名 |类型 |默认值 |说明 |平台差异说明 |
|:- |:- |:- |:- |:- |
|src |String | |图片资源地址 | |
@@ -19,6 +21,11 @@
|@load |HandleEvent| |当图片载入完毕时,发布到 AppService 的事件名,事件对象event.detail = {height:'图片高度px', width:'图片宽度px'} | |
+|draggable |boolean |false |是否能拖动图片 |H5 3.1.1+、App(iOS15+) |
+|@error |HandleEvent| |当错误发生时,发布到 AppService 的事件名,事件对象event.detail = {errMsg: string} | |
+|@load |HandleEvent| |当图片载入完毕时,发布到 AppService 的事件名,事件对象event.detail = {height:string, width:string} | |
+
+
## 图片格式说明:
diff --git a/docs/component/input.md b/docs/component/input.md
index 6c32873a8..935e60074 100644
--- a/docs/component/input.md
+++ b/docs/component/input.md
@@ -6,7 +6,7 @@
html规范中input不仅是输入框,还有radio、checkbox、时间、日期、文件选择功能。在uni-app规范中,input仅仅是输入框。其他功能uni-app有单独的组件或API:[radio组件](https://uniapp.dcloud.io/component/radio)、[checkbox组件](https://uniapp.dcloud.io/component/checkbox)、[时间选择](https://uniapp.dcloud.io/component/picker?id=%e6%97%b6%e9%97%b4%e9%80%89%e6%8b%a9%e5%99%a8)、[日期选择](https://uniapp.dcloud.io/component/picker?id=%e6%97%a5%e6%9c%9f%e9%80%89%e6%8b%a9%e5%99%a8)、[图片选择](https://uniapp.dcloud.io/api/media/image?id=chooseimage)、[视频选择](https://uniapp.dcloud.io/api/media/video?id=choosevideo)、[多媒体文件选择(含图片视频)](https://uniapp.dcloud.io/api/media/video?id=choosemedia)、[通用文件选择](https://uniapp.dcloud.io/api/media/file?id=choosefile)。
-### 属性说明
+**属性说明**
|属性名|类型|默认值|说明|平台差异说明|
|:-|:-|:-|:-|:-|
@@ -43,10 +43,10 @@ html规范中input不仅是输入框,还有radio、checkbox、时间、日期
|always-system|Boolean|false|是否强制使用系统键盘和 Web-view 创建的 input 元素。为 true 时,confirm-type、confirm-hold 可能失效|支付宝小程序 2.7.3+|
|inputmode|String|"text"|是一个枚举属性,它提供了用户在编辑元素或其内容时可能输入的数据类型的提示。[有效值](#inputmode)|H5(3.6.16+)、App-vue(3.6.16+)|
|@input|EventHandle||当键盘输入时,触发input事件,event.detail = {value}|差异见下方 Tips|
-|@focus|EventHandle||输入框聚焦时触发,event.detail = { value, height },height 为键盘高度|仅微信小程序、京东小程序、App(2.2.3+) 、QQ小程序、快手小程序支持 height|
-|@blur|EventHandle||输入框失去焦点时触发,event.detail = {value: value}||
-|@confirm|EventHandle||点击完成按钮时触发,event.detail = {value: value}||
-|@keyboardheightchange|eventhandle||键盘高度发生变化的时候触发此事件,event.detail = {height: height, duration: duration}|微信小程序基础库2.7.0+、App 3.1.0+|
+|@focus|EventHandle||输入框聚焦时触发,event.detail = { value:string, height:string },height 为键盘高度|仅微信小程序、京东小程序、App(2.2.3+) 、QQ小程序、快手小程序支持 height|
+|@blur|EventHandle||输入框失去焦点时触发,event.detail = {value: string}||
+|@confirm|EventHandle||点击完成按钮时触发,event.detail = {value: string}||
+|@keyboardheightchange|eventhandle||键盘高度发生变化的时候触发此事件,event.detail = {height: string, duration: string}|微信小程序基础库2.7.0+、App 3.1.0+|
diff --git a/docs/component/live-player.md b/docs/component/live-player.md
index 3812ff6c7..839ff5999 100644
--- a/docs/component/live-player.md
+++ b/docs/component/live-player.md
@@ -31,7 +31,7 @@
|sound-mode|string|speaker|声音输出方式;可选值speaker、ear|微信小程序、QQ小程序1.5.0(仅支持speaker)|
|min-cache|Number|1|最小缓冲区,单位s||
|max-cache|Number|3|最大缓冲区,单位s||
-|picture-in-picture-mode|string/Array|3|设置小窗模式: push, pop,空字符串或通过数组形式设置多种模式(如: ["push", "pop"])|微信小程序(2.10.3)|
+|picture-in-picture-mode|string/Array<string>|3|设置小窗模式: push, pop,空字符串或通过数组形式设置多种模式(如: ["push", "pop"])|微信小程序(2.10.3)|
|@statechange|EventHandle||播放状态变化事件,detail = {code}||
|@netstatus|EventHandle||网络状态通知,detail = {info}||
|@fullscreenchange|EventHandle||全屏变化事件,detail = {direction, fullScreen}。| |
diff --git a/docs/component/live-pusher.md b/docs/component/live-pusher.md
index bdfa2c7aa..b88ed4736 100644
--- a/docs/component/live-pusher.md
+++ b/docs/component/live-pusher.md
@@ -20,42 +20,41 @@ app开发,推荐使用nvue做直播,比使用vue的优势有:
当然nvue相比vue的坏处是css写法受限,如果只开发微信小程序,不考虑App,那么使用vue页面也是一样的。
-**参数说明**
-
-设置live-pusher组件的推流地址,推流视频模式等。
-
-属性|类型 |默认值|必填|说明|平台差异说明|
-:--|:--|:--|:--|:--|:--|
-url|string| |是|推流地址,支持RTMP协议。|
-mode |string|SD|否|推流视频模式,可取值:SD(标清), HD(高清), FHD(超清)。|
-aspect |string|3:2|否|视频宽高比例|
-muted|Boolean|false|否|是否静音。|
-enable-camera|Boolean|true|否|开启摄像头。|
-auto-focus|Boolean|true|否|自动聚集。|
-beauty|Number|0|否|美颜,取值范围 0-9(iOS取值范围为1) ,0 表示关闭。|
-whiteness|Number|0|否|美白,取值范围 0-9(iOS取值范围为1) ,0 表示关闭。|
-orientation|String|"vertical"|否|画面方向|
-min-bitrate|Number|200|否|最小码率。|
-max-bitrate|Number|1000|否|最大码率。|
-audio-quality|string|high|否|高音质(48KHz)或低音质(16KHz),值为high, low|微信小程序1.7.0
-waiting-image|string||否|进入后台时推流的等待画面|微信小程序1.7.0
-waiting-image-hash|string||否|等待画面资源的MD5值|微信小程序1.7.0
-zoom|boolean|false|否|调整焦距|微信小程序2.1.0
-device-position|string|front|否|前置或后置,值为front, back|微信小程序2.3.0
-background-mute|boolean|false|否|进入后台时是否静音|微信小程序1.7.0
-remote-mirror|boolean|false|否|设置推流画面是否镜像,产生的效果在 live-player 反应到|微信小程序2.10.0
-local-mirror|string|auto|否|控制本地预览画面是否镜像|微信小程序2.10.0
-audio-reverb-type|number|0|否|音频混响类型|微信小程序2.10.0
-enable-mic|boolean|true|否|开启或关闭麦克风|微信小程序2.10.0
-enable-agc|boolean|false|否|是否开启音频自动增益|微信小程序2.10.0
-enable-ans|boolean|false|否|是否开启音频噪声抑制|微信小程序2.10.0
-audio-volume-type|string|voicecall|否|音量类型|微信小程序2.10.0
-@statechange|EventHandle|||状态变化事件,detail = {code}|
-@netstatus|EventHandle|||网络状态通知,detail = {info}|
-@error|EventHandle|||渲染错误事件,detail = {errMsg, errCode}|
-@bgmstart|EventHandle|||背景音开始播放时触发|微信小程序2.4.0
-@bgmprogress|EventHandle|||背景音进度变化时触发,detail = {progress, duration}|微信小程序2.4.0
-@bgmcomplete|EventHandle|||背景音播放完成时触发|微信小程序2.4.0
+**属性说明**
+
+|属性|类型 |默认值|必填|说明|平台差异说明|
+|:--|:--|:--|:--|:--|:--|
+|url|string| |是|推流地址,支持RTMP协议。|
+|mode |string|SD|否|推流视频模式,可取值:SD(标清), HD(高清), FHD(超清)。|
+|aspect |string|3:2|否|视频宽高比例|
+|muted|Boolean|false|否|是否静音。|
+|enable-camera|Boolean|true|否|开启摄像头。|
+|auto-focus|Boolean|true|否|自动聚集。|
+|beauty|Number|0|否|美颜,取值范围 0-9(iOS取值范围为1) ,0 表示关闭。|
+|whiteness|Number|0|否|美白,取值范围 0-9(iOS取值范围为1) ,0 表示关闭。|
+|orientation|String|"vertical"|否|画面方向|
+|min-bitrate|Number|200|否|最小码率。|
+|max-bitrate|Number|1000|否|最大码率。|
+|audio-quality|string|high|否|高音质(48KHz)或低音质(16KHz),值为high, low|微信小程序1.7.0|
+|waiting-image|string||否|进入后台时推流的等待画面|微信小程序1.7.0|
+|waiting-image-hash|string||否|等待画面资源的MD5值|微信小程序1.7.0|
+|zoom|boolean|false|否|调整焦距|微信小程序2.1.0|
+|device-position|string|front|否|前置或后置,值为front, back|微信小程序2.3.0|
+|background-mute|boolean|false|否|进入后台时是否静音|微信小程序1.7.0|
+|remote-mirror|boolean|false|否|设置推流画面是否镜像,产生的效果在 live-player 反应到|微信小程序2.10.0|
+|local-mirror|string|auto|否|控制本地预览画面是否镜像|微信小程序2.10.0|
+|audio-reverb-type|number|0|否|音频混响类型|微信小程序2.10.0|
+|enable-mic|boolean|true|否|开启或关闭麦克风|微信小程序2.10.0|
+|enable-agc|boolean|false|否|是否开启音频自动增益|微信小程序2.10.0|
+|enable-ans|boolean|false|否|是否开启音频噪声抑制|微信小程序2.10.0|
+|audio-volume-type|string|voicecall|否|音量类型|微信小程序2.10.0|
+|@statechange|EventHandle|||状态变化事件,detail = {code:number}|
+|@netstatus|EventHandle|||网络状态通知,detail = {info:any}|
+|@error|EventHandle|||渲染错误事件,detail = {errMsg:number, errCode:number}|
+|@bgmstart|EventHandle|||背景音开始播放时触发|微信小程序2.4.0|
+|@bgmprogress|EventHandle|||背景音进度变化时触发,detail = {progress:number, duration:number}|微信小程序2.4.0|
+|@bgmcomplete|EventHandle|||背景音播放完成时触发|微信小程序2.4.0|
+
#### orientation 的合法值
diff --git a/docs/component/map.md b/docs/component/map.md
index 5362b3e5c..ed5dec4f4 100644
--- a/docs/component/map.md
+++ b/docs/component/map.md
@@ -28,15 +28,15 @@
|longitude|Number||中心经度||
|latitude|Number||中心纬度||
|scale|Number|16|缩放级别,取值范围为3-20|高德地图缩放比例与微信小程序不同|
-|theme|String|normal|主题(satellite 或 normal)只在初始化时有效,不能动态变更(仅Android支持)|京东小程序|
+|theme|'satellite'|'normal'|normal|主题(satellite 或 normal)只在初始化时有效,不能动态变更(仅Android支持)|京东小程序|
|min-scale|Number|3|最小缩放级别|App-nvue 3.1.0+、微信小程序2.13+|
|max-scale|Number|20|最大缩放级别|App-nvue 3.1.0+、微信小程序2.13+|
|layer-style|Number/String|1|个性化地图|App-nvue 3.1.0+、微信小程序2.13+|
-|markers|Array||标记点||
-|polyline|Array||路线|飞书小程序不支持|
-|circles|Array||圆||
-|controls|Array||控件||
-|include-points|Array||缩放视野以包含所有给定的坐标点|App-nvue 2.1.5+、微信小程序、H5、百度小程序、支付宝小程序、京东小程序|
+|markers|MapMarker[]||标记点||
+|polyline|MapPolyLine[]||路线|飞书小程序不支持|
+|circles|MapCircle[]||圆||
+|controls|MapControl[]||控件||
+|include-points|MapPoint[]||缩放视野以包含所有给定的坐标点|App-nvue 2.1.5+、微信小程序、H5、百度小程序、支付宝小程序、京东小程序|
|zIndex|number|false|显示层级|微信小程序2.3.0|
|enable-3D|Boolean|false|是否显示3D楼块|App-nvue 2.1.5+、微信小程序2.3.0|
|show-compass|Boolean|false|是否显示指南针|App-nvue 2.1.5+、微信小程序2.3.0|
@@ -51,17 +51,18 @@
|enable-poi|Boolean|false|是否展示 POI 点|App-nvue 3.1.0+|
|enable-building|Boolean|false|是否展示建筑物|App-nvue 3.1.0+ 支持 (**废除原enable-3D属性 高德地图默认开启建筑物就是3D无法设置**)|
|show-location|Boolean||显示带有方向的当前定位点|微信小程序、H5、百度小程序、支付宝小程序、京东小程序|
-|polygons(支付宝为: polygon)|Array.``||多边形|App-nvue 2.1.5+、App-vue 3.4.3+、H5 3.4.3+、微信小程序、百度小程序、支付宝小程序|
+|polygons|MapPolygon[]||多边形|App-nvue 2.1.5+、App-vue 3.4.3+、H5 3.4.3+、微信小程序、百度小程序程序|
+|polygon|MapPolygon[]||多边形|支付宝小程序|
|enable-indoorMap|Boolean|false|是否展示室内地图|App-nvue 3.1.0+|
-|@markertap|EventHandle||点击标记点时触发,e.detail = {markerId}|App-nvue 2.3.3+、H5、微信小程序、支付宝小程序 (App和H5平台需要指定 marker 对象属性 id)|
-|@labeltap|EventHandle||点击label时触发,e.detail = {markerId} |微信小程序2.9.0|
-|@callouttap|EventHandle||点击标记点对应的气泡时触发,e.detail = {markerId}||
-|@controltap|EventHandle||点击控件时触发,e.detail = {controlId}||
+|@markertap|EventHandle||点击标记点时触发,e.detail = {markerId: number}|App-nvue 2.3.3+、H5、微信小程序、支付宝小程序 (App和H5平台需要指定 marker 对象属性 id)|
+|@labeltap|EventHandle||点击label时触发,e.detail = {markerId: number} |微信小程序2.9.0|
+|@callouttap|EventHandle||点击标记点对应的气泡时触发,e.detail = {markerId: number}||
+|@controltap|EventHandle||点击控件时触发,e.detail = {controlId: number}||
|@regionchange|EventHandle||视野发生变化时触发|微信小程序、H5、百度小程序、支付宝小程序、京东小程序|
|@tap|EventHandle||点击地图时触发; App-nvue、微信小程序2.9支持返回经纬度||
|@updated|EventHandle||在地图渲染更新完成时触发|微信小程序、H5、百度小程序|
-|@anchorpointtap|EventHandle||点击定位标时触发,e.detail = {longitude, latitude}|App-nvue 3.1.0+、微信小程序2.13+|
-|@poitap|EventHandle||点击地图poi点时触发,e.detail = {name, longitude, latitude}|微信小程序2.3.0+|
+|@anchorpointtap|EventHandle||点击定位标时触发,e.detail = {longitude: number, latitude: number}|App-nvue 3.1.0+、微信小程序2.13+|
+|@poitap|EventHandle||点击地图poi点时触发,e.detail = {name: string, longitude: number, latitude: number}|微信小程序2.3.0+|
**注意**
@@ -98,7 +99,7 @@ App平台(包含iOS、安卓、鸿蒙)腾讯地图使用web方案,在申
3. 覆盖物支持调整与其它地图元素的压盖关系。
4. 支持marker(小车)平移动画,适用于轨迹回放场景。
-**markers**
+**MapMarker**
标记点用于在地图上显示标记的位置
@@ -117,11 +118,11 @@ App平台(包含iOS、安卓、鸿蒙)腾讯地图使用web方案,在申
|label|为标记点旁边增加标签|Object|否|支持的属性见下表,可识别换行符。|App-nvue 2.1.5+、微信小程序、H5、App、百度小程序、支付宝小程序|
|anchor|经纬度在标注图标的锚点,默认底边中点|Object|否|{x, y},x表示横向(0-1),y表示竖向(0-1)。{x: .5, y: 1} 表示底边中点|App-nvue 2.1.5+、微信小程序、H5、百度小程序、京东小程序|
|clusterId|自定义点聚合簇效果时使用|Number|否||App-nvue 3.1.0+、微信小程序|
-|customCallout|自定义气泡窗口|Object|否||App-nvue 2.1.5+、微信小程序、支付宝小程序|
+|customCallout|自定义气泡窗口|MapMarkerCallOut|否||App-nvue 2.1.5+、微信小程序、支付宝小程序|
|aria-label|无障碍访问,(属性)元素的额外描述|String|否||App-nvue 3.1.0+、微信小程序|
|joinCluster|是否参与点聚合|Boolean|否|如果指定点聚合 此选项值必须设置为true,才会生效|App-nvue 3.1.0+、微信小程序|
-**marker 上的气泡 callout**
+**MapMarkerCallOut**
|属性|说明|类型|平台差异说明|
|:-|:-|:-|:-|
@@ -138,7 +139,7 @@ App平台(包含iOS、安卓、鸿蒙)腾讯地图使用web方案,在申
|anchorX |横向偏移量,向右为正数|Number|微信小程序2.11.0|
|anchorY |纵向偏移量,向下为正数|Number|微信小程序2.11.0|
-**marker 上的标签 label**
+**MapMarkerLabel**
|属性|说明|类型|平台差异说明|
|:-|:-|:-|:-|
@@ -169,13 +170,13 @@ MapContext.on('markerClusterCreate', callback) 触发时,通过 [MapContext.ad
[MapContext.removeMarkers](/api/location/map?id=createmapcontext) 移除参与聚合的 marker;
-**polyline**
+**MapPolyLine**
指定一系列坐标点,从数组第一项连线至最后一项
|属性|说明|类型|必填|备注|平台差异说明|
|:-|:-|:-|:-|:-|:-|
-|points|经纬度数组|Array|是|[{latitude: 0, longitude: 0}]||
+|points|经纬度数组|MapPoint[]|是|[{latitude: 0, longitude: 0}]||
|color|线的颜色|String|否|8位十六进制表示,后两位表示alpha值,如:#0000AA||
|width|线的宽度|Number|否|||
|dottedLine|是否虚线|Boolean|否|默认false|App-nvue 2.1.5+、微信小程序、H5、百度小程序、支付宝小程序、京东小程序|
@@ -183,26 +184,27 @@ MapContext.on('markerClusterCreate', callback) 触发时,通过 [MapContext.ad
|arrowIconPath|更换箭头图标|String|否|在arrowLine为true时生效|App-nvue 2.1.5+、微信小程序、百度小程序、京东小程序|
|borderColor|线的边框颜色|String|否||微信小程序、H5、百度小程序、京东小程序|
|borderWidth|线的厚度|Number|否||微信小程序、H5、百度小程序、京东小程序|
-|colorList|彩虹线|Array|否|存在时忽略 color 值|App-nvue 3.1.0+、微信小程序|
+|colorList|彩虹线|string[]|否|存在时忽略 color 值|App-nvue 3.1.0+、微信小程序|
|level|压盖关系
abovelabels 显示在所有 POI 之上(默认)
abovebuildings 显示在楼块之上 POI 之下
aboveroads 显示在所有 POI 之上|String|否||微信小程序|
**注意事项**
- App-nvue 当 arrowLine 为 true 时,显示的是带箭头的图片拼接的线 color 值会被忽略,替换箭头图片的方法[参考文档](https://ask.dcloud.net.cn/article/37901)
-**polygon**
+**MapPolygon**
+
指定一系列坐标点,根据 points 坐标数据生成闭合多边形
|属性|说明|类型|必填|备注
|:--|:--|:--|:--|:--|
-|points|经纬度数组|array|是|[{latitude: 0, longitude: 0}]
+|points|经纬度数组|MapPoint[]|是|[{latitude: 0, longitude: 0}]
|strokeWidth|描边的宽度|Number|否||
|strokeColor|描边的颜色|String|否|十六进制|
|fillColor|填充颜色|String|否|十六进制|
|zIndex|设置多边形 Z 轴数值|Number|否||
|level|压盖关系
abovelabels 显示在所有 POI 之上(默认)
abovebuildings 显示在楼块之上 POI 之下
aboveroads 显示在所有 POI 之上|String|false|微信小程序|
-**circles**
+**MapCircle**
在地图上显示圆
@@ -216,18 +218,18 @@ MapContext.on('markerClusterCreate', callback) 触发时,通过 [MapContext.ad
|strokeWidth|描边的宽度|Number|否| |
|level|压盖关系
abovelabels 显示在所有 POI 之上(默认)
abovebuildings 显示在楼块之上 POI 之下
aboveroads 显示在所有 POI 之上|String|false|微信小程序|
-**controls**
+**MapControl**
在地图上显示控件,控件不随着地图移动
|属性|说明|类型|必填|备注|
|:-|:-|:-|:-|:-|
|id|控件id|Number|否|在控件点击事件回调会返回此id|
-|position|控件在地图的位置|Object|是|控件相对地图位置|
+|position|控件在地图的位置|MapPosition|是|控件相对地图位置|
|iconPath|显示的图标|String|是|项目目录下的图片路径,支持相对路径写法,以'/'开头则表示相对项目根目录;也支持临时路径|
|clickable|是否可点击|Boolean|否|默认不可点击|
-**position**
+**MapPosition**
|属性|说明|类型|必填|备注|
|:-|:-|:-|:-|:-|
@@ -236,6 +238,13 @@ MapContext.on('markerClusterCreate', callback) 触发时,通过 [MapContext.ad
|width|控件宽度|Number|否|默认为图片宽度|
|height|控件高度|Number|否|默认为图片高度|
+**MapPoint**
+
+|属性|说明|类型|必填|
+|:-|:-|:-|:-|
+|latitude|纬度,浮点数,范围 -90 ~ 90|Number|否|
+|longitude|经度,浮点数,范围 -180 ~ 180|Number|否|
+
地图组件的经纬度必填,如果不填经纬度则默认值是北京的经纬度。
**示例** [查看示例](https://hellouniapp.dcloud.net.cn/pages/component/map/map)
@@ -287,40 +296,40 @@ export default {
#### Map 地图组件
-|属性 |说明 |高德是否支持 |google地图是否支持 |
-|:---- |:---- |:---- |:---- |
-|subkey |个性化地图使用的key |不支持 |不支持 |
-|show-scale |显示比例尺 |已支持 |不支持 |
-|enable-poi |是否展示 POI 点 |已支持 |不支持 |
-|labeltap |点击label时触发 |已支持 |Android支持iOS不支持 |
-|poitap |点击地图poi点时触发 |已支持 |Android不支持 iOS支持 |
+|属性|说明|高德是否支持|google地图是否支持|
+|:----|:----|:----|:----|
+|subkey|个性化地图使用的key|不支持|不支持|
+|show-scale|显示比例尺|已支持|不支持|
+|enable-poi|是否展示 POI 点|已支持|不支持|
+|labeltap|点击label时触发|已支持|Android支持iOS不支持|
+|poitap|点击地图poi点时触发|已支持|Android不支持 iOS支持|
#### marker
-|属性 |说明 |高德是否支持 |google地图是否支持 |
-|:---- |:---- |:---- |:---- |
-|label |为标记点旁边增加标签 |已支持 |Android支持 iOS不支持 |
+|属性|说明|高德是否支持|google地图是否支持|
+|:----|:----|:----|:----|
+|label|为标记点旁边增加标签|已支持|Android支持 iOS不支持|
#### marker 上的气泡 callout
-|属性 |说明 |高德是否支持 |google地图是否支持 |
-|:---- |:---- |:---- |:---- |
-|display |'BYCLICK':点击显示; 'ALWAYS':常显 |已支持 |Android支持iOS只支持 'BYCLICK' |
+|属性|说明|高德是否支持|google地图是否支持|
+|:----|:----|:----|:----|
+|display|'BYCLICK':点击显示; 'ALWAYS':常显|已支持|Android支持iOS只支持 'BYCLICK'|
#### marker 上的自定义气泡 customCallout
-|属性 |说明 |高德是否支持 |google地图是否支持 |
-|:---- |:---- |:---- |:---- |
-|display|'BYCLICK':点击显示; 'ALWAYS':常显 |已支持 |Android支持iOS只支持 'BYCLICK' |
+|属性|说明|高德是否支持|google地图是否支持|
+|:----|:----|:----|:----|
+|display|'BYCLICK':点击显示; 'ALWAYS':常显|已支持|Android支持iOS只支持 'BYCLICK'|
#### polyline
-|属性 |说明 |高德是否支持 |google地图是否支持 |
-|:---- |:---- |:---- |:---- |
-|colorList |彩虹线 |已支持 |Android不支持 iOS支持 |
-|dottedLine |是否虚线 |已支持 |Android已支持 iOS不支持 |
-|arrowLine |带箭头的线 |已支持 |Android不支持 iOS支持 |
-|arrowIconPath|更换箭头图标 |已支持 |Android不支持 iOS支持 |
+|属性|说明|高德是否支持|google地图是否支持|
+|:----|:----|:----|:----|
+|colorList|彩虹线|已支持|Android不支持 iOS支持|
+|dottedLine|是否虚线|已支持|Android已支持 iOS不支持|
+|arrowLine|带箭头的线|已支持|Android不支持 iOS支持|
+|arrowIconPath|更换箭头图标|已支持|Android不支持 iOS支持|
**map 组件相关操作的 JS API**:[uni.createMapContext](../api/location/map.md#createmapcontext)
diff --git a/docs/component/movable-view.md b/docs/component/movable-view.md
index 4783a860e..3f925d1f9 100644
--- a/docs/component/movable-view.md
+++ b/docs/component/movable-view.md
@@ -29,8 +29,10 @@
|scale-max|Number|10|定义缩放倍数最大值||
|scale-value|Number|1|定义缩放倍数,取值范围为 0.1/0.5 - 10|0.1 倍需要 App(4.51+)、H5(4.51+)、微信小程序(4.51+)|
|animation|Boolean|true|是否使用动画||
-|@change|EventHandle||拖动过程中触发的事件,event.detail = {x: x, y: y, source: source},其中source表示产生移动的原因,值可为touch(拖动)、touch-out-of-bounds(超出移动范围)、out-of-bounds(超出移动范围后的回弹)、friction(惯性)和空字符串(setData)||
-|@scale|EventHandle||缩放过程中触发的事件,event.detail = {x: x, y: y, scale: scale},||
+|@change|EventHandle||拖动过程中触发的事件,event.detail = {x: number, y: number, source: any},其中source表示产生移动的原因,值可为touch(拖动)、touch-out-of-bounds(超出移动范围)、out-of-bounds(超出移动范围后的回弹)、friction(惯性)和空字符串(setData)||
+|@scale|EventHandle||缩放过程中触发的事件,event.detail = {x: number, y: number, scale: number},||
+
+
diff --git a/docs/component/page-meta.md b/docs/component/page-meta.md
index fbbd7c537..8e69e0c96 100644
--- a/docs/component/page-meta.md
+++ b/docs/component/page-meta.md
@@ -31,8 +31,8 @@
|page-style|string|""|否|页面根节点样式,页面根节点是所有页面节点的祖先节点,相当于 HTML 中的 body 节点|微信基础库 2.9.0|
|root-font-size|string|""|否|页面的根字体大小,页面中的所有 rem 单位,将使用这个字体大小作为参考值,即 1rem 等于这个字体大小|微信基础库 2.9.0|
|enable-pull-down-refresh|Boolean|""|否|是否开启下拉刷新|App 2.6.7|
-|@resize|eventhandle||否|页面尺寸变化时会触发 resize 事件, event.detail = { size: { windowWidth, windowHeight } }|微信基础库 2.9.0|
-|@scroll|eventhandle||否|页面滚动时会触发 scroll 事件, event.detail = { scrollTop }|微信基础库 2.9.0|
+|@resize|eventhandle||否|页面尺寸变化时会触发 resize 事件, event.detail = { size: { windowWidth: number, windowHeight: number } }|微信基础库 2.9.0|
+|@scroll|eventhandle||否|页面滚动时会触发 scroll 事件, event.detail = { scrollTop: number }|微信基础库 2.9.0|
|@scrolldone|eventhandle||否|如果通过改变 scroll-top 属性来使页面滚动,页面滚动结束后会触发 scrolldone 事件|微信基础库 2.9.0|
diff --git a/docs/component/picker-view.md b/docs/component/picker-view.md
index 81f7cfa25..2ce3928c6 100644
--- a/docs/component/picker-view.md
+++ b/docs/component/picker-view.md
@@ -18,7 +18,7 @@
|mask-bottom-style|String|设置蒙层下半部分的样式(使用 background-image 覆盖)|仅 app-nvue(3.6.7+) 支持|
|mask-class|String|设置蒙层的类名|app-nvue与抖音小程序与飞书小程序不支持|
|immediate-change|Boolean|是否在手指松开时立即触发 change 事件。若不开启则会在滚动动画结束后触发 change 事件。|微信小程序 2.21.1|
-|@change|EventHandle|当滚动选择,value 改变时触发 change 事件,event.detail = {value: value};value为数组,表示 picker-view 内的 picker-view-column 当前选择的是第几项(下标从 0 开始)| |
+|@change|EventHandle|当滚动选择,value 改变时触发 change 事件,event.detail = {value: [number]};value为数组,表示 picker-view 内的 picker-view-column 当前选择的是第几项(下标从 0 开始)| |
|@pickstart|eventhandle|当滚动选择开始时候触发事件|微信小程序2.3.1、快手小程序|
|@pickend|eventhandle|当滚动选择结束时候触发事件|微信小程序2.3.1、快手小程序|
diff --git a/docs/component/picker.md b/docs/component/picker.md
index aa69700cd..0e9efe656 100644
--- a/docs/component/picker.md
+++ b/docs/component/picker.md
@@ -12,12 +12,12 @@
|属性名|类型|默认值|说明|平台差异说明|
|:-|:-|:-|:-|:-|
-|range|Array / Array<Object>|[]|mode为 selector 或 multiSelector 时,range 有效||
+|range|(string/number)[][]/(string/number)[]|[]|mode为 selector 或 multiSelector 时,range 有效||
|range-key|String||当 range 是一个 `Array<Object>` 时,通过 range-key 来指定 Object 中 key 的值作为选择器显示内容||
|value|Number|0|value 的值表示选择了 range 中的第几个(下标从 0 开始)||
|selector-type|String|auto|UI类型,仅大屏时该属性生效,支持 picker、select、auto,默认在 iPad 以 picker 样式展示而在 PC 以 select 样式展示|H5 2.9.9+|
|disabled|Boolean|false|是否禁用|快手小程序不支持|
-|@change|EventHandle||value 改变时触发 change 事件,event.detail = {value: value}||
+|@change|EventHandle||value 改变时触发 change 事件,event.detail = {value: any}||
|@cancel|EventHandle||取消选择或点遮罩层收起 picker 时触发|快手小程序不支持|
- picker在各平台的实现是有UI差异的,有的平台如百度、支付宝小程序的Android端是从中间弹出的;有的平台支持循环滚动如百度小程序;有的平台没有取消按钮如App-iOS端。但均不影响功能使用。
@@ -38,11 +38,11 @@
|属性名|类型|默认值|说明|
|:-|:-|:-|:-|
-|range|二维 Array / 二维 Array<Object>|[]|mode为 selector 或 multiSelector 时,range 有效。二维数组,长度表示多少列,数组的每项表示每列的数据,如[["a","b"], ["c","d"]]|
+|range|(string/number)[][]/(string/number)[]|[]|mode为 selector 或 multiSelector 时,range 有效。二维数组,长度表示多少列,数组的每项表示每列的数据,如[["a","b"], ["c","d"]]|
|range-key|String||当 range 是一个二维 Array<Object> 时,通过 range-key 来指定 Object 中 key 的值作为选择器显示内容|
|value|Array|[]|value 每一项的值表示选择了 range 对应项中的第几个(下标从 0 开始)|
-|@change|EventHandle||value 改变时触发 change 事件,event.detail = {value: value}|
-|@columnchange|EventHandle||某一列的值改变时触发 columnchange 事件,event.detail = {column: column, value: value},column 的值表示改变了第几列(下标从0开始),value 的值表示变更值的下标|
+|@change|EventHandle||value 改变时触发 change 事件,event.detail = {value: any}|
+|@columnchange|EventHandle||某一列的值改变时触发 columnchange 事件,event.detail = {column: any, value: any},column 的值表示改变了第几列(下标从0开始),value 的值表示变更值的下标|
|@cancel|EventHandle||取消选择时触发(快手小程序不支持)|
|disabled|Boolean|false|是否禁用(快手小程序不支持)|
@@ -69,7 +69,7 @@
|value|String||表示选中的时间,格式为"hh:mm"||
|start|String||表示有效时间范围的开始,字符串格式为"hh:mm"|App 不支持|
|end|String||表示有效时间范围的结束,字符串格式为"hh:mm"|App 不支持|
-|@change|EventHandle||value 改变时触发 change 事件,event.detail = {value: value}||
+|@change|EventHandle||value 改变时触发 change 事件,event.detail = {value: any}||
|@cancel|EventHandle||取消选择时触发||
|disabled|Boolean|false|是否禁用| |
@@ -92,8 +92,8 @@
|value|String|0|表示选中的日期,格式为"YYYY-MM-DD"||
|start|String||表示有效日期范围的开始,字符串格式为"YYYY-MM-DD"||
|end|String||表示有效日期范围的结束,字符串格式为"YYYY-MM-DD"||
-|fields|String|day|有效值 year、month、day,表示选择器的粒度,默认为 day,App 端未配置此项时使用系统 UI|H5、App 2.6.3+、微信小程序、支付宝小程序、百度小程序、抖音小程序、飞书小程序|
-|@change|EventHandle||value 改变时触发 change 事件,event.detail = {value: value}||
+|fields|String|day|有效值 year、month、day,表示选择器的粒度,默认为 day,App 端未配置此项时使用系统 UI|H5、App 2.6.3+、微信小程序、百度小程序、抖音小程序、飞书小程序|
+|@change|EventHandle||value 改变时触发 change 事件,event.detail = {value: any}||
|@cancel|EventHandle||取消选择时触发||
|disabled|Boolean|false|是否禁用| |
@@ -121,7 +121,7 @@
|:-|:-|:-|:-|
|value|Array|[]|表示选中的省市区,默认选中每一列的第一个值|
|custom-item|String||可为每一列的顶部添加一个自定义的项|
-|@change|EventHandle||value 改变时触发 change 事件,event.detail = {value: value}|
+|@change|EventHandle||value 改变时触发 change 事件,event.detail = {value: any}|
|@cancel|EventHandle||取消选择时触发(快手小程序不支持)|
|disabled|Boolean|false|是否禁用(快手小程序不支持)|
diff --git a/docs/component/radio.md b/docs/component/radio.md
index 72d34dfe2..c579fee9b 100644
--- a/docs/component/radio.md
+++ b/docs/component/radio.md
@@ -8,8 +8,7 @@
|属性名|类型|默认值|说明|
|:-|:-|:-|:-|
-|@change|EventHandle||```` 中的选中项发生变化时触发 change 事件,event.detail = {value: 选中项radio的value}|
-
+|@change|EventHandle||```` 中的选中项发生变化时触发 change 事件,event.detail = {value: string}|
diff --git a/docs/component/rich-text.md b/docs/component/rich-text.md
index df38c581d..3bda59433 100644
--- a/docs/component/rich-text.md
+++ b/docs/component/rich-text.md
@@ -10,7 +10,7 @@
|属性名|类型|默认值|说明|平台兼容|
|:-|:-|:-|:-|:-|
-|nodes|Array / String|[]|节点列表 / HTML String||
+|nodes|string[] / string|[]|节点列表 / HTML String||
|space|string||显示连续空格|App、H5、微信基础库2.4.1+[详见](https://developers.weixin.qq.com/miniprogram/dev/component/rich-text.html)、QQ小程序、抖音小程序、快手小程序[详见](https://mp.kuaishou.com/docs/develop/components/basicComponents/richText.html)|
|selectable|Boolean|true|富文本是否可以长按选中,可用于复制,粘贴等场景|百度小程序(仅真机支持,基础库 3.150.1 以下版本默认为 false)|
|image-menu-prevent|Boolean|false|阻止长按图片时弹起默认菜单(将该属性设置为image-menu-prevent或image-menu-prevent="true"),只在初始化时有效,不能动态变更;若不想阻止弹起默认菜单,则不需要设置此属性|百度小程序|
diff --git a/docs/component/scroll-view.md b/docs/component/scroll-view.md
index df8f9717a..6d4a7b00f 100644
--- a/docs/component/scroll-view.md
+++ b/docs/component/scroll-view.md
@@ -6,7 +6,7 @@
-## 属性说明
+**属性说明**
|属性名 |类型 |默认值 |说明 |平台差异说明 |
|:- |:- |:- |:- |:- |
@@ -29,7 +29,7 @@
|scroll-anchoring|Boolean|false|开启 scroll anchoring 特性,即控制滚动位置不随内容变化而抖动,仅在 iOS 下生效,安卓下可参考 CSS overflow-anchor 属性。|微信小程序 2.8.2|
|@scrolltoupper |EventHandle| |滚动到顶部/左边,会触发 scrolltoupper 事件 | |
|@scrolltolower |EventHandle| |滚动到底部/右边,会触发 scrolltolower 事件 | |
-|@scroll |EventHandle| |滚动时触发,event.detail = {scrollLeft, scrollTop, scrollHeight, scrollWidth, deltaX, deltaY} | |
+|@scroll |EventHandle| |滚动时触发,event.detail = {scrollLeft: number, scrollTop: number, scrollHeight: number, scrollWidth: number, deltaX: number, deltaY: number} | |
|@refresherpulling |EventHandle| |自定义下拉刷新控件被下拉|H5、app-vue 2.5.12+,微信小程序基础库2.10.1+|
|@refresherrefresh |EventHandle| |自定义下拉刷新被触发|H5、app-vue 2.5.12+,微信小程序基础库2.10.1+|
|@refresherrestore |EventHandle| |自定义下拉刷新被复位|H5、app-vue 2.5.12+,微信小程序基础库2.10.1+|
diff --git a/docs/component/slider.md b/docs/component/slider.md
index ad8b91a6b..80c52f4ae 100644
--- a/docs/component/slider.md
+++ b/docs/component/slider.md
@@ -18,8 +18,11 @@
|block-size|Number|28|滑块的大小,取值范围为 12 - 28
|block-color|Color|#ffffff|滑块的颜色|
|show-value|Boolean|false|是否显示当前 value|
-|@change|EventHandle||完成一次拖动后触发的事件,event.detail = {value: value}|
-|@changing|EventHandle||拖动过程中触发的事件,event.detail = {value: value}|
+|@change|EventHandle||完成一次拖动后触发的事件,event.detail = {value: number}|
+|@changing|EventHandle||拖动过程中触发的事件,event.detail = {value: number}|
+
+
+
diff --git a/docs/component/swiper.md b/docs/component/swiper.md
index 9b29d8d39..1a0667d7b 100644
--- a/docs/component/swiper.md
+++ b/docs/component/swiper.md
@@ -33,9 +33,11 @@
|disable-touch|Boolean|false|是否禁止用户 touch 操作|App 2.5.5+、H5 2.5.5+、支付宝小程序、抖音小程序与飞书小程序(只在初始化时有效,不能动态变更)|
|touchable|Boolean|true|是否监听用户的触摸事件,只在初始化时有效,不能动态变更|抖音小程序与飞书小程序(uni-app 2.5.5+ 推荐统一使用 disable-touch)|
|easing-function|String|default|指定 swiper 切换缓动动画类型,有效值:default、linear、easeInCubic、easeOutCubic、easeInOutCubic|微信小程序、快手小程序、京东小程序|
-|@change|EventHandle||current 改变时会触发 change 事件,event.detail = {current: current, source: source}||
-|@transition|EventHandle||swiper-item 的位置发生改变时会触发 transition 事件,event.detail = {dx: dx, dy: dy},支付宝小程序暂不支持dx, dy|App、H5、微信小程序、支付宝小程序、抖音小程序、飞书小程序、QQ小程序、快手小程序|
-|@animationfinish|EventHandle||动画结束时会触发 animationfinish 事件,event.detail = {current: current, source: source}|抖音小程序与飞书小程序不支持|
+|@change|EventHandle||current 改变时会触发 change 事件,event.detail = {current: number, source: any}||
+|@transition|EventHandle||swiper-item 的位置发生改变时会触发 transition 事件,event.detail = {dx: number, dy: number},支付宝小程序暂不支持dx, dy|App、H5、微信小程序、支付宝小程序、抖音小程序、飞书小程序、QQ小程序、快手小程序|
+|@animationfinish|EventHandle||动画结束时会触发 animationfinish 事件,event.detail = {current: number, source: any}|抖音小程序与飞书小程序不支持|
+
+
diff --git a/docs/component/switch.md b/docs/component/switch.md
index 5839cc81a..ce0947d90 100644
--- a/docs/component/switch.md
+++ b/docs/component/switch.md
@@ -12,9 +12,7 @@
|disabled|Boolean|false|是否禁用|抖音小程序与飞书小程序不支持|
|type|String|switch|样式,有效值:switch, checkbox||
|color|Color|-|switch 的颜色,同 css 的 color||
-|@change|EventHandle|-|checked 改变时触发 change 事件,event.detail={ value:checked}||
-
-
+|@change|EventHandle|-|checked 改变时触发 change 事件,event.detail={ value:boolean}||
**示例** [查看演示](https://hellouniapp.dcloud.net.cn/pages/component/switch/switch)
diff --git a/docs/component/text.md b/docs/component/text.md
index b16ac5867..e88e3b562 100644
--- a/docs/component/text.md
+++ b/docs/component/text.md
@@ -9,13 +9,13 @@
虽然app-uvue中写在view的text区域的文字,也会被编译器自动包裹一层text组件,看起来也可以使用。但这样会造成无法修改该text文字的样式,详见uvue的[样式不继承](https://doc.dcloud.net.cn/uni-app-x/css/#stylenoextends)章节
-## 属性说明
+**属性说明**
|属性名 |类型 |默认值 |说明 |平台差异说明 |
|:-|:- |:- |:- |:- |
|selectable |Boolean|false |文本是否可选 | |
|user-select |Boolean|false |文本是否可选 | 微信小程序 |
-|space |String | |显示连续空格 |钉钉小程序不支持 |
+|space |'ensp'/'emsp'/'nbsp' | |显示连续空格 |钉钉小程序不支持 |
|decode |Boolean|false |是否解码 |百度、钉钉小程序不支持 |
diff --git a/docs/component/textarea.md b/docs/component/textarea.md
index 0883a7180..7b645df7f 100644
--- a/docs/component/textarea.md
+++ b/docs/component/textarea.md
@@ -32,12 +32,13 @@
|auto-blur|boolean|false|键盘收起时,是否自动失去焦点|App-vue 3.0.0+ ,App-nvue不支持|
|ignoreCompositionEvent|boolean|true|是否忽略组件内对文本合成系统事件的处理。为 `false` 时将触发 `compositionstart、compositionend、compositionupdate` 事件,且在文本合成期间会触发 `input` 事件|App-vue (3.4.4+)、H5 (3.4.4+)、App-nvue不支持|
|inputmode|String|"text"|是一个枚举属性,它提供了用户在编辑元素或其内容时可能输入的数据类型的提示。[有效值](#inputmode)|H5(3.7.0+)、App-vue(3.7.0+)|
-|@focus|EventHandle||输入框聚焦时触发,event.detail = { value, height },height 为键盘高度|仅微信小程序、京东小程序、App(HBuilderX 2.0+ [nvue uni-app模式](http://ask.dcloud.net.cn/article/36074)) 、QQ小程序支持 height|
-|@blur|EventHandle||输入框失去焦点时触发,event.detail = {value, cursor}|快手小程序不支持 cursor|
-|@linechange|EventHandle||输入框行数变化时调用,event.detail = {height: 0, heightRpx: 0, lineCount: 0}|抖音小程序、飞书小程序、快手小程序不支持|
-|@input|EventHandle||当键盘输入时,触发 input 事件,event.detail = {value, cursor}, @input 处理函数的返回值并不会反映到 textarea 上|快手小程序不支持|
-|@confirm|EventHandle||点击完成时, 触发 confirm 事件,event.detail = {value: value}|微信小程序、百度小程序、QQ小程序、京东小程序|
-|@keyboardheightchange|Eventhandle||键盘高度发生变化的时候触发此事件,event.detail = {height: height, duration: duration}|微信小程序基础库2.7.0+、App 3.1.0+|
+|@focus|EventHandle||输入框聚焦时触发,event.detail = { value: string, height: number },height 为键盘高度|仅微信小程序、京东小程序、App(HBuilderX 2.0+ [nvue uni-app模式](http://ask.dcloud.net.cn/article/36074)) 、QQ小程序支持 height|
+|@blur|EventHandle||输入框失去焦点时触发,event.detail = {value: string, cursor: number}|快手小程序不支持 cursor cursor|
+|@linechange|EventHandle||输入框行数变化时调用,event.detail = {height: number, heightRpx: number, lineCount: number}|抖音小程序、飞书小程序、快手小程序不支持|
+|@input|EventHandle||当键盘输入时,触发 input 事件,event.detail = {value: string, cursor: number}, @input 处理函数的返回值并不会反映到 textarea 上|快手小程序不支持|
+|@confirm|EventHandle||点击完成时, 触发 confirm 事件,event.detail = {value: string}|微信小程序、百度小程序、QQ小程序、京东小程序|
+|@keyboardheightchange|Eventhandle||键盘高度发生变化的时候触发此事件,event.detail = {height: number, duration: number}|微信小程序基础库2.7.0+、App 3.1.0+|
+
diff --git a/docs/component/video.md b/docs/component/video.md
index fa7569ce1..335f73ad3 100644
--- a/docs/component/video.md
+++ b/docs/component/video.md
@@ -16,7 +16,7 @@
|initial-time|Number||指定视频初始播放位置,单位为秒(s)。|飞书小程序不支持|
|duration|Number||指定视频时长,单位为秒(s)。|抖音小程序、飞书小程序、快手小程序、京东小程序不支持|
|controls|Boolean|true|是否显示默认播放控件(播放/暂停按钮、播放进度、时间)|快手小程序不支持|
-|danmu-list|Object Array||弹幕列表|抖音小程序、飞书小程序、快手小程序、京东小程序不支持|
+|danmu-list|{text: string;color: string;time: number;}[]||弹幕列表|抖音小程序、飞书小程序、快手小程序、京东小程序不支持|
|danmu-btn|Boolean|false|是否显示弹幕按钮,只在初始化时有效,不能动态变更|抖音小程序、飞书小程序、快手小程序、京东小程序不支持|
|enable-danmu|Boolean|false|是否展示弹幕,只在初始化时有效,不能动态变更|抖音小程序、飞书小程序、快手小程序、京东小程序不支持|
|page-gesture|Boolean|false|在非全屏模式下,是否开启亮度与音量调节手势|微信小程序、H5|
@@ -48,18 +48,18 @@
|@play|EventHandle||当开始/继续播放时触发play事件|飞书小程序不支持|
|@pause|EventHandle||当暂停播放时触发 pause 事件|飞书小程序不支持|
|@ended|EventHandle||当播放到末尾时触发 ended 事件|飞书小程序不支持|
-|@timeupdate|EventHandle||播放进度变化时触发,event.detail = {currentTime, duration} 。触发频率 250ms 一次|飞书小程序不支持|
-|@fullscreenchange|EventHandle||当视频进入和退出全屏时触发,event.detail = {fullScreen, direction},direction取为 vertical 或 horizontal|飞书小程序不支持|
+|@timeupdate|EventHandle||播放进度变化时触发,event.detail = {currentTime: number, duration: number} 。触发频率 250ms 一次|飞书小程序不支持|
+|@fullscreenchange|EventHandle||当视频进入和退出全屏时触发,event.detail = {fullScreen: boolean, direction: 'vertical'|'horizontal'},direction取为 vertical 或 horizontal|飞书小程序不支持|
|@waiting|EventHandle||视频出现缓冲时触发|飞书小程序、快手小程序不支持|
|@error|EventHandle||视频播放出错时触发|飞书小程序不支持|
-|@progress|EventHandle||加载进度变化时触发,只支持一段加载。event.detail = {buffered},百分比|微信小程序、抖音小程序、H5|
+|@progress|EventHandle||加载进度变化时触发,只支持一段加载。event.detail = {buffered:Blob},百分比|微信小程序、抖音小程序、H5|
|@loadeddata|EventHandle||视频资源开始加载时触发|京东小程序|
|@loadstart|EventHandle||开始加载数据|京东小程序|
|@seeked|EventHandle||拖动进度条结束|京东小程序|
|@seeking|EventHandle||正在拖动进度条|京东小程序|
-|@loadedmetadata|EventHandle||视频元数据加载完成时触发。event.detail = {width, height, duration}|微信小程序、H5、抖音小程序、京东小程序|
-|@fullscreenclick|EventHandle||视频播放全屏播放时点击事件。event.detail = { screenX:"Number类型,点击点相对于屏幕左侧边缘的 X 轴坐标", screenY:"Number类型,点击点相对于屏幕顶部边缘的 Y 轴坐标", screenWidth:"Number类型,屏幕总宽度", screenHeight:"Number类型,屏幕总高度"}|App 2.6.3+|
-|@controlstoggle|EventHandle||切换 controls 显示隐藏时触发。event.detail = {show}|微信小程序2.9.5|
+|@loadedmetadata|EventHandle||视频元数据加载完成时触发。event.detail = {width: number, height: number, duration}|微信小程序、H5、抖音小程序、京东小程序|
+|@fullscreenclick|EventHandle||视频播放全屏播放时点击事件。event.detail = { screenX: number, screenY: number, screenWidth:"Number类型,屏幕总宽度", screenHeight:"Number类型,屏幕总高度"}|App 2.6.3+|
+|@controlstoggle|EventHandle||切换 controls 显示隐藏时触发。event.detail = {show: boolean}|微信小程序2.9.5|
`