diff --git a/docs/.vuepress/config/navbar.js b/docs/.vuepress/config/navbar.js index 352eaad57c5431abd5483c85032f074fd19b49fa..1a84d1df38b66cb0e85816763a5db70f7754e94f 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 e45021dac9e77a8ef535f3b539410a223fc182bb..605966f2936bc8ffc73b7a6d9f002074c8cb951d 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 095bb01b5309f94c21a31d447915ae415db21743..ef75a53dae8ead2a15ed1b99affff8a02a5b25dd 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 1620bd930847c48f45bc1b5109b5f7652322c5b6..ee57639727ba41db834b0ccdc8c906af7d7e05a3 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 - - - -``` -> 组合式 API -```ts -// components/Foo.uvue - - - - -// page.uvue - - - -``` -::: - -## ref - -在 `uni-app js 引擎版`中,非 `Web端` 只能用于获取自定义组件,不能用于获取内置组件实例(如:`view`、`text`)。\ -在 `uni-app x` 中,内置组件会返回组件根节点的引用,自定义组件会返回组件实例。 - -**注意事项:** -- 如果多个节点或自定义组件绑定相同 `ref` 属性,将获取到最后一个节点或组件实例的引用。 -- 在 `v-for` 循环时,绑定 `ref` 属性会获取到节点或组件实例的集合。 -- 在 `uni-app x` 中,要访问 `$refs` 中的属性,需要使用索引方式。 - -::: preview -> uni-app x -```ts -// 选项式 API - - - - -// 组合式 API - - - -``` -> uni-app js 引擎版 -```ts - - - -``` -::: - ## 监听页面生命周期 -`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 - -如: - -`