From 5a2a8eacf2db6270c40ed9344025bdd3f3526d03 Mon Sep 17 00:00:00 2001
From: DCloud_LXH <283700113@qq.com>
Date: Sun, 28 Apr 2024 11:05:41 +0800
Subject: [PATCH] wip: vue
---
docs/.vuepress/config/navbar.js | 5 +
docs/.vuepress/markdown/inject-json-to-md.js | 67 +-
docs/_sidebar.md | 2 -
docs/component/README.md | 581 +-------------
docs/page.md | 13 +-
docs/vue/README.md | 758 -------------------
docs/vue/_sidebar.md | 10 +
docs/vue/advanced-api.md | 6 +
docs/vue/built-in.md | 155 ++++
docs/vue/component.md | 542 +++++++++++++
docs/vue/composition-api.md | 320 ++++++++
docs/vue/data-bind.md | 113 +++
docs/vue/global-api.md | 65 ++
docs/vue/options-api.md | 291 +++++++
docs/vue/others.md | 5 +
docs/vue/single-file-component.md | 309 ++++++++
16 files changed, 1885 insertions(+), 1357 deletions(-)
create mode 100644 docs/vue/_sidebar.md
create mode 100644 docs/vue/advanced-api.md
create mode 100644 docs/vue/built-in.md
create mode 100644 docs/vue/component.md
create mode 100644 docs/vue/composition-api.md
create mode 100644 docs/vue/data-bind.md
create mode 100644 docs/vue/global-api.md
create mode 100644 docs/vue/options-api.md
create mode 100644 docs/vue/others.md
create mode 100644 docs/vue/single-file-component.md
diff --git a/docs/.vuepress/config/navbar.js b/docs/.vuepress/config/navbar.js
index 352eaad5..1a84d1df 100644
--- a/docs/.vuepress/config/navbar.js
+++ b/docs/.vuepress/config/navbar.js
@@ -34,6 +34,11 @@ export const navbar = [
type: 'link',
link: '/uts/'
},
+ {
+ text: 'VUE',
+ type: 'link',
+ link: '/vue/'
+ },
{
text: '全局文件',
type: 'link',
diff --git a/docs/.vuepress/markdown/inject-json-to-md.js b/docs/.vuepress/markdown/inject-json-to-md.js
index e45021da..605966f2 100644
--- a/docs/.vuepress/markdown/inject-json-to-md.js
+++ b/docs/.vuepress/markdown/inject-json-to-md.js
@@ -43,107 +43,142 @@ try {
pageInstanceJson = require('../utils/pageInstanceJson.json')
} catch (error) {}
-function getRegExp(key) {
+function getRegExp(key, text) {
return new RegExp(``)
}
/**
*
* @param {string} text
- * @returns {{match: RegExpMatchArray | null, json: {}}
+ * @returns {{match: RegExpMatchArray | null, json: {}, regExp: RegExp | null}
*/
const getJSON = text => {
- let match = text.match(getRegExp('CSSJSON'))
+ const CSSJSONRegExp = getRegExp('CSSJSON')
+ let match = text.match(CSSJSONRegExp)
+ CSSJSONRegExp.lastIndex = 0
if (match) {
return {
match,
json: cssJson,
+ regExp: CSSJSONRegExp,
}
}
- match = text.match(getRegExp('UTSJSON'))
+
+ const UTSJSONRegExp = getRegExp('UTSJSON')
+ match = text.match(UTSJSONRegExp)
+ UTSJSONRegExp.lastIndex = 0
if (match) {
return {
match,
json: utsJson,
+ regExp: UTSJSONRegExp,
}
}
- match = text.match(getRegExp('UTSAPIJSON'))
+ const UTSAPIJSONRegExp = getRegExp('UTSAPIJSON')
+ match = text.match(UTSAPIJSONRegExp)
+ UTSAPIJSONRegExp.lastIndex = 0
if (match) {
return {
match,
json: utsApiJson,
+ regExp: UTSAPIJSONRegExp,
}
}
- match = text.match(getRegExp('UTSCOMJSON'))
+ const UTSCOMJSONRegExp = getRegExp('UTSCOMJSON')
+ match = text.match(UTSCOMJSONRegExp)
+ UTSCOMJSONRegExp.lastIndex = 0
if (match) {
return {
match,
json: utsComJson,
+ regExp: UTSCOMJSONRegExp,
}
}
- match = text.match(getRegExp('UTSUNICLOUDAPIJSON'))
+ const UTSUNICLOUDAPIJSONRegExp = getRegExp('UTSUNICLOUDAPIJSON')
+ match = text.match(UTSUNICLOUDAPIJSONRegExp)
+ UTSUNICLOUDAPIJSONRegExp.lastIndex = 0
if (match) {
return {
match,
json: utsUnicloudApiJson,
+ regExp: UTSUNICLOUDAPIJSONRegExp,
}
}
- match = text.match(getRegExp('CUSTOMTYPEJSON'))
+ const CUSTOMTYPEJSONRegExp = getRegExp('CUSTOMTYPEJSON')
+ match = text.match(CUSTOMTYPEJSONRegExp)
+ CUSTOMTYPEJSONRegExp.lastIndex = 0
if (match) {
return {
match,
json: customTypeJson,
+ regExp: CUSTOMTYPEJSONRegExp,
}
}
- match = text.match(getRegExp('VUEJSON'))
+ const VUEJSONRegExp = getRegExp('VUEJSON')
+ match = text.match(VUEJSONRegExp)
+ VUEJSONRegExp.lastIndex = 0
if (match) {
return {
match,
json: vueJson,
+ regExp: VUEJSONRegExp,
}
}
- match = text.match(getRegExp('MANIFESTJSON'))
+ const MANIFESTJSONRegExp = getRegExp('MANIFESTJSON')
+ match = text.match(MANIFESTJSONRegExp)
+ MANIFESTJSONRegExp.lastIndex = 0
if (match) {
return {
match,
json: manifestJson,
+ regExp: MANIFESTJSONRegExp,
}
}
- match = text.match(getRegExp('PAGESJSON'))
+ const PAGESJSONRegExp = getRegExp('PAGESJSON')
+ match = text.match(PAGESJSONRegExp)
+ PAGESJSONRegExp.lastIndex = 0
if (match) {
return {
match,
json: pagesJson,
+ regExp: PAGESJSONRegExp,
}
}
- match = text.match(getRegExp('SPECIALSTRINGJSON'))
+ const SPECIALSTRINGJSONRegExp = getRegExp('SPECIALSTRINGJSON')
+ match = text.match(SPECIALSTRINGJSONRegExp)
+ SPECIALSTRINGJSONRegExp.lastIndex = 0
if (match) {
return {
match,
json: specialStringJson,
+ regExp: SPECIALSTRINGJSONRegExp,
}
}
- match = text.match(getRegExp('PAGEINSTANCE'))
+ const PAGEINSTANCERegExp = getRegExp('PAGEINSTANCE')
+ match = text.match(PAGEINSTANCERegExp)
+ PAGEINSTANCERegExp.lastIndex = 0
if (match) {
return {
match,
json: pageInstanceJson,
+ regExp: PAGEINSTANCERegExp,
}
}
return {
match: null,
json: {},
+ regExp: null,
}
}
@@ -157,8 +192,8 @@ module.exports = md => {
for (let index = 0; index < lines.length; index++) {
const line = lines[index]
- const { match, json } = getJSON(line)
- if (match) {
+ const { match, json, regExp } = getJSON(line)
+ if (match && regExp) {
const jsonPath = match[1]
const path = jsonPath.split('.')
let temp = json
@@ -167,7 +202,7 @@ module.exports = md => {
temp = temp[key]
})
if (!temp) continue
- lines[index] = temp
+ lines[index] = lines[index].replace(regExp, temp)
}
}
diff --git a/docs/_sidebar.md b/docs/_sidebar.md
index 095bb01b..ef75a53d 100644
--- a/docs/_sidebar.md
+++ b/docs/_sidebar.md
@@ -7,8 +7,6 @@
* [复杂列表开发指南](tutorial/stickynestlist.md)
* [全局变量与状态管理](tutorial/store.md)
* [几种组件标记的概念澄清](tutorial/idref.md)
-* vue 框架
- * [概述](vue/README.md)
* [web端开发指南](web/README.md)
* 运行和调试
* [真机运行](https://uniapp.dcloud.net.cn/tutorial/run/run-app.html)
diff --git a/docs/component/README.md b/docs/component/README.md
index 1620bd93..ee576397 100644
--- a/docs/component/README.md
+++ b/docs/component/README.md
@@ -1,602 +1,31 @@
# uvue组件概述
-uni-app x支持的组件包括:
-- 内置基础组件
-- 自定义vue组件
-- uts组件插件
-
-除了微信小程序,其他平台不支持的小程序wxml组件。
-
-支持[easycom](https://uniapp.dcloud.net.cn/component/index.html#easycom)。
-
-内置组件比较简单,扩展组件的2种方式详细介绍下
-
-- 自定义vue组件
- 在components目录新建一个uvue/vue文件,按vue组件规范编写代码。
-
- 组件界面通过uvue构造,script使用uts编写。
-
- 返回的类型是组件实例[ComponentPublicInstance](../vue/)。
-
-- uts组件插件
- `uts组件插件`的名称可能有点拗口,这是因为是相对于另一个分类`uts api插件`。
-
- 它们同属于`uts插件`,是[uni_modules](https://uniapp.dcloud.net.cn/plugin/uni_modules.html)。api插件指能力扩展,比如蓝牙api。而组件插件指界面元素扩展,比如video、map、lottie动画等。
-
- uts组件插件,指把原生的、需要在界面上显示的、内嵌于页面中整体排版的组件,编写uts代码调用原生sdk,通过uni_modules插件的方式集成到uni-app项目中。比如
- * lottie组件,使用uts调用原生的lottie sdk来开发组件,再引入页面中。[详见](https://ext.dcloud.net.cn/plugin?name=uni-animation-view)
- * video组件,其实官方的video,也是用uts组件插件实现的。[详见](https://gitcode.net/dcloud/uni-component/-/tree/master/uni_modules/uni-video)
-
- uts组件插件,主要用于原生sdk涉及界面时,将其封装为界面组件。当然uts组件也是全端支持的。上述lottie组件也支持web端。
-
- 在app端,它的内部界面是由原生sdk绘制的,而不是uvue代码绘制的。通过封装嵌入到uvue/nvue页面中。
-
- 一个uts插件都是可以同时兼容uni-app x和uni-app js引擎版的。目前js引擎版仅支持内嵌于nvue页面中。所以上述lottie组件也是可以在app-nvue页面中使用的。
-
- uts组件的返回类型是dom元素[Element](../dom/element.md)
-
- uts组件插件的开发教程,[详见](https://uniapp.dcloud.net.cn/plugin/uts-component.html)
-
-**vue组件兼容性及注意事项:**
-
-## props
-
-- 支持[对象方式](https://cn.vuejs.org/guide/components/props.html#props-declaration)声明。从 4.0+ 支持字符串数组方式声明。使用字符串数组方式声明时,所有 prop 类型均为 any | null。
-- 仅支持直接在 `export default` 内部声明,不支持其他位置定义后,在 `export default` 中引用。
-- 复杂数据类型需要通过 `PropType` 标记类型,[详见](https://cn.vuejs.org/guide/typescript/options-api.html#typing-component-props)。
-- `type` 不支持使用自定义的构造函数。
-
-::: preview
-> 选项式 API
-```ts
-
-```
-> 组合式 API
-```ts
-
-```
-:::
-
-::: preview
-> 选项式 API
-```ts
-
-```
-> 组合式 API
-```ts
-
-```
-:::
-
-## 自定义组件 v-model 绑定复杂表达式 @v-model-complex-expression
-
-自定义组件 `v-model` 绑定复杂表达式时,需要通过 `as` 指定类型(仅App-Android 平台)。
-
-::: preview
-> 选项式 API
-```ts
-
-
-
-
-
-```
-> 组合式 API
-```ts
-
-
-
-
-
-```
-:::
-
-## 作用域插槽的类型
-
-作用域插槽需在组件中指定插槽数据类型
-::: preview
-> 选项式 API
-```ts
-// components/Foo.uvue
-
-
-
-
-
-
-// page.uvue
-
-
-
- {{ msg }}
-
-
-
-
-
-```
-> 组合式 API
-```ts
-// components/Foo.uvue
-
-
-
-
-
-
-// page.uvue
-
-
-
- {{ msg }}
-
-
-
-
-
-```
-:::
-
-## ref
-
-在 `uni-app js 引擎版`中,非 `Web端` 只能用于获取自定义组件,不能用于获取内置组件实例(如:`view`、`text`)。\
-在 `uni-app x` 中,内置组件会返回组件根节点的引用,自定义组件会返回组件实例。
-
-**注意事项:**
-- 如果多个节点或自定义组件绑定相同 `ref` 属性,将获取到最后一个节点或组件实例的引用。
-- 在 `v-for` 循环时,绑定 `ref` 属性会获取到节点或组件实例的集合。
-- 在 `uni-app x` 中,要访问 `$refs` 中的属性,需要使用索引方式。
-
-::: preview
-> uni-app x
-```ts
-// 选项式 API
-
-
- text node
-
-
-
-
-
-
-// 组合式 API
-
-
- text node
-
-
-
-
-
-```
-> uni-app js 引擎版
-```ts
-
-
- text node
-
-
-
-
-
-```
-:::
-
## 监听页面生命周期
-`4.0` 起可通过组合式 API 实现组件中监听页面生命周期,[示例代码](https://gitcode.net/dcloud/hello-uvue/-/blob/alpha/pages/composition-api/lifecycle/component-lifecycle/component-lifecycle.uvue)。
+`4.0` 起可通过组合式 API 实现组件中监听页面生命周期,[示例代码](../vue/component.md#component-lifecycle)。
## 调用组件方法@methods
-需要把组件分为 内置组件、easycom组件、非easycom组件,这3种组件有不同的方法调用方式。
+需要把组件分为 内置组件、easycom组件、非easycom组件,这3种组件有不同的方法调用方式。[详情](../vue/component.md#page-call-component-method)
### 内置组件的方法调用或设置属性
> 3.93+ 支持
-使用 `this.$refs` 获取组件并as转换为组件对应的element类型,通过 `.`操作符 调用组件方法或设置属性。
-
-**语法**
-
-```(this.$refs['组件ref属性值'] as Uni[xxx]Element).foo();```
-
-**内置组件的element类型规范**
-
-Uni`组件名(驼峰)`Element
-
-如:
-
-`