diff --git a/docs/.vuepress/.gitignore b/docs/.vuepress/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..53c37a16608c014b2cf0bd2d5dfcafe953cdd857 --- /dev/null +++ b/docs/.vuepress/.gitignore @@ -0,0 +1 @@ +dist \ No newline at end of file diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js new file mode 100644 index 0000000000000000000000000000000000000000..c2cda23b915338cfc2166a5beaf320b6f65d0284 --- /dev/null +++ b/docs/.vuepress/config.js @@ -0,0 +1,68 @@ +const { slugify } = require('@vuepress/shared-utils') +const translatePlugin = require('./markdown/translate') +const headerPlugin = require('./markdown/header') +const createSidebar = require('./markdown/createSidebar') + +const tabs = ['/uniCloud/', '/plugin/', '/worktile/', '/tutorial/', '/collocation/', '/component/', '/api/', '/'] + +const config = { + // base: '/docs/', + // TODO use theme + title: 'uni-app', + themeConfig: { + titleLogo: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/1ae87107-2943-4ba6-be2b-390ca27c6260.png', + logo: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/5a7f902b-21a7-4822-884f-925219eacc4b.png', + // TODO use plugin/theme + sidebar: createSidebar(tabs), + // sidebarDepth: 2, + nextLinks: false, + prevLinks: false, + // TODO use theme + repo: 'dcloudio/uni-app', + docsRepo: 'dcloudio/unidocs-en', + docsBranch: 'main', + docsDir: 'docs', + editLinks: true, + editLinkText: '帮助我们改善此页面!', + // smoothScroll: true, + algolia: { + apiKey: 'ca67b01d14df58783e2f7dc45c79736e', + indexName: 'en-uniapp-dcloud', + appId: 'TZ0EGQ9J1Y' + } + }, + markdown: { + slugify(str) { + let slug = str + + if (slug.includes('@')) { + let array = slug.split('@') + slug = array.length > 1 ? array[array.length - 1] : str + } else { + const UNI = 'uni.' + if (slug.startsWith(UNI)) { + slug = slug.split(UNI)[1] + } + if (slug.indexOf('OBJECT') !== -1) { + ['(', '('].forEach(item => { + if (slug.indexOf(item) !== -1) + slug = slug.split(item)[0].toLocaleLowerCase(); + }) + } + } + + return slugify(slug) + }, + extractHeaders: ['h1', 'h2', 'h3', 'h4'], + chainMarkdown(config) { + config + .plugin('translate') + .use(translatePlugin) + .end() + .plugin('convert-header') + .use(headerPlugin) + } + } +} + +module.exports = config \ No newline at end of file diff --git a/docs/.vuepress/markdown/createMarkdownArray.js b/docs/.vuepress/markdown/createMarkdownArray.js new file mode 100644 index 0000000000000000000000000000000000000000..f92dcd3fcec99e878ee51a2a30aaed92bef4d58d --- /dev/null +++ b/docs/.vuepress/markdown/createMarkdownArray.js @@ -0,0 +1,61 @@ + +function createMarkdownArray(contents = [], childrenName = 'children') { + const markdownArray = [] + let itemCatch = {} + for (let index = 0; index < contents.length; index++) { + const item = contents[index]; + + if (itemCatch.parent) { + if (item.level === itemCatch.level) { + const child = { + ...item, + parent: itemCatch.parent + }; + itemCatch.parent[childrenName].push(child) + delete itemCatch.parent + itemCatch = child + continue + } else if (item.level > itemCatch.level) { + const child = { + ...item, + parent: itemCatch + }; + (itemCatch[childrenName] || (itemCatch[childrenName] = [])).push(child) + itemCatch = child + } else { + const parent = itemCatch.parent + delete itemCatch.parent + itemCatch = parent + index-- + continue + } + } else { + if (typeof itemCatch.level === 'undefined' || item.level === itemCatch.level) { + itemCatch = item + markdownArray.push(itemCatch) + } else { + const child = { + ...item, + parent: itemCatch + }; + (itemCatch[childrenName] || (itemCatch[childrenName] = [])).push(child) + itemCatch = child + continue + } + } + } + + function removeParent(childs = []) { + childs.forEach(child => { + if (child.parent) delete child.parent + if (child[childrenName]) removeParent(child[childrenName]) + }) + } + + // 移除最后一项 parent 节点,防止循环引用报错 + removeParent(markdownArray[markdownArray.length - 1][childrenName]) + + return markdownArray +} + +module.exports = createMarkdownArray \ No newline at end of file diff --git a/docs/.vuepress/markdown/createSidebar.js b/docs/.vuepress/markdown/createSidebar.js new file mode 100644 index 0000000000000000000000000000000000000000..efc7ba44f3d811caae3a8717a45ee08bab068e99 --- /dev/null +++ b/docs/.vuepress/markdown/createSidebar.js @@ -0,0 +1,46 @@ +const fs = require('fs') +const path = require('path') +const MarkdownIt = require('markdown-it'); +const createMarkdownArray = require('./createMarkdownArray') +const { isExternal } = require('../utils') + +function parseBar(file, options) { + const textName = options.text || 'text' + const linkName = options.link || 'link' + const contents = [] + + new MarkdownIt() + .parse(fs.readFileSync(file, { encoding: 'utf-8' })) + .forEach(token => { + if (token.type === 'inline') { + let [_, text, link] = token.content.match(/\[(.+?)\]\((.+?)\)/) || token.content.match(/(.+)/) + link = link && ( + isExternal(link) + ? link + : path.join('/', link.replace(/\.md\b/, '') + .replace(/\bREADME\b/, '') + .replace(/\/index/, '/') + .replace(/\?id=/, '#')) + .replace(/\\/g, '/') + ) + contents.push({ + level: token.level, + [textName]: text, + [linkName]: link + }) + } + }) + + return createMarkdownArray(contents, options.children) +} + +module.exports = function (tabs = []) { + const sidebar = {} + tabs.forEach(tab => { + sidebar[tab] = parseBar(path.join(__dirname, '../../', tab, '_sidebar.md'), { + text: 'title', + link: 'path' + }) + }) + return tabs.length ? sidebar : false +} \ No newline at end of file diff --git a/docs/.vuepress/markdown/header.js b/docs/.vuepress/markdown/header.js new file mode 100644 index 0000000000000000000000000000000000000000..bc4af83ae8f2262dd3d9dd47fee5f07f78f39458 --- /dev/null +++ b/docs/.vuepress/markdown/header.js @@ -0,0 +1,32 @@ +function parseHeader(tokens) { + tokens.forEach((t, i) => { + if (t.type === 'heading_open' && /h\d/.test(t.tag)) { + const token = tokens[i + 1] + const title = token.content + const res = title.match(/\s*(.+?)@(.+?)\s*$/) + if (res) { + token.content = res[1] + for (let i = 0, array = token.children, l = array.length; i < l; i++) { + const token = array[l - 1 - i] + if (token.type === 'text') { + const title = token.content + const res = title.match(/(.*)@.+/) + if (res) { + token.content = res[1] + break + } + } + } + } + } + }) + return tokens +} + +module.exports = md => { + md.parse = (function (mdParse) { + return function (src, ...array) { + return parseHeader(mdParse.bind(this)(src, ...array)) + } + })(md.parse) +} diff --git a/docs/.vuepress/markdown/navbar.config.js b/docs/.vuepress/markdown/navbar.config.js new file mode 100644 index 0000000000000000000000000000000000000000..435087e929360c1455211d8981f640545f7319a8 --- /dev/null +++ b/docs/.vuepress/markdown/navbar.config.js @@ -0,0 +1,156 @@ +/** + * text + * target + * link // 有协议时是外链 + * items + * type // link、links。 + * rel + */ +export const navbar = [ + { + text: 'uni-app', + items: [ + { + text: '介绍', + type: 'link', + link: '/' + }, + { + text: '教程', + type: 'link', + link: '/tutorial/' + }, + { + text: '全局文件', + type: 'link', + link: '/collocation/pages' + }, + { + text: '组件', + type: 'link', + link: '/component/' + }, + { + text: 'API', + type: 'link', + link: '/api/' + }, + { + text: '插件', + type: 'link', + link: '/plugin/' + }, + { + text: '工程化', + type: 'link', + link: '/worktile/' + }, + { + text: '其他规范', + type: 'links', + link: 'http://www.html5plus.org/doc/h5p.html', + items: [ + { + text: 'App扩展规范 HTML5 Plus', + type: 'link', + link: 'http://www.html5plus.org/doc/h5p.html' + }, + { + text: '微信小程序', + type: 'link', + link: 'https://developers.weixin.qq.com/miniprogram/dev/framework/' + }, + { + text: '支付宝小程序', + type: 'link', + link: 'https://docs.alipay.com/mini/developer/getting-started' + }, + { + text: '百度小程序', + type: 'link', + link: 'https://smartprogram.baidu.com/docs/develop/tutorial/codedir/' + }, + { + text: '字节跳动小程序', + type: 'link', + link: 'https://developer.toutiao.com/dev/cn/mini-app/develop/component/introduction/basic-component' + }, + { + text: '飞书小程序', + type: 'link', + link: 'https://open.feishu.cn/document/uYjL24iN/uUDNzUjL1QzM14SN0MTN' + }, + { + text: '钉钉小程序', + type: 'link', + link: 'https://developers.dingtalk.com/document/app/introduction-to-dingtalk-mini-programs' + }, + { + text: 'QQ小程序', + type: 'link', + link: 'https://q.qq.com/wiki/develop/miniprogram/frame/' + }, + { + text: '快手小程序', + type: 'link', + link: 'https://mp.kuaishou.com/docs/develop/frame/config/conf_appjson.html' + }, + { + text: '华为快应用', + type: 'link', + link: 'https://developer.huawei.com/consumer/cn/doc/development/quickApp-References/webview-component-view' + }, + { + text: '360小程序', + type: 'link', + link: 'https://mp.360.cn/doc/miniprogram/dev/#/view' + }, + { + text: 'Weex', + type: 'link', + link: 'http://doc.weex.io/zh/guide/introduction.html' + }, + ] + }, + { + link: "https://github.com/dcloudio/uni-app", + target: "_blank", + text: "GitHub", + type: "link" + } + ] + }, + { + text: 'uniCloud', + type: 'link', + link: '/uniCloud/' + }, + { + text: 'HBuilder', + link: 'https://www.dcloud.io/hbuilderx.html', + type: "link", + target: '_blank', + needOutbound: false + }, + { + text: 'uni 小程序 sdk', + link: 'https://nativesupport.dcloud.net.cn/UniMPDocs/SDKDownload/android', + type: "link", + target: '_blank', + needOutbound: false + }, + /* { + text: '问答社区', + link: 'https://ask.dcloud.net.cn/explore/', + type: "link", + target: '_blank', + needOutbound: false + }, + { + text: '插件市场', + type: "link", + target: '_blank', + link: 'https://ext.dcloud.net.cn/', + needOutbound: false + } */ +] \ No newline at end of file diff --git a/docs/.vuepress/markdown/translate.js b/docs/.vuepress/markdown/translate.js new file mode 100644 index 0000000000000000000000000000000000000000..e17970d1e2fc7d6ee8f38496a96f20f86debcf34 --- /dev/null +++ b/docs/.vuepress/markdown/translate.js @@ -0,0 +1,12 @@ +module.exports = md => { + md.parse = (function (mdParse) { + return function (src, ...array) { + return mdParse.bind(this)(src, ...array) + } + })(md.parse) + md.render = (function (mdRender) { + return function (src, ...array) { + return mdRender.bind(this)(src, ...array) + } + })(md.render) +} diff --git a/docs/.vuepress/theme/components/MainNavbarLink.vue b/docs/.vuepress/theme/components/MainNavbarLink.vue new file mode 100644 index 0000000000000000000000000000000000000000..b101d802b800e9e9765f304a02d781bc34c0425d --- /dev/null +++ b/docs/.vuepress/theme/components/MainNavbarLink.vue @@ -0,0 +1,57 @@ + + + + + \ No newline at end of file diff --git a/docs/.vuepress/theme/components/NavLink.vue b/docs/.vuepress/theme/components/NavLink.vue new file mode 100644 index 0000000000000000000000000000000000000000..c91e13768d4973a65ca2501314728274bbf07e7e --- /dev/null +++ b/docs/.vuepress/theme/components/NavLink.vue @@ -0,0 +1,92 @@ + + + diff --git a/docs/.vuepress/theme/components/NavLinks.vue b/docs/.vuepress/theme/components/NavLinks.vue new file mode 100644 index 0000000000000000000000000000000000000000..41dd695a8d1621d2960e6359626ddf663184d2d5 --- /dev/null +++ b/docs/.vuepress/theme/components/NavLinks.vue @@ -0,0 +1,173 @@ + + + + + diff --git a/docs/.vuepress/theme/components/Navbar.vue b/docs/.vuepress/theme/components/Navbar.vue new file mode 100644 index 0000000000000000000000000000000000000000..bd9e2dbdc085bdc7c29c7558829a34d7b790f468 --- /dev/null +++ b/docs/.vuepress/theme/components/Navbar.vue @@ -0,0 +1,259 @@ + + + + + diff --git a/docs/.vuepress/theme/components/SidebarLink.vue b/docs/.vuepress/theme/components/SidebarLink.vue new file mode 100644 index 0000000000000000000000000000000000000000..80a25ae91f4c9903e6666773fd60ef17bd394659 --- /dev/null +++ b/docs/.vuepress/theme/components/SidebarLink.vue @@ -0,0 +1,135 @@ + + + \ No newline at end of file diff --git a/docs/.vuepress/theme/enhanceApp.js b/docs/.vuepress/theme/enhanceApp.js new file mode 100644 index 0000000000000000000000000000000000000000..2dfb29b9dcd29a7273d5c6f124ba66552d861498 --- /dev/null +++ b/docs/.vuepress/theme/enhanceApp.js @@ -0,0 +1,113 @@ +function handleRedirectForCleanUrls(router, to) { + if (isRouteExists(router, to.path)) { + return to.path + } else { + if (!/(\/|\.html)$/.test(to.path)) { + const endingSlashUrl = to.path + '/' + const endingHtmlUrl = to.path + '.html' + if (isRouteExists(router, endingHtmlUrl)) { + return endingHtmlUrl + } else if (isRouteExists(router, endingSlashUrl)) { + return endingSlashUrl + } else { + return to.path + } + } else if (/\/$/.test(to.path)) { + const endingHtmlUrl = to.path.replace(/\/$/, '') + '.html' + if (isRouteExists(router, endingHtmlUrl)) { + return endingHtmlUrl + } else { + return to.path + } + } else { + return to.path + } + } +} + +function isRouteExists(router, path) { + const pathLower = path.toLowerCase() + return router.options.routes.some(route => route.path.toLowerCase() === pathLower) +} + +function handlePath(router, to) { + const id = to.query.id + const redirectPath = handleRedirectForCleanUrls(router, to) + + if (id) { + return { + path: redirectPath, + hash: '#' + decodeURIComponent(id.toLowerCase()) + } + } + if (redirectPath !== to.path) { + return { + path: redirectPath, + hash: decodeURIComponent(to.hash).toLowerCase() + } + } + if (/\bREADME\b/.test(to.path)) { + return { + path: to.path.replace(/\bREADME\b/, ''), + hash: decodeURIComponent(to.hash).toLowerCase() + } + } +} + +export default ({ + Vue, + options, + router, + siteData +}) => { + let mounted = false + const ScrollBehavior = 'smooth' + + router.beforeHooks.unshift((to, from, next) => { + next(handlePath(router, to)) + }) + + router.options.scrollBehavior = function scrollBehavior(to, from, savedPosition) { + if (savedPosition) { + return window.scrollTo({ + top: savedPosition.y, + behavior: ScrollBehavior, + }); + } + else if (to.hash) { + if (Vue.$vuepress.$get('disableScrollBehavior')) { + return false; + } + const selector = decodeURIComponent(to.hash) + return new Promise((resolve, reject) => { + setTimeout(() => { + if (!mounted) mounted = true + const targetElement = document.querySelector(selector); + if (targetElement) { + return window.scrollTo({ + top: getElementPosition(targetElement).y, + behavior: ScrollBehavior, + }); + } + return resolve(false); + }, mounted ? 0 : 700) + }) + } + else { + return window.scrollTo({ + top: 0, + behavior: ScrollBehavior, + }); + } + } +} + +function getElementPosition(el) { + const docEl = document.documentElement; + const docRect = docEl.getBoundingClientRect(); + const elRect = el.getBoundingClientRect(); + return { + x: elRect.left - docRect.left, + y: elRect.top - docRect.top, + }; +} \ No newline at end of file diff --git a/docs/.vuepress/theme/global-components/CodeSimulator.vue b/docs/.vuepress/theme/global-components/CodeSimulator.vue new file mode 100644 index 0000000000000000000000000000000000000000..89110b071dce8405c94af7ad6c08ac964041a5f9 --- /dev/null +++ b/docs/.vuepress/theme/global-components/CodeSimulator.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/docs/.vuepress/theme/index.js b/docs/.vuepress/theme/index.js new file mode 100644 index 0000000000000000000000000000000000000000..8297cdfdf581eb0134d7376d0ba9293a6c8c2bda --- /dev/null +++ b/docs/.vuepress/theme/index.js @@ -0,0 +1,23 @@ +module.exports = { + extend: '@vuepress/theme-default', + plugins: [ + ['container', { + type: 'preview', + validate: (params) =>{ + return params.trim().match(/^preview\s+(.*)$/); + }, + + render: (tokens, idx,otps,event)=> { + var m = tokens[idx].info.trim().match(/^preview\s+(.*)$/); + if (tokens[idx].nesting === 1) { + // opening tag + return ``; + } else { + // closing tag + return ``; + } + } + }], + '@vuepress/back-to-top' + ] +} diff --git a/docs/.vuepress/theme/layouts/Layout.vue b/docs/.vuepress/theme/layouts/Layout.vue new file mode 100644 index 0000000000000000000000000000000000000000..408ee028f9786f60bf1995a2c7ad3a65fd78f5d1 --- /dev/null +++ b/docs/.vuepress/theme/layouts/Layout.vue @@ -0,0 +1,182 @@ + + + diff --git a/docs/.vuepress/theme/mixin/navInject.js b/docs/.vuepress/theme/mixin/navInject.js new file mode 100644 index 0000000000000000000000000000000000000000..6eb511e9823fd8ee6f6827ce5731ea1f1cf211bc --- /dev/null +++ b/docs/.vuepress/theme/mixin/navInject.js @@ -0,0 +1,20 @@ +export default { + inject: ['navConfig', 'customNavBar', 'changeUserNav'], + + computed: { + showSubNavBar() { + return !!this.customNavBar[this.navConfig.userNavIndex].items + }, + mainNavBarText() { + return this.customNavBar[this.navConfig.userNavIndex].text + }, + subNavBarText() { + const curNavBar = this.customNavBar[this.navConfig.userNavIndex] + const curLink = (this.$page.path.match(/\/(\w+)+\/*/) || [])[1] + const item = curNavBar.items ? curNavBar.items.filter( + item => item.type === 'link' && item.link.indexOf(curLink) !== -1 + )[0] : curNavBar + return item ? item.text : curNavBar.items[0].text + } + } +} \ No newline at end of file diff --git a/docs/.vuepress/theme/mixin/navProvider.js b/docs/.vuepress/theme/mixin/navProvider.js new file mode 100644 index 0000000000000000000000000000000000000000..305d0d0621307cf43220813202a7c6258ea3e2ce --- /dev/null +++ b/docs/.vuepress/theme/mixin/navProvider.js @@ -0,0 +1,55 @@ +import { navbar } from '../../markdown/navbar.config'; + +export default { + data() { + return { navConfig: { userNavIndex: 0 } } + }, + + provide() { + return { + navConfig: this.navConfig, + customNavBar: this.customNavBar, + changeUserNav: this.changeUserNav + } + }, + + created() { + this.customNavBar.forEach((item, index) => { + item.text === this.$page.path.split('/')[1] && (this.navConfig.userNavIndex = index) + }) + }, + + computed: { + customNavBar() { + const list = [] + navbar.forEach(item => { + if (item.items && item.items.length) { + list.push(item) + } + item.type === 'link' && list.push(item) + }) + return list + }, + + customNavBarKeys() { + return this.customNavBar.map(item => item.text) + } + }, + + methods: { + changeUserNav(index) { + this.navConfig.userNavIndex = index + const curNavBar = this.customNavBar[index] + const firstItemLink = curNavBar.items ? curNavBar.items[0].link : curNavBar.link + if (this.$page.path !== firstItemLink) this.$router.push(firstItemLink) + } + }, + + watch: { + $route(after) { + let navbarIndex = this.customNavBarKeys.indexOf((after.fullPath.match(/\/(\w+)+\/*/) || [])[1]) + navbarIndex === -1 && after.fullPath === '/' && (navbarIndex = 0) + this.navConfig.userNavIndex !== navbarIndex && navbarIndex !== -1 && (this.navConfig.userNavIndex = navbarIndex) + } + } +} \ No newline at end of file diff --git a/docs/.vuepress/theme/styles/index.styl b/docs/.vuepress/theme/styles/index.styl new file mode 100644 index 0000000000000000000000000000000000000000..4437340c78816c5e9947abbde82ec13f5e644e9a --- /dev/null +++ b/docs/.vuepress/theme/styles/index.styl @@ -0,0 +1,102 @@ +.custom-page-class{ + /* 首页几个logo的排版 */ + .flex-img-group-view { + display flex + flex-direction row + margin 10px 0 + .barcode-view { + display flex + align-items center + flex-direction column + margin 0 5px + margin-bottom 20px + b { + text-align center + } + } + } + + .uniapp-home-content { + display flex + flex-wrap wrap + width 100% + justify-content center + .uniapp-home-content-item { + margin-bottom 20px + .uniapp-home-content-item-image { + width 55px + height 55px + flex-shrink 0 + img { + height 100% + } + } + p.uniapp-home-content-item-text { + margin-bottom 0px + letter-spacing 0px + color #333 + } + .uniapp-home-content-item-title{ + font-size 16px + } + } + } + @media screen and (min-width: 768px) { + .flex-img-group-view { + justify-content space-around + } + .uniapp-home-content-item{ + width 32% + } + } + @media screen and (max-width: 600px) { + .uniapp-home-content-item{ + width 100% + display flex + flex-direction row + } + .uniapp-home-content-item-header { + display flex + flex-direction column + padding-left 15px + } + .uniapp-home-content-item-title{ + line-height 10px + } + } +} + +img { + image-rendering: -moz-crisp-edges; /* Firefox*/ + image-rendering: -o-crisp-edges; /* Opera */ + image-rendering: -webkit-optimize-contrast; /*Webkit (non-standard naming) */ + image-rendering: crisp-edges; + -ms-interpolation-mode: nearest-neighbor; /* I (non-standard property) */ +} + +body.forbid_scroll + height 100% + overflow hidden + +{$contentClass}:not(.custom) + > *:first-child + margin-top 0 + @media (max-width: $MQMobile) + & + margin-top $navbarHeight + +h1, h2, h3, h4, h5, h6 + + {$contentClass}:not(.custom) > & + margin-top (5rem - $navbarHeight) + padding-top ($navbarHeight - 3rem) + + &:first-child + margin-top (3rem - $navbarHeight) + padding-top ($navbarHeight - 3rem) + @media (max-width: $MQMobile) + & + margin-top 3rem +@media (min-width: $MQMobile) + .nav-dropdown + z-index 1 \ No newline at end of file diff --git a/docs/.vuepress/theme/styles/navbar.styl b/docs/.vuepress/theme/styles/navbar.styl new file mode 100644 index 0000000000000000000000000000000000000000..c7279996c170fcffb99adfaaded6df244ec7a306 --- /dev/null +++ b/docs/.vuepress/theme/styles/navbar.styl @@ -0,0 +1,234 @@ +$navbar-main-navbar-height = $navbarHeight - $navbar-sub-navbar-height +$navbar-logo-height = $navbar-main-navbar-height - 2rem + +.navbar + height auto + background-color $navbar-background-color + text-align center + &:not(.navbar-fixed) + position static + .main-navbar-links + .links, .mobile-main-navbar + .links + background-color $navbar-background-color + .home-link + position: absolute + left: $navbar-horizontal-padding + line-height $navbar-logo-height + .title-logo + padding-left 20px + border-left 1px solid #ccc + @media (max-width: 1080px) + & + display none + .sub-navbar + line-height $navbar-sub-navbar-height + border-top-width 1px + .mobile-main-navbar + display none + .mobile-sub-navbar + display none + .main-navbar + color #222 + box-shadow 0 1px 0 0 rgba(0,0,0,.06) + position relative + display flex + justify-content center + align-items center + .main-navbar-links + width 50% + white-space: nowrap; + display inline-block + @media (min-width: 1080px) and (max-width: 1680px) + & + flex 1 + padding 0 300px + show-after() + opacity 1 + transform scaleX(1) + .main-navbar-item + display inline-block + padding 0 3% + position relative + &.active a + color $accentColor + &::after + show-after() + color $accentColor + &>a + &>div>a + color inherit + &:hover + color $accentColor + &::after + content '' + transition: all .2s cubic-bezier(.18,.89,.17,.88),opacity .15s ease + width 32px + height 2px + background-color $accentColor + position absolute + left 50% + margin-left -16px + bottom 0 + opacity 0 + transform scaleX(0) + +@media (max-width: $MQMobile) + $navbar-a-color = #222; + + .sidebar + width 100% + + .navbar + top 0px !important + height $navbar-main-navbar-height + & + position fixed !important + .main-navbar + justify-content flex-end + .mobile-main-navbar + display inline-block + padding-right 75px + a + color $navbar-a-color + .mobile-links__btn:after + content "" + width 6px + height 4px + background-image url("data:image/svg+xml;charset=UTF-8,%3csvg width='6' height='4' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M5.23575684.6H.76852779L3.0003575 3.09954227 5.23575684.6z' fill='%23000' stroke='%23000' stroke-width='1.2' fill-rule='evenodd'/%3e%3c/svg%3e") + background-repeat no-repeat + background-size contain + display inline-block + vertical-align middle + margin-left 4px + margin-top -2px + position static + border none + transform none + background-color transparent + border-radius 0 + .mobile-links__panel + text-align left + display flex + flex-direction column + position fixed + left 0 + right 0 + top $navbar-main-navbar-height + bottom 0 + background-color #f7f7f7 + overflow auto + z-index 99 + opacity 0 + visibility hidden + transition opacity .2s,top .2s + &.open + opacity 1 + visibility visible + .main-navbar-item + &.active a + color $accentColor + button.mobile-dropdown-title + a + display block + padding 20px 40px + font-size 17px + position relative + height auto + line-height 1.4 + button.mobile-dropdown-title + width 100% + text-align left + a + &::before + content "" + display block + width 12px + height 12px + background-image url("data:image/svg+xml;charset=UTF-8,%3csvg width='12' height='12' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M2.99427682 1.3995186L3.88640626.5l4.86067483 4.90093365c.3281374.33085521.331048.86434278 0 1.1981327L3.88640626 11.5l-.89212944-.89951856L7.55696751 6 2.99427682 1.3995186z' fill='%23000' fill-rule='evenodd' fill-opacity='.3'/%3e%3c/svg%3e") + background-size contain + background-repeat no-repeat + position absolute + right 40px + top 50% + margin-top -6px + &::after + content "" + display block + position absolute + bottom 0 + left 40px + right 40px + height 1px + background-color rgba(0,0,0,.08) + transform scaleY(.5) + width auto + opacity 1 + margin 0 + .sub-navbar + .mobile-sub-navbar + display block + background-color white + position relative + &::after + content "" + position absolute + display block + bottom 0 + left 0 + right 0 + height 1px + background-color #e4e8eb + transform scaleY(.5) + .subnavbar__item + a + display block + padding 0 16px + min-width 0 + margin 0 + background-color transparent + border-radius 0 + text-align left + font-size 17px + color $navbar-a-color + height 56px + line-height 56px + font-weight 500 + &::after + content "" + display block + width 12px + height 12px + position absolute + right 16px + top 50% + margin-top -6px + background-size contain + background-repeat no-repeat + background-image url("data:image/svg+xml;charset=UTF-8,%3csvg width='12' height='12' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M2.99427682 1.3995186L3.88640626.5l4.86067483 4.90093365c.3281374.33085521.331048.86434278 0 1.1981327L3.88640626 11.5l-.89212944-.89951856L7.55696751 6 2.99427682 1.3995186z' fill='%23000' fill-rule='evenodd' fill-opacity='.3'/%3e%3c/svg%3e") + transform rotate(90deg) + +emphasize() + position relative + &::before + @media (max-width: $MQMobile) + & + top: 8px; + content: ""; + display: block; + width: 4px; + height: 4px; + border-radius: 2px; + background-color: #07c160; + position: absolute; + top: 13px; + left: 18px; + +.sidebar>ul.sidebar-links>li>.active + ul>li .sidebar-link.active + &::before + left: 10px; + +.sidebar-links ul.sidebar-sub-headers .sidebar-link.active + emphasize() + +.sidebar-group.depth-1 + .sidebar-links>li>.sidebar-link.active:not(.data-no-emphasize) + emphasize() \ No newline at end of file diff --git a/docs/.vuepress/theme/styles/palette.styl b/docs/.vuepress/theme/styles/palette.styl new file mode 100644 index 0000000000000000000000000000000000000000..52f4d1b81991ab76a79885ae014908aa958ec4f9 --- /dev/null +++ b/docs/.vuepress/theme/styles/palette.styl @@ -0,0 +1,6 @@ +// 布局 +$accentColor = #42b983 +$contentWidth = 1200px +$navbarHeight = 9rem +$navbar-sub-navbar-height = 5rem +$navbar-background-color = #f7f7f7 \ No newline at end of file diff --git a/docs/.vuepress/theme/util/index.js b/docs/.vuepress/theme/util/index.js new file mode 100644 index 0000000000000000000000000000000000000000..567882ac724e7a83d2ae58574527ea1c4ee8c1fd --- /dev/null +++ b/docs/.vuepress/theme/util/index.js @@ -0,0 +1,280 @@ +export const hashRE = /#.*$/ +export const extRE = /\.(md|html)$/ +export const endingSlashRE = /\/$/ +export const outboundRE = /^[a-z]+:/i + +export function normalize(path) { + return decodeURI(path) + .replace(hashRE, '') + .replace(extRE, '') +} + +export function getHash(path) { + const match = path.match(hashRE) + if (match) { + return match[0] + } +} + +export function isExternal(path) { + return outboundRE.test(path) +} + +export function isMailto(path) { + return /^mailto:/.test(path) +} + +export function isTel(path) { + return /^tel:/.test(path) +} + +export function ensureExt(path) { + if (isExternal(path)) { + return path + } + const hashMatch = path.match(hashRE) + const hash = hashMatch ? hashMatch[0] : '' + const normalized = normalize(path) + + if (endingSlashRE.test(normalized)) { + return path + } + return normalized + '.html' + hash +} + +export function isActive(route, path) { + const routeHash = decodeURIComponent(route.hash) + const linkHash = getHash(path) + if (linkHash && routeHash !== linkHash) { + return false + } + const routePath = normalize(route.path) + const pagePath = normalize(path) + return routePath === pagePath +} + +export function resolvePage(pages, rawPath, base) { + if (isExternal(rawPath)) { + return { + type: 'external', + path: rawPath + } + } + if (base) { + rawPath = resolvePath(rawPath, base) + } + const path = normalize(rawPath) + const hash = rawPath.split('#')[1] + for (let i = 0; i < pages.length; i++) { + if (normalize(pages[i].regularPath) === path) { + return Object.assign({}, pages[i], { + type: 'page', + path: ensureExt(pages[i].path) + (hash ? `#${hash}` : '') + }) + } + } + console.error(`[vuepress] No matching page found for sidebar item "${rawPath}"`) + return {} +} + +function resolvePath(relative, base, append) { + const firstChar = relative.charAt(0) + if (firstChar === '/') { + return relative + } + + if (firstChar === '?' || firstChar === '#') { + return base + relative + } + + const stack = base.split('/') + + // remove trailing segment if: + // - not appending + // - appending to trailing slash (last segment is empty) + if (!append || !stack[stack.length - 1]) { + stack.pop() + } + + // resolve relative path + const segments = relative.replace(/^\//, '').split('/') + for (let i = 0; i < segments.length; i++) { + const segment = segments[i] + if (segment === '..') { + stack.pop() + } else if (segment !== '.') { + stack.push(segment) + } + } + + // ensure leading slash + if (stack[0] !== '') { + stack.unshift('') + } + + return stack.join('/') +} + +/** + * @param { Page } page + * @param { string } regularPath + * @param { SiteData } site + * @param { string } localePath + * @returns { SidebarGroup } + */ +export function resolveSidebarItems(page, regularPath, site, localePath) { + const { pages, themeConfig } = site + + const localeConfig = localePath && themeConfig.locales + ? themeConfig.locales[localePath] || themeConfig + : themeConfig + + const pageSidebarConfig = page.frontmatter.sidebar || localeConfig.sidebar || themeConfig.sidebar + if (pageSidebarConfig === 'auto') { + return resolveHeaders(page) + } + + const sidebarConfig = localeConfig.sidebar || themeConfig.sidebar + if (!sidebarConfig) { + return [] + } else { + const { base, config } = resolveMatchingConfig(regularPath, sidebarConfig) + if (config === 'auto') { + return resolveHeaders(page) + } + return config + ? config.map(item => resolveItem(item, pages, base)) + : [] + } +} + +/** + * @param { Page } page + * @returns { SidebarGroup } + */ +function resolveHeaders(page) { + const headers = groupHeaders(page.headers || []) + return [{ + type: 'group', + collapsable: false, + title: page.title, + path: null, + children: headers.map(h => ({ + type: 'auto', + title: h.title, + basePath: page.path, + path: page.path + '#' + h.slug, + children: h.children || [] + })) + }] +} + +export function groupHeaders(headers) { + // group h3s under h2 + headers = headers.map(h => Object.assign({}, h)) + let lastH2 + headers.forEach(h => { + if (h.level === 2) { + lastH2 = h + } else if (lastH2) { + (lastH2.children || (lastH2.children = [])).push(h) + } + }) + // TODO h1-h3 + return headers.filter(h => h.level === 2) +} + +export function resolveNavLinkItem(linkItem) { + return Object.assign(linkItem, { + type: linkItem.items && linkItem.items.length ? 'links' : 'link' + }) +} + +/** + * @param { Route } route + * @param { Array | Array | [link: string]: SidebarConfig } config + * @returns { base: string, config: SidebarConfig } + */ +export function resolveMatchingConfig(regularPath, config) { + if (Array.isArray(config)) { + return { + base: '/', + config: config + } + } + for (const base in config) { + if (ensureEndingSlash(regularPath).indexOf(encodeURI(base)) === 0) { + return { + base, + config: config[base] + } + } + } + return {} +} + +function ensureEndingSlash(path) { + return /(\.html|\/)$/.test(path) + ? path + : path + '/' +} + +function resolveItem(item, pages, base, groupDepth = 1) { + if (typeof item === 'string') { + return resolvePage(pages, item, base) + } else if (Array.isArray(item)) { + return Object.assign(resolvePage(pages, item[0], base), { + title: item[1] + }) + } else { + const children = item.children || [] + if (children.length === 0 && item.path) { + return Object.assign(resolvePage(pages, item.path, base), { + title: item.title + }) + } + return { + type: 'group', + path: item.path, + title: item.title, + sidebarDepth: item.sidebarDepth, + initialOpenGroupIndex: item.initialOpenGroupIndex, + children: children.map(child => resolveItem(child, pages, base, groupDepth + 1)), + collapsable: item.collapsable !== false + } + } +} + +export function forbidScroll(use = true) { + if (use) { + const classList = document.body.className.split(' ') + classList.push('forbid_scroll') + document.body.className = classList.join(' ') + } else { + document.body.className = document.body.className.replace(/\s+forbid_scroll/g, '') + } +} + +export const os = { + android: false, + ios: false, + mobile: false, + pc: false, + init: function () { + var ua = navigator.userAgent; + if (ua.match(/(Android);?[\s\/]+([\d+.]+)?/)) { + this.android = true; + this.mobile = true; + this.pc = false; + } else if (ua.match(/(iPhone\sOS)\s([\d_]+)/)) { + this.ios = true; + this.mobile = true; + this.pc = false; + } else { + this.android = false; + this.ios = false; + this.mobile = false; + this.pc = true; + } + } +}; \ No newline at end of file diff --git a/docs/.vuepress/utils/index.js b/docs/.vuepress/utils/index.js new file mode 100644 index 0000000000000000000000000000000000000000..947795b245372c5650279199619ea98f69626c19 --- /dev/null +++ b/docs/.vuepress/utils/index.js @@ -0,0 +1,7 @@ +function isExternal(path) { + return /^[a-z]+:/i.test(path) +} + +module.exports = { + isExternal +} \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index c14e4855c5b600656d2b249ff2f86209213a7b97..b3c837403d05b4298ed5398e1bcc69086a728e84 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,3 +1,6 @@ +--- +pageClass: custom-page-class +--- ```uni-app``` 是一个使用 [Vue.js](https://vuejs.org/) 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台。 @@ -6,7 +9,7 @@ `uni-app`在手,做啥都不愁。即使不跨端,```uni-app```也是更好的小程序开发框架([详见](https://ask.dcloud.net.cn/article/35947))、更好的App跨平台框架、更方便的H5开发框架。不管领导安排什么样的项目,你都可以快速交付,不需要转换开发思维、不需要更改开发习惯。
-

快速体验

+

快速体验

一套代码编到13个平台,这不是梦想。眼见为实,扫描13个二维码,亲自体验最全面的跨平台效果!

diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 7e25b320e13e653285d9056917d4433192140d61..78f9e9cf77a3411a84bc369e5592ae853167a1ff 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -4,58 +4,11 @@ * [2. 通过vue-cli命令行](quickstart-cli.md) * [uni-app的由来](history.md) * [如何学习](resource.md) -* [框架简介](frame.md) -* vue2教程 - * [基础](vue-basics.md) - * [组件](vue-components.md) - * [API](vue-api.md) - * [vuex](vue-vuex.md) -* [从 vue2 迁移到 vue3](migration-to-vue3.md) -* vue3教程 - * [基础](vue3-basics.md) - * [组件](vue3-components.md) - * [API](vue3-api.md) - * [vuex](vue3-vuex.md) -* nvue教程 - * [综述](nvue-outline.md) - * [样式](nvue-css.md) - * [API](nvue-api.md) - * [事件](nvue-event.md) -* [使用 HTML5+ 注意事项](use-html5plus.md) -* [条件编译 解决各端差异](platform.md) -* [uni-app 跨端开发注意](matter.md) -* [高效开发技巧](snippet.md) -* [性能优化建议](performance.md) -* [宽屏适配指南](adapt.md) -* [开放生态](ecosystem.md) -* [uni_modules插件规范](uni_modules.md) -* [从其他项目转uni-app](translate.md) -* [混合开发](hybrid.md) -* App打包配置 - * [图标](app-icons.md) - * [启动界面](app-splashscreen.md) - * [功能模块](app-modules.md) - * [Geolocation(定位)](app-geolocation.md) - * [Payment(支付)](app-payment.md) - * [Apple应用内支付](app-payment-aip.md) - * [支付宝支付](app-payment-alipay.md) - * [微信支付](app-payment-weixin.md) - * [Paypal支付](app-payment-paypal.md) - * [Stripe支付](app-payment-stripe.md) - * [Google支付](app-payment-google.md) - * [Statistic(统计)](app-statistic.md) - * [友盟统计](app-statistic-umeng.md) - * [Google统计](app-statistic-google.md) - * 其它配置 - * [iOS符号表文件](app-ios-dsym.md) -* App上架指南 - * [国内应用市场上架](android-store.md) - * [未同意隐私政策模式运行](app-disagreemode.md) - * [Google Play上架](android-gp.md) - * [App Store上架](ios-app-store.md) -* App安全问题 - * [Android安全漏洞问题解决方案](app-sec-android.md) -* [uni小程序sdk](https://nativesupport.dcloud.net.cn/README) +* [选型指南](select.md) +* [跨端注意](matter.md) +* [常见问题](faq.md) +* [其他项目转uni-app](translate.md) +* [老项目引入uni-app](hybrid.md) * 运营服务 * [App升级中心](uniCloud/upgrade-center.md) * [uni一键登录](univerify.md) @@ -64,96 +17,6 @@ * [广告变现](uni-ad.md) * [统一发行页面](m3w.md) * [案例](case.md) -* [选型评估指南](select.md) -* [常见问题](faq.md) * 更新日志 * [正式版](release.md) - * [Alpha版](release-note-alpha.md) - - -
  • 插件市场
  • -
  • 需求墙
  • -
  • 赞助我们
  • -
    - - -
    -
    uniCloud Web控制台
    -
    -
    - - -
    -
    论坛
    -
    -
    - - -
    -
    uniAD
    -
    -
    - - -
    -
    uni统计
    -
    -
    -
    - -
    -
    - 代码仓库:码云GitHub -
    -
    -
    -
    - -
    -
    官方QQ交流群
    -
    群33:498071674  点此加入
    -
    群35:713420817(2000人已满)
    -
    群34:530305531(2000人已满)
    - -
    群32:166188631(2000人已满)
    -
    群31:567471669(2000人已满)
    -
    群30:371046920(2000人已满)
    -
    群29:202965481(2000人已满)
    -
    群28:166188776(2000人已满)
    -
    群27:811363410(2000人已满)
    -
    群26:147867597(2000人已满)
    -
    群25:165297000(2000人已满)
    -
    群24:672494800(2000人已满)
    -
    群23:599958679(2000人已满)
    -
    群22:687186952(2000人已满)
    -
    群21:717019120(2000人已满)
    -
    群20:165796402(2000人已满)
    -
    群19:165657124(2000人已满)
    -
    群18:698592271(2000人已满)
    -
    群17:951348804(2000人已满)
    -
    群16:719211033(2000人已满)
    -
    群15:516984120(2000人已满)
    -
    群14:465953250(2000人已满)
    -
    群13:699478442(2000人已满)
    -
    群12:884860657(2000人已满)
    -
    群11:296811328(2000人已满)
    -
    群10:959059626(2000人已满)
    -
    群9:775128777(2000人已满)
    -
    群8:695442854(2000人已满)
    -
    群7:942061423(2000人已满)
    -
    群6:697264024(2000人已满)
    -
    群5:731951419(2000人已满)
    -
    群4:942702595(2000人已满)
    -
    群3:773794803(2000人已满)
    -
    群2:901474938(2000人已满)
    -
    群1:531031261(2000人已满)
    -
    -
    -
    - -
    -
    关注微信公众号
    - -
    -
    -
    + * [Alpha版](release-note-alpha.md) \ No newline at end of file diff --git a/docs/api/README.md b/docs/api/README.md index 3ce4ee7cf0badabf0c5a9ec411d3003f2f861a55..35be66dc817b6b87e6695e66424268bf932a5d1c 100644 --- a/docs/api/README.md +++ b/docs/api/README.md @@ -1,19 +1,3 @@ -`uni-app`的js API由标准ECMAScript的js API 和 uni 扩展 API 这两部分组成。 - -标准ECMAScript的js仅是最基础的js。浏览器基于它扩展了window、document、navigator等对象。小程序也基于标准js扩展了各种wx.xx、my.xx、swan.xx的API。node也扩展了fs等模块。 - -uni-app基于ECMAScript扩展了uni对象,并且API命名与小程序保持兼容。 - -## 标准js和浏览器js的区别 - -`uni-app`的js代码,h5端运行于浏览器中。非h5端(包含小程序和App),Android平台运行在v8引擎中,iOS平台运行在iOS自带的jscore引擎中,都没有运行在浏览器或webview里。 - -非H5端,虽然不支持window、document、navigator等浏览器的js API,但也支持标准ECMAScript。 - -请注意不要把浏览器里的js扩展对象等价于标准js。 - -所以uni-app的非H5端,一样支持标准js,支持if、for等语法,支持字符串、数字、时间、布尔值、数组、自定义对象等变量类型及各种处理方法。仅仅是不支持window、document、navigator等浏览器专用对象。 - ## 各端特色API调用 除了uni-app框架内置的跨端API,各端自己的特色API也可通过[条件编译](https://uniapp.dcloud.io/platform)自由使用。 diff --git a/docs/api/_sidebar copy.md b/docs/api/_sidebar copy.md new file mode 100644 index 0000000000000000000000000000000000000000..28e843b653c6b16f60af552a200df924ce612079 --- /dev/null +++ b/docs/api/_sidebar copy.md @@ -0,0 +1,233 @@ +* [API概述](api/README.md) +* 基础 + * [日志打印](api/log.md) + * [定时器](api/timer.md) + * [uni.base64ToArrayBuffer](api/base64ToArrayBuffer?id=base64toarraybuffer) + * [uni.arrayBufferToBase64](api/arrayBufferToBase64?id=arraybuffertobase64) + * [生命周期](api/lifecycle.md) + * [应用级事件](api/application.md) + * [拦截器](api/interceptor.md) + * [全局API](api/global.md) +* 网络 + * [发起请求](api/request/request.md) + * [上传、下载](api/request/network-file.md) + * [WebSocket](api/request/websocket.md) + * [SocketTask](api/request/socket-task.md) + * [mDNS](api/request/mDNS.md) + * [UDP 通信](api/request/UDP.md) +* 路由与页面跳转 + * [uni.navigateTo](/api/router?id=navigateto) + * [uni.redirectTo](/api/router?id=redirectto) + * [uni.reLaunch](/api/router?id=relaunch) + * [uni.switchTab](/api/router?id=switchtab) + * [uni.navigateBack](/api/router?id=navigateback) + * [uni.preloadPage](/api/preload-page) + * [窗口动画](/api/router?id=animation) +* 数据缓存 + * [uni.setStorage](/api/storage/storage?id=setstorage) + * [uni.setStorageSync](/api/storage/storage?id=setStorageSync) + * [uni.getStorage](/api/storage/storage?id=getStorage) + * [uni.getStorageSync](/api/storage/storage?id=getStorageSync) + * [uni.getStorageInfo](/api/storage/storage?id=getStorageInfo) + * [uni.getStorageInfoSync](/api/storage/storage?id=getStorageInfoSync) + * [uni.removeStorage](/api/storage/storage?id=removeStorage) + * [uni.removeStorageSync](/api/storage/storage?id=removeStorageSync) + * [uni.clearStorage](/api/storage/storage?id=clearStorage) + * [uni.clearStorageSync](/api/storage/storage?id=clearstoragesync) +* 位置 + * [获取位置](api/location/location.md) + * [查看位置](api/location/open-location.md) + * [地图组件控制](api/location/map.md) +* 媒体 + * [图片](api/media/image.md) + * [文件](api/media/file.md) + * [录音管理](api/media/record-manager.md) + * [背景音频播放管理](api/media/background-audio-manager.md) + * [音频组件控制](api/media/audio-context.md) + * [视频](api/media/video.md) + * [视频组件控制](api/media/video-context.md) + * [相机组件控制](api/media/camera-context.md) + * [直播组件控制](api/media/live-player-context.md) + * [富文本](api/media/editor-context.md) + * [音视频合成](api/media/media-container.md) +* 设备 + * [系统信息](api/system/info.md) + * [内存](api/system/memory.md) + * [网络状态](api/system/network.md) + * [系统主题](api/system/theme.md) + * [加速度计](api/system/accelerometer.md) + * [罗盘](api/system/compass.md) + * [陀螺仪](api/system/gyroscope.md) + * [拨打电话](api/system/phone.md) + * [扫码](api/system/barcode.md) + * [剪贴板](api/system/clipboard.md) + * [屏幕](api/system/brightness.md) + * [用户截屏事件](api/system/capture-screen.md) + * [振动](api/system/vibrate.md) + * [手机联系人](api/system/contact.md) + * [蓝牙](api/system/bluetooth.md) + * [低功耗蓝牙](api/system/ble.md) + * [iBeacon](api/system/ibeacon.md) + * [Wi-Fi](api/system/wifi.md) + * [电量](api/system/batteryInfo.md) + * [NFC](api/system/nfc.md) + * [设备方向](api/system/deviceMotion.md) + * [生物认证](api/system/authentication.md) +* [Worker](api/worker.md) +* 键盘 + * [uni.hideKeyboard](/api/key?id=hidekeyboard) + * [uni.onKeyboardHeightChange](/api/key?id=onkeyboardheightchange) + * [uni.offKeyboardHeightChange](/api/key?id=offkeyboardheightchange) +* 界面 + * [交互反馈](api/ui/prompt.md) + * [设置导航条](api/ui/navigationbar.md) + * [设置TabBar](api/ui/tabbar.md) + * [背景](api/ui/bgcolor.md) + * [动画](api/ui/animation?id=unicreateanimationobject) + * [滚动](api/ui/scroll) + * [窗口](api/ui/window.md) + * [宽屏适配](api/ui/adapt.md) + * [字体](api/ui/font.md) + * [下拉刷新](api/ui/pulldown.md) + * [节点信息](api/ui/nodes-info.md) + * [节点布局相交状态](api/ui/intersection-observer.md) + * [媒体查询](api/ui/media-query-observer.md) + * [自定义组件](api/ui/nextTick.md) + * [菜单](api/ui/menuButton.md) + * [语言](api/ui/locale.md) +* 页面和窗体 + * [页面](api/window/window.md) + * [页面通讯](api/window/communication.md) + * [subNVue原生子窗体](api/window/subNVues.md) +* 文件 + * [uni.saveFile](/api/file/file?id=savefile) + * [uni.getSavedFileList](/api/file/file?id=getSavedFileList) + * [uni.getSavedFileInfo](/api/file/file?id=getSavedFileInfo) + * [uni.removeSavedFile](/api/file/file?id=removeSavedFile) + * [uni.getFileInfo](/api/file/file?id=getFileInfo) + * [uni.openDocument](/api/file/file?id=openDocument) + * [uni.getFileSystemManager](/api/file/getFileSystemManager) +* 绘画 + * [uni.createOffscreenCanvas](api/canvas/createOffscreenCanvas.md) + * [uni.createCanvasContext](api/canvas/createCanvasContext.md) + * [uni.canvasToTempFilePath](api/canvas/canvasToTempFilePath.md) + * [uni.canvasPutImageData](api/canvas/canvasPutImageData.md) + * [uni.canvasGetImageData](api/canvas/canvasGetImageData.md) + * [CanvasContext](api/canvas/CanvasContext.md) + * [CanvasGradient](api/canvas/CanvasGradient.md) +* 广告 + * [激励视频广告](api/a-d/rewarded-video.md) + * [全屏视频广告](api/a-d/full-screen-video.md) + * [内容联盟广告](api/a-d/content-page.md) + * [插屏广告](api/a-d/interstitial.md) + * [互动游戏](api/a-d/interactive.md) +* 第三方服务 + * [获取服务供应商](api/plugins/provider.md) + * [登录](api/plugins/login.md) + * [分享](api/plugins/share.md) + * [支付](api/plugins/payment.md) + * [推送](api/plugins/push.md) + * [语音](api/plugins/voice.md) + * [一键生成iOS通用链接](api/plugins/universal-links.md) +* [uniCloud](api/uniCloud.md) +* 平台扩展 + * [App原生插件](api/extend/native-plugin.md) +* 其他 + * [授权](api/other/authorize.md) + * [设置](api/other/setting.md) + * [收货地址](api/other/choose-address.md) + * [获取发票抬头](api/other/invoice-title.md) + * [小程序跳转](api/other/open-miniprogram.md) + * [账号信息](api/other/getAccountInfoSync.md) + * [运动(计步器)](api/other/sport.md) + * [统计](api/other/report.md) + * [卡券](api/other/card.md) + * [模板消息](api/other/template.md) + * [订阅消息](api/other/requestSubscribeMessage.md) + * [小程序更新](api/other/update.md) + * [调试](api/other/set-enable-debug.md) + * [获取第三方平台数据](api/other/get-extconfig.md) +
  • +
    + + +
    +
    uniCloud Web控制台
    +
    +
    + + +
    +
    论坛
    +
    +
    + + +
    +
    uniAD
    +
    +
    + + +
    +
    uni统计
    +
    +
    +
    + +
    +
    + 代码仓库:码云GitHub +
    +
    +
    +
    + +
    +
    官方QQ交流群
    +
    群10:959059626  点此加入
    +
    群35:713420817(2000人已满)
    +
    群34:530305531(2000人已满)
    +
    群33:498071674(2000人已满)
    +
    群32:166188631(2000人已满)
    +
    群31:567471669(2000人已满)
    +
    群30:371046920(2000人已满)
    +
    群29:202965481(2000人已满)
    +
    群28:166188776(2000人已满)
    +
    群27:811363410(2000人已满)
    +
    群26:147867597(2000人已满)
    +
    群25:165297000(2000人已满)
    +
    群24:672494800(2000人已满)
    +
    群23:599958679(2000人已满)
    +
    群22:687186952(2000人已满)
    +
    群21:717019120(2000人已满)
    +
    群20:165796402(2000人已满)
    +
    群19:165657124(2000人已满)
    +
    群18:698592271(2000人已满)
    +
    群17:951348804(2000人已满)
    +
    群16:719211033(2000人已满)
    +
    群15:516984120(2000人已满)
    +
    群14:465953250(2000人已满)
    +
    群13:699478442(2000人已满)
    +
    群12:884860657(2000人已满)
    +
    群11:296811328(2000人已满)
    + +
    群9:775128777(2000人已满)
    +
    群8:695442854(2000人已满)
    +
    群7:942061423(2000人已满)
    +
    群6:697264024(2000人已满)
    +
    群5:731951419(2000人已满)
    +
    群4:942702595(2000人已满)
    +
    群3:773794803(2000人已满)
    +
    群2:901474938(2000人已满)
    +
    群1:531031261(2000人已满)
    +
    +
    +
    + +
    +
    关注微信公众号
    + +
    +
    +
    diff --git a/docs/api/_sidebar.md b/docs/api/_sidebar.md index af355f271356ca44accdbfc773685faf27455e45..c6c226cf33c8de59e141b2601309462dc8eb55b2 100644 --- a/docs/api/_sidebar.md +++ b/docs/api/_sidebar.md @@ -1,4 +1,4 @@ -* [API概述](api/README.md) +* [概述](api/README.md) * 基础 * [日志打印](api/log.md) * [定时器](api/timer.md) @@ -130,8 +130,6 @@ * [语音](api/plugins/voice.md) * [一键生成iOS通用链接](api/plugins/universal-links.md) * [uniCloud](api/uniCloud.md) -* 平台扩展 - * [App原生插件](api/extend/native-plugin.md) * 其他 * [授权](api/other/authorize.md) * [设置](api/other/setting.md) @@ -146,88 +144,4 @@ * [订阅消息](api/other/requestSubscribeMessage.md) * [小程序更新](api/other/update.md) * [调试](api/other/set-enable-debug.md) - * [获取第三方平台数据](api/other/get-extconfig.md) -
  • -
    - - -
    -
    uniCloud Web控制台
    -
    -
    - - -
    -
    论坛
    -
    -
    - - -
    -
    uniAD
    -
    -
    - - -
    -
    uni统计
    -
    -
    -
    - -
    -
    - 代码仓库:码云GitHub -
    -
    -
    -
    - -
    -
    官方QQ交流群
    -
    群10:959059626  点此加入
    -
    群35:713420817(2000人已满)
    -
    群34:530305531(2000人已满)
    -
    群33:498071674(2000人已满)
    -
    群32:166188631(2000人已满)
    -
    群31:567471669(2000人已满)
    -
    群30:371046920(2000人已满)
    -
    群29:202965481(2000人已满)
    -
    群28:166188776(2000人已满)
    -
    群27:811363410(2000人已满)
    -
    群26:147867597(2000人已满)
    -
    群25:165297000(2000人已满)
    -
    群24:672494800(2000人已满)
    -
    群23:599958679(2000人已满)
    -
    群22:687186952(2000人已满)
    -
    群21:717019120(2000人已满)
    -
    群20:165796402(2000人已满)
    -
    群19:165657124(2000人已满)
    -
    群18:698592271(2000人已满)
    -
    群17:951348804(2000人已满)
    -
    群16:719211033(2000人已满)
    -
    群15:516984120(2000人已满)
    -
    群14:465953250(2000人已满)
    -
    群13:699478442(2000人已满)
    -
    群12:884860657(2000人已满)
    -
    群11:296811328(2000人已满)
    - -
    群9:775128777(2000人已满)
    -
    群8:695442854(2000人已满)
    -
    群7:942061423(2000人已满)
    -
    群6:697264024(2000人已满)
    -
    群5:731951419(2000人已满)
    -
    群4:942702595(2000人已满)
    -
    群3:773794803(2000人已满)
    -
    群2:901474938(2000人已满)
    -
    群1:531031261(2000人已满)
    -
    -
    -
    - -
    -
    关注微信公众号
    - -
    -
    -
    + * [获取第三方平台数据](api/other/get-extconfig.md) \ No newline at end of file diff --git a/docs/api/a-d/content-page.md b/docs/api/a-d/content-page.md index 0ecc001a90c6416235d4630f398e378ff534dc57..a0290aa5c5babc4cfaa9dafa08f608399c28b519 100644 --- a/docs/api/a-d/content-page.md +++ b/docs/api/a-d/content-page.md @@ -9,7 +9,7 @@ 内容联盟广告是一个原生全屏组件,大小不可控制 -如果需要嵌入到页面控制大小请使用 [短视频内容联盟组件](https://uniapp.dcloud.net.cn/component/ad-content-page) +如果需要嵌入到页面控制大小请使用 [短视频内容联盟组件](https://uniapp.dcloud.net.cn/component/ad-content-page) **平台差异说明** diff --git a/docs/api/router.md b/docs/api/router.md index 4b7587bd527eb6d5e7d377c7b07ba67a704ff6cb..1bd1d117d70b1d54d202d59c4988b9b26582260c 100644 --- a/docs/api/router.md +++ b/docs/api/router.md @@ -43,7 +43,7 @@ export default { } ``` -``` +```js // 在起始页面跳转到test.vue页面,并监听test.vue发送过来的事件数据 uni.navigateTo({ url: 'pages/test?id=1', diff --git a/docs/collocation/App.md b/docs/collocation/App.md index 087adb235e37fd0d43f2b3a450d2b45a4c9b7d37..08f1f00ce8139878a8e1fb6315d8e660eea892d7 100644 --- a/docs/collocation/App.md +++ b/docs/collocation/App.md @@ -3,32 +3,46 @@ 这个文件的作用包括:调用应用生命周期函数、配置全局样式、配置全局的存储globalData 应用生命周期仅可在`App.vue`中监听,在页面监听无效。 -### 应用生命周期 +## 应用生命周期 -``uni-app`` 支持 onLaunch、onShow、onHide 等应用生命周期函数,详情请参考[应用生命周期](/collocation/frame/lifecycle?id=应用生命周期) +``uni-app`` 支持如下应用生命周期函数: +|函数名|说明| +|:-|:-| +|onLaunch|当``uni-app`` 初始化完成时触发(全局只触发一次)| +|onShow|当 ``uni-app`` 启动,或从后台进入前台显示| +|onHide|当 ``uni-app`` 从前台进入后台| +|onError|当 ``uni-app`` 报错时触发| +|onUniNViewMessage|对 ``nvue`` 页面发送的数据进行监听,可参考 [nvue 向 vue 通讯](https://uniapp.dcloud.io/tutorial/nvue-api?id=communication)| +|onUnhandledRejection|对未处理的 Promise 拒绝事件监听函数(2.8.1+)| +|onPageNotFound|页面不存在监听函数| +|onThemeChange|监听系统主题变化| + +**示例代码** ```html - + ``` **注意** - **应用生命周期仅可在`App.vue`中监听,在其它页面监听无效**。 - onlaunch里进行页面跳转,如遇白屏报错,请参考[https://ask.dcloud.net.cn/article/35942](https://ask.dcloud.net.cn/article/35942) - `App.vue` 不能写模板 +- onPageNotFound 页面实际上已经打开了(比如通过分享卡片、小程序码)且发现页面不存在,才会触发,api 跳转不存在的页面不会触发(如 uni.navigateTo) -### globalData +## globalData 小程序有globalData,这是一种简单的全局变量机制。这套机制在uni-app里也可以使用,并且全端通用。 **以下是 App.vue 中定义globalData的相关配置:** @@ -54,7 +68,7 @@ nvue的weex编译模式中使用globalData的话,由于weex生命周期不支 globalData是简单的全局变量,如果使用状态管理,请使用`vuex`(main.js中定义) -### 全局样式 +## 全局样式 在`App.vue`中,可以定义一些全局通用样式,例如需要加一个通用的背景色,首屏页面渲染的动画等都可以写在App.vue中。 注意如果工程下同时有vue和nvue文件,全局样式的所有css会应用于所有文件,而nvue支持的css有限,编译器会在控制台报警,提示某些css无法在nvue中支持。此时需要把nvue不支持的css写在单独的条件编译里。如: diff --git a/docs/collocation/_sidebar copy.md b/docs/collocation/_sidebar copy.md new file mode 100644 index 0000000000000000000000000000000000000000..fee335b73f6640cbacdaf565204f76668fe2acb9 --- /dev/null +++ b/docs/collocation/_sidebar copy.md @@ -0,0 +1,23 @@ +* 配置 + * [pages.json 页面路由](collocation/pages.md) + * [manifest.json 应用配置](collocation/manifest.md) + * [package.json](collocation/package.md) + * [vue.config.js](collocation/vue-config.md) + * [uni.scss](collocation/uni-scss.md) + * [App.vue](collocation/App.md) + * [main.js](collocation/main.md) + * [env](collocation/env.md) + * [plugin.json 生成小程序插件](collocation/miniprogram-plugin.md) +* 框架接口 + * [日志打印](collocation/frame/log.md) + * [定时器](collocation/frame/timer.md) + * [生命周期](collocation/frame/lifecycle.md) + * [页面](collocation/frame/window.md) + * [页面通讯](collocation/frame/communication.md) +* [SSR服务端渲染](collocation/ssr.md) +* [国际化](collocation/i18n.md) +* 自动化测试 + * [快速开始](collocation/auto/quick-start.md) + * [API](collocation/auto/api.md) + * [HBuilderX自动化测试插件](collocation/auto/hbuilderx-extension/index.md) + * [CLI项目自动化测试](collocation/auto/uniapp-cli-project.md) \ No newline at end of file diff --git a/docs/collocation/_sidebar.md b/docs/collocation/_sidebar.md index 9a7655e76c47ef296d92c5ce376eefbcd72b48d2..9e8106f4ea1370de52875b97903cb1fcc9297764 100644 --- a/docs/collocation/_sidebar.md +++ b/docs/collocation/_sidebar.md @@ -1,107 +1,8 @@ -* 配置 - * [pages.json 页面路由](collocation/pages.md) - * [manifest.json 应用配置](collocation/manifest.md) - * [package.json](collocation/package.md) - * [vue.config.js](collocation/vue-config.md) - * [uni.scss](collocation/uni-scss.md) - * [App.vue](collocation/App.md) - * [main.js](collocation/main.md) - * [env](collocation/env.md) - * [plugin.json 生成小程序插件](collocation/miniprogram-plugin.md) -* 框架接口 - * [日志打印](collocation/frame/log.md) - * [定时器](collocation/frame/timer.md) - * [生命周期](collocation/frame/lifecycle.md) - * [页面](collocation/frame/window.md) - * [页面通讯](collocation/frame/communication.md) -* [SSR服务端渲染](collocation/ssr.md) -* [国际化](collocation/i18n.md) -* 自动化测试 - * [快速开始](collocation/auto/quick-start.md) - * [API](collocation/auto/api.md) - * [HBuilderX自动化测试插件](collocation/auto/hbuilderx-extension/index.md) - * [CLI项目自动化测试](collocation/auto/uniapp-cli-project.md) -
  • -
    - - -
    -
    uniCloud Web控制台
    -
    -
    - - -
    -
    论坛
    -
    -
    - - -
    -
    uniAD
    -
    -
    - - -
    -
    uni统计
    -
    -
    -
    - -
    -
    - 代码仓库:码云GitHub -
    -
    -
    -
    - -
    -
    官方QQ交流群
    -
    群14:465953250  点此加入
    -
    群35:713420817(2000人已满)
    -
    群34:530305531(2000人已满)
    -
    群33:498071674(2000人已满)
    -
    群32:166188631(2000人已满)
    -
    群31:567471669(2000人已满)
    -
    群30:371046920(2000人已满)
    -
    群29:202965481(2000人已满)
    -
    群28:166188776(2000人已满)
    -
    群27:811363410(2000人已满)
    -
    群26:147867597(2000人已满)
    -
    群25:165297000(2000人已满)
    -
    群24:672494800(2000人已满)
    -
    群23:599958679(2000人已满)
    -
    群22:687186952(2000人已满)
    -
    群21:717019120(2000人已满)
    -
    群20:165796402(2000人已满)
    -
    群19:165657124(2000人已满)
    -
    群18:698592271(2000人已满)
    -
    群17:951348804(2000人已满)
    -
    群16:719211033(2000人已满)
    -
    群15:516984120(2000人已满)
    - -
    群13:699478442(2000人已满)
    -
    群12:884860657(2000人已满)
    -
    群11:296811328(2000人已满)
    -
    群10:959059626(2000人已满)
    -
    群9:775128777(2000人已满)
    -
    群8:695442854(2000人已满)
    -
    群7:942061423(2000人已满)
    -
    群6:697264024(2000人已满)
    -
    群5:731951419(2000人已满)
    -
    群4:942702595(2000人已满)
    -
    群3:773794803(2000人已满)
    -
    群2:901474938(2000人已满)
    -
    群1:531031261(2000人已满)
    -
    -
    -
    - -
    -
    关注微信公众号
    - -
    -
    -
    +* [pages.json 页面路由](collocation/pages.md) +* [manifest.json 应用配置](collocation/manifest.md) +* [package.json](collocation/package.md) +* [vue.config.js](collocation/vue-config.md) +* [uni.scss](collocation/uni-scss.md) +* [App.vue](collocation/App.md) +* [main.js](collocation/main.md) +* [plugin.json 生成小程序插件](collocation/miniprogram-plugin.md) \ No newline at end of file diff --git a/docs/collocation/frame/communication.md b/docs/collocation/frame/communication.md deleted file mode 100644 index 5949e6363134a02fd0db38635c14c43ed744b88e..0000000000000000000000000000000000000000 --- a/docs/collocation/frame/communication.md +++ /dev/null @@ -1,133 +0,0 @@ -> 自 HBuilderX 2.0.0 起支持,[使用指南](https://ask.dcloud.net.cn/article/36010) - -### uni.$emit(eventName,OBJECT) - -触发全局的自定事件。附加参数都会传给监听器回调。 - -|属性 |类型 |描述 | -|--- |--- |--- | -|eventName |String |事件名 | -|OBJECT |Object |触发事件携带的附加参数 | - -**代码示例** -```javascript - uni.$emit('update',{msg:'页面更新'}) -``` - - -### uni.$on(eventName,callback) - -监听全局的自定义事件。事件可以由 uni.$emit 触发,回调函数会接收所有传入事件触发函数的额外参数。 - -|属性 |类型 |描述 | -|--- |--- |--- | -|eventName |String |事件名 | -|callback |Function |事件的回调函数 | - - -**代码示例** -```javascript - uni.$on('update',function(data){ - console.log('监听到事件来自 update ,携带参数 msg 为:' + data.msg); - }) -``` - - -### uni.$once(eventName,callback) - -监听全局的自定义事件。事件可以由 uni.$emit 触发,但是只触发一次,在第一次触发之后移除监听器。 - -|属性 |类型 |描述 | -|--- |--- |--- | -|eventName |String |事件名 | -|callback |Function |事件的回调函数 | - - -**代码示例** -```javascript - uni.$once('update',function(data){ - console.log('监听到事件来自 update ,携带参数 msg 为:' + data.msg); - }) -``` - -### uni.$off([eventName, callback]) - -移除全局自定义事件监听器。 - -|属性 |类型 |描述 | -|--- |--- |--- | -|eventName |Array<String> |事件名 | -|callback |Function |事件的回调函数 | - -**Tips** -- 如果没有提供参数,则移除所有的事件监听器; -- 如果只提供了事件,则移除该事件所有的监听器; -- 如果同时提供了事件与回调,则只移除这个回调的监听器; -- 提供的回调必须跟$on的回调为同一个才能移除这个回调的监听器; - -**代码示例** - -`$emit`、`$on`、`$off`常用于跨页面、跨组件通讯,这里为了方便演示放在同一个页面 - -```html - - - - - - -``` - - -**注意事项** -- uni.$emit、 uni.$on 、 uni.$once 、uni.$off 触发的事件都是 App 全局级别的,跨任意组件,页面,nvue,vue 等 -- 使用时,注意及时销毁事件监听,比如,页面 onLoad 里边 uni.$on 注册监听,onUnload 里边 uni.$off 移除,或者一次性的事件,直接使用 uni.$once 监听 diff --git a/docs/collocation/frame/lifecycle.md b/docs/collocation/frame/lifecycle.md deleted file mode 100644 index 51efda1f7a6d26e4d3c9ec52bfcb00f3afc0b36f..0000000000000000000000000000000000000000 --- a/docs/collocation/frame/lifecycle.md +++ /dev/null @@ -1,164 +0,0 @@ -### 应用生命周期 - -``uni-app`` 支持如下应用生命周期函数: - -|函数名|说明| -|:-|:-| -|onLaunch|当``uni-app`` 初始化完成时触发(全局只触发一次)| -|onShow|当 ``uni-app`` 启动,或从后台进入前台显示| -|onHide|当 ``uni-app`` 从前台进入后台| -|onError|当 ``uni-app`` 报错时触发| -|onUniNViewMessage|对 ``nvue`` 页面发送的数据进行监听,可参考 [nvue 向 vue 通讯](https://uniapp.dcloud.io/nvue-api?id=communication)| -|onUnhandledRejection|对未处理的 Promise 拒绝事件监听函数(2.8.1+)| -|onPageNotFound|页面不存在监听函数| -|onThemeChange|监听系统主题变化| - -**注意** - -- 应用生命周期仅可在``App.vue``中监听,在其它页面监听无效。 -- onlaunch里进行页面跳转,如遇白屏报错,请参考[https://ask.dcloud.net.cn/article/35942](https://ask.dcloud.net.cn/article/35942) -- onPageNotFound 页面实际上已经打开了(比如通过分享卡片、小程序码)且发现页面不存在,才会触发,api 跳转不存在的页面不会触发(如 uni.navigateTo) - -**示例代码** -```html - -``` - -### 页面生命周期 - -``uni-app`` 支持如下页面生命周期函数: - -|函数名|说明|平台差异说明|最低版本| -|:-|:-|:-|:-| -|onInit|监听页面初始化,其参数同 onLoad 参数,为上个页面传递的数据,参数类型为 Object(用于页面传参),触发时机早于 onLoad|百度小程序|3.1.0+| -|onLoad|监听页面加载,其参数为上个页面传递的数据,参数类型为 Object(用于页面传参),参考[示例](/api/router?id=navigateto)||| -|onShow|监听页面显示。页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面||| -|onReady|监听页面初次渲染完成。注意如果渲染速度快,会在页面进入动画完成前触发||| -|onHide|监听页面隐藏||| -|onUnload|监听页面卸载||| -|onResize|监听窗口尺寸变化|App、微信小程序|| -|onPullDownRefresh|监听用户下拉动作,一般用于下拉刷新,参考[示例](api/ui/pulldown)||| -|onReachBottom|页面滚动到底部的事件(不是scroll-view滚到底),常用于下拉下一页数据。具体见下方注意事项||| -|onTabItemTap|点击 tab 时触发,参数为Object,具体见下方注意事项|微信小程序、QQ小程序、支付宝小程序、百度小程序、H5、App|| -|onShareAppMessage|用户点击右上角分享|微信小程序、QQ小程序、支付宝小程序、字节小程序、飞书小程序、快手小程序|| -|onPageScroll|监听页面滚动,参数为Object|nvue暂不支持|| -|onNavigationBarButtonTap|监听原生标题栏按钮点击事件,参数为Object|App、H5|| -|onBackPress|监听页面返回,返回 event = {from:backbutton、 navigateBack} ,backbutton 表示来源是左上角返回按钮或 android 返回键;navigateBack表示来源是 uni.navigateBack ;详细说明及使用:[onBackPress 详解](http://ask.dcloud.net.cn/article/35120)。支付宝小程序只有真机能触发,只能监听非navigateBack引起的返回,不可阻止默认行为。|app、H5、支付宝小程序|| -|onNavigationBarSearchInputChanged|监听原生标题栏搜索输入框输入内容变化事件|App、H5|1.6.0| -|onNavigationBarSearchInputConfirmed|监听原生标题栏搜索输入框搜索事件,用户点击软键盘上的“搜索”按钮时触发。|App、H5|1.6.0| -|onNavigationBarSearchInputClicked|监听原生标题栏搜索输入框点击事件(pages.json 中的 searchInput 配置 disabled 为 true 时才会触发)|App、H5|1.6.0| -|onShareTimeline|监听用户点击右上角转发到朋友圈|微信小程序|2.8.1+| -|onAddToFavorites|监听用户点击右上角收藏|微信小程序|2.8.1+| - -``onInit``使用注意 -- 仅百度小程序基础库 3.260 以上支持 onInit 生命周期 -- 其他版本或平台可以同时使用 onLoad 生命周期进行兼容,注意避免重复执行相同逻辑 -- 不依赖页面传参的逻辑可以直接使用 created 生命周期替代 - -``onReachBottom``使用注意 -可在pages.json里定义具体页面底部的触发距离[onReachBottomDistance](/collocation/pages),比如设为50,那么滚动页面到距离底部50px时,就会触发onReachBottom事件。 - -如使用scroll-view导致页面没有滚动,则触底事件不会被触发。scroll-view滚动到底部的事件请参考scroll-view的文档 - - -``onPageScroll`` (监听滚动、滚动监听、滚动事件)参数说明: - -|属性|类型|说明| -|---|---|---| -|scrollTop|Number|页面在垂直方向已滚动的距离(单位px)| - -**注意** -- `onPageScroll`里不要写交互复杂的js,比如频繁修改页面。因为这个生命周期是在渲染层触发的,在非h5端,js是在逻辑层执行的,两层之间通信是有损耗的。如果在滚动过程中,频发触发两层之间的数据交换,可能会造成卡顿。 -- 如果想实现滚动时标题栏透明渐变,在App和H5下,可在pages.json中配置titleNView下的type为transparent,[参考](https://uniapp.dcloud.io/collocation/pages?id=app-titlenview)。 -- 如果需要滚动吸顶固定某些元素,推荐使用css的粘性布局,参考[插件市场](https://ext.dcloud.net.cn/plugin?id=715)。插件市场也有其他js实现的吸顶插件,但性能不佳,需要时可自行搜索。 -- 在App、微信小程序、H5中,也可以使用wxs监听滚动,[参考](https://uniapp.dcloud.io/frame?id=wxs);在app-nvue中,可以使用bindingx监听滚动,[参考](https://uniapp.dcloud.io/nvue-api?id=nvue-%e9%87%8c%e4%bd%bf%e7%94%a8-bindingx)。 -- `onBackPress`上不可使用`async`,会导致无法阻止默认返回 - -```js -onPageScroll : function(e) { //nvue暂不支持滚动监听,可用bindingx代替 - console.log("滚动距离为:" + e.scrollTop); -}, -``` - -``onTabItemTap`` 返回的json对象说明: - -|属性|类型|说明| -|---|---|---| -|index|String|被点击tabItem的序号,从0开始| -|pagePath|String|被点击tabItem的页面路径| -|text|String|被点击tabItem的按钮文字| - -**注意** -- onTabItemTap常用于点击当前tabitem,滚动或刷新当前页面。如果是点击不同的tabitem,一定会触发页面切换。 -- 如果想在App端实现点击某个tabitem不跳转页面,不能使用onTabItemTap,可以使用[plus.nativeObj.view](http://www.html5plus.org/doc/zh_cn/nativeobj.html)放一个区块盖住原先的tabitem,并拦截点击事件。 -- 支付宝小程序平台onTabItemTap表现为点击非当前tabitem后触发,因此不能用于实现点击返回顶部这种操作 - -```js -onTabItemTap : function(e) { - console.log(e); - // e的返回格式为json对象: {"index":0,"text":"首页","pagePath":"pages/index/index"} -}, -``` - -``onNavigationBarButtonTap`` 参数说明: - -|属性|类型|说明| -|---|---|---| -|index|Number|原生标题栏按钮数组的下标| - -```js -onNavigationBarButtonTap : function (e) { - console.log(e); - // e的返回格式为json对象:{"text":"测试","index":0} -} -``` - -`onBackPress` 回调参数对象说明: - -|属性|类型|说明| -|---|---|---| -|from|String|触发返回行为的来源:'backbutton'——左上角导航栏按钮及安卓返回键;'navigateBack'——uni.navigateBack() 方法。**支付宝小程序端不支持返回此字段**| -```javascript -export default { - data() { - return {}; - }, - onBackPress(options) { - console.log('from:' + options.from) - } -} -``` - -**注意** - -- nvue 页面weex编译模式支持的生命周期同weex,具体参考:[weex生命周期介绍](https://uniapp.dcloud.io/nvue-outline?id=%e7%bc%96%e8%af%91%e6%a8%a1%e5%bc%8f)。 -- 支付宝小程序真机可以监听到非`navigateBack`引发的返回事件(使用小程序开发工具时不会触发`onBackPress`),不可以阻止默认返回行为 - -### 组件生命周期 - -``uni-app`` 组件支持的生命周期,与vue标准组件的生命周期相同。这里没有页面级的onLoad等生命周期: - -|函数名|说明|平台差异说明|最低版本| -|:-|:-|:-|:-| -|beforeCreate|在实例初始化之后被调用。[详见](https://cn.vuejs.org/v2/api/#beforeCreate)||| -|created|在实例创建完成后被立即调用。[详见](https://cn.vuejs.org/v2/api/#created)||| -|beforeMount|在挂载开始之前被调用。[详见](https://cn.vuejs.org/v2/api/#beforeMount)||| -|mounted|挂载到实例上去之后调用。[详见](https://cn.vuejs.org/v2/api/#mounted) 注意:此处并不能确定子组件被全部挂载,如果需要子组件完全挂载之后在执行操作可以使用```$nextTick```[Vue官方文档](https://cn.vuejs.org/v2/api/#Vue-nextTick)||| -|beforeUpdate|数据更新时调用,发生在虚拟 DOM 打补丁之前。[详见](https://cn.vuejs.org/v2/api/#beforeUpdate)|仅H5平台支持|| -|updated|由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。[详见](https://cn.vuejs.org/v2/api/#updated)|仅H5平台支持|| -|beforeDestroy|实例销毁之前调用。在这一步,实例仍然完全可用。[详见](https://cn.vuejs.org/v2/api/#beforeDestroy)||| -|destroyed|Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。[详见](https://cn.vuejs.org/v2/api/#destroyed)||| - diff --git a/docs/collocation/frame/log.md b/docs/collocation/frame/log.md deleted file mode 100644 index b4ba39415ac76598c497b3a385b290aefc97d38d..0000000000000000000000000000000000000000 --- a/docs/collocation/frame/log.md +++ /dev/null @@ -1,19 +0,0 @@ -## console -向控制台打印日志信息。 -### debug -向控制台打印 debug 日志 - -注:App 端 debug 方法等同于 log 方法。 -### log -向控制台打印 log 日志 -### info -向控制台打印 info 日志 -### warn -向控制台打印 warn 日志 -### error -向控制台打印 error 日志 - -注意: - -- 不同平台对于 console 方法的支持存在差异,建议在开发过程中只使用文档中提到的方法。 -- HBuilderX中有2个重要的代码块,敲`clog`:可直接输出`console.log()`;敲`clogv`:可输出`console.log(": " + );`,并且出现双光标,方便把变量名称和值同时打印出来。 diff --git a/docs/collocation/frame/timer.md b/docs/collocation/frame/timer.md deleted file mode 100644 index e9d1249849146ce127ae012f04cb3e15d5cf7cc2..0000000000000000000000000000000000000000 --- a/docs/collocation/frame/timer.md +++ /dev/null @@ -1,61 +0,0 @@ -## setTimeout(callback, delay, rest) - -设定一个定时器。在定时到期以后执行注册的回调函数 - -**参数说明** - -|参数|类型|必填|说明| -|:-|:-|:-|:-| -|callback|Function|是|回调函数| -|delay|Number|否|延迟的时间,函数的调用会在该延迟之后发生,单位 ms| -|rest|Any|否|param1, param2, ..., paramN 等附加参数,它们会作为参数传递给回调函数| - - -**返回值** - -|返回值|类型|说明| -|:-|:-|:-| -|timeoutID|Number|定时器的编号,这个值可以传递给 [clearTimeout](/api/timer?id=cleartimeout) 来取消该定时| - -## clearTimeout(timeoutID) - -取消由 setTimeout 设置的定时器。 - -**参数说明** - -|参数|类型|必填|说明| -|:-|:-|:-|:-| -|timeoutID|Number|是|要取消的定时器的 ID| - - -## setInterval(callback, delay, rest) -设定一个定时器。按照指定的周期(以毫秒计)来执行注册的回调函数 - -**参数说明** - -|参数|类型|必填|说明| -|:-|:-|:-|:-| -|callback|Function|是|回调函数| -|delay|Number|否|延迟的时间,函数的调用会在该延迟之后发生,单位 ms| -|rest|Any|否|param1, param2, ..., paramN 等附加参数,它们会作为参数传递给回调函数| - - -**返回值** - -|返回值|类型|说明| -|:-|:-|:-| -|intervalID|Number|定时器的编号,这个值可以传递给 [clearInterval](/api/timer?id=clearinterval) 来取消该定时| - - -## clearInterval(intervalID) - -取消由 setInterval 设置的定时器。 - -**参数说明** - -|参数|类型|必填|说明| -|:-|:-|:-|:-| -|intervalID|Number|是|要取消的定时器的 ID| - -## 注意事项 -* App 端返回的定时器编号可能为 String 类型,使用时无需主动转换为 Number 类型 \ No newline at end of file diff --git a/docs/collocation/frame/window.md b/docs/collocation/frame/window.md deleted file mode 100644 index 1d5a1c28835012c5e974ecac7e777d5980df0540..0000000000000000000000000000000000000000 --- a/docs/collocation/frame/window.md +++ /dev/null @@ -1,78 +0,0 @@ -### getApp() - -```getApp()``` 函数用于获取当前应用实例,一般用于获取globalData 。 - -**实例** - -```javascript -const app = getApp() -console.log(app.globalData) -``` - -**注意:** -- 不要在定义于 `App()` 内的函数中,或调用 `App` 前调用 `getApp()` ,可以通过 `this.$scope` 获取对应的app实例 -- 通过 `getApp()` 获取实例之后,不要私自调用生命周期函数。 -- 当在首页`nvue`中使用`getApp()`不一定可以获取真正的`App`对象。对此提供了`const app = getApp({allowDefault: true})`用来获取原始的`App`对象,可以用来在首页对`globalData`等初始化 - -### getCurrentPages() - -```getCurrentPages()``` 函数用于获取当前页面栈的实例,以数组形式按栈的顺序给出,第一个元素为首页,最后一个元素为当前页面。 - -**注意:** ``getCurrentPages()``仅用于展示页面栈的情况,请勿修改页面栈,以免造成页面状态错误。 - -每个页面实例的方法属性列表: - -|方法|描述|平台说明| -|---|---|---| -|page.$getAppWebview()|获取当前页面的webview对象实例|App| -|page.route|获取当前页面的路由| | - -Tips: -* ``navigateTo``, ``redirectTo`` 只能打开非 tabBar 页面。 -* ``switchTab`` 只能打开 ``tabBar`` 页面。 -* ``reLaunch`` 可以打开任意页面。 -* 页面底部的 ``tabBar`` 由页面决定,即只要是定义为 ``tabBar`` 的页面,底部都有 ``tabBar``。 -* 不能在 ```App.vue``` 里面进行页面跳转。 - -### $getAppWebview() - -```uni-app``` 在 ```getCurrentPages()```获得的页面里内置了一个方法 ```$getAppWebview()``` 可以得到当前webview的对象实例,从而实现对 webview 更强大的控制。在 html5Plus 中,plus.webview具有强大的控制能力,可参考:[WebviewObject](http://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewObject)。 - -但`uni-app`框架有自己的窗口管理机制,请不要自己创建和销毁webview,如有需求覆盖子窗体上去,请使用[原生子窗体subNvue](/api/window/subNVues)。 - -**注意:此方法仅 App 支持** - -**示例:** - -获取当前页面 webview 的对象实例 -```javascript -export default { - data() { - return { - title: 'Hello' - } - }, - onLoad() { - // #ifdef APP-PLUS - const currentWebview = this.$scope.$getAppWebview(); //此对象相当于html5plus里的plus.webview.currentWebview()。在uni-app里vue页面直接使用plus.webview.currentWebview()无效 - currentWebview.setBounce({position:{top:'100px'},changeoffset:{top:'0px'}}); //动态重设bounce效果 - // #endif - } -} -``` - -获取指定页面 webview 的对象实例 - -`getCurrentPages()`可以得到所有页面对象,然后根据数组,可以取指定的页面webview对象 -```javascript -var pages = getCurrentPages(); -var page = pages[pages.length - 1]; -// #ifdef APP-PLUS -var currentWebview = page.$getAppWebview(); -console.log(currentWebview.id);//获得当前webview的id -console.log(currentWebview.isVisible());//查询当前webview是否可见 -); -// #endif -``` - -uni-app自带的web-view组件,是页面中新插入的一个子webview。获取该对象的方法见:[https://ask.dcloud.net.cn/article/35036](https://ask.dcloud.net.cn/article/35036) \ No newline at end of file diff --git a/docs/collocation/main.md b/docs/collocation/main.md index 2f5ccf16d15344df08ca5ed19e8d27d618350e17..8fe82b44d2c9efcaadc9d8a4e9bf467616925613 100644 --- a/docs/collocation/main.md +++ b/docs/collocation/main.md @@ -1,7 +1,7 @@ `main.js`是uni-app的入口文件,主要作用是初始化`vue`实例、定义全局组件、使用需要的插件如vuex。 首先引入了`Vue`库和`App.vue`,创建了一个`vue`实例,并且挂载`vue`实例。 -``` +```js import Vue from 'vue' import App from './App' import pageHead from './components/page-head.vue' //全局引用page-head组件 diff --git a/docs/collocation/manifest.md b/docs/collocation/manifest.md index 44b3d3c634ee69758abfdd8ae1bd0d0bb8a0d706..dfc4ae872489071ccdd0cdccedc6524016229284 100644 --- a/docs/collocation/manifest.md +++ b/docs/collocation/manifest.md @@ -187,13 +187,13 @@ splash(启动封面)是App必然存在的、不可取消的。 |属性|类型|说明| |:-|:-|:-| |title|String|页面标题,默认使用 manifest.json 的 name| -|template|String|index.html模板路径,相对于应用根目录,可定制生成的 html 代码。参考:[自定义模板](collocation/manifest?id=h5-template)| -|router|Object|参考:[router](collocation/manifest?id=h5-router)| -|async|Object|参考:[async](collocation/manifest?id=h5-async)| -|devServer|Object|开发环境 server 配置,参考:[devServer](collocation/manifest?id=devserver)| -|publicPath|String|引用资源的地址前缀,仅发布时生效。参考:[publicPath](collocation/manifest?id=publicPath)| -|sdkConfigs|String|SDK配置,例如地图... 参考:[sdkConfigs](collocation/manifest?id=h5sdkconfig)| -|optimization|Object|打包优化配置(HBuilderX 2.1.5 以上支持),参考[optimization](collocation/manifest?id=optimization)| +|template|String|index.html模板路径,相对于应用根目录,可定制生成的 html 代码。参考:[自定义模板](/collocation/manifest?id=h5-template)| +|router|Object|参考:[router](/collocation/manifest?id=h5-router)| +|async|Object|参考:[async](/collocation/manifest?id=h5-async)| +|devServer|Object|开发环境 server 配置,参考:[devServer](/collocation/manifest?id=devserver)| +|publicPath|String|引用资源的地址前缀,仅发布时生效。参考:[publicPath](/collocation/manifest?id=publicPath)| +|sdkConfigs|String|SDK配置,例如地图... 参考:[sdkConfigs](/collocation/manifest?id=h5sdkconfig)| +|optimization|Object|打包优化配置(HBuilderX 2.1.5 以上支持),参考[optimization](/collocation/manifest?id=optimization)| |uniStatistics|Object|[H5 是否开启 uni 统计,配置方法同全局配置](/collocation/manifest?id=uniStatistics)|| #### 自定义模板@h5-template @@ -332,7 +332,7 @@ Tips:`uni-app` 中 `manifest.json->h5->devServer` 实际上对应 `webpack` |:-|:-|:-|:-| |prefetch|Boolean|false|资源预取| |preload|Boolean|false|资源预加载| -|treeShaking|Object||摇树优化,根据项目需求,动态打包框架所需的组件及API,保持框架代码最精简化,参考[treeShaking](collocation/manifest?id=treeshaking)| +|treeShaking|Object||摇树优化,根据项目需求,动态打包框架所需的组件及API,保持框架代码最精简化,参考[treeShaking](/collocation/manifest?id=treeshaking)| ##### treeShaking @@ -530,7 +530,7 @@ Tips:关于摇树优化(treeShaking)原理及优化结果,参考:[http **分包内静态文件示例** -``` +```json "subPackages": [{ "root": "pages/sub", "pages": [{ @@ -553,7 +553,7 @@ Tips:关于摇树优化(treeShaking)原理及优化结果,参考:[http **manifest.json配置** -``` +```json "quickapp-webview": {// 快应用通用配置 "icon": "/static/logo.png", "package": "com.example.demo", diff --git a/docs/collocation/miniprogram-plugin.md b/docs/collocation/miniprogram-plugin.md index d1b05fc07dfe18cafd1e3994bce6d25217511a42..d2784c40436e1fef4f69461dffbbf1320faee4ea 100644 --- a/docs/collocation/miniprogram-plugin.md +++ b/docs/collocation/miniprogram-plugin.md @@ -1,4 +1,4 @@ -> 本文档意在介绍如何把uni-app项目编译为小程序插件,如果想了解如何在uni-app中引用和使用小程序插件,另见文档:[使用小程序插件](/component/mp-weixin-plugin) +> 本文档意在介绍如何把uni-app项目编译为小程序插件,如果想了解如何在uni-app中引用和使用小程序插件,另见文档:[使用小程序插件](/tutorial/mp-weixin-plugin) 小程序插件规范由小程序厂商定义,插件是对一组 js 接口、自定义组件或页面的封装,用于嵌入到小程序中使用。 @@ -88,7 +88,7 @@ plugin 1. `mp-weixin` 中的 `pages` 项与 `mp-alipay` 中的 `publicPages` 项作用一致 2. `mp-alipay` 中供外部使用的页面,需要在 `pages` 中声明,数组类型 -3. 由于两端的格式不一致,可以在 `plugin.json` 中使用[条件编译](https://uniapp.dcloud.io/platform?id=preprocessor)处理 +3. 由于两端的格式不一致,可以在 `plugin.json` 中使用[条件编译](https://uniapp.dcloud.io/tutorial/platform.html#preprocessor)处理 #### 编译步骤 diff --git a/docs/collocation/pages.md b/docs/collocation/pages.md index 24e1300885e66c9ecbdb39c14be31635a479b333..f4444296c369fdde96b3fd5fbc696fcdb6bb0e70 100644 --- a/docs/collocation/pages.md +++ b/docs/collocation/pages.md @@ -2,7 +2,7 @@ 它类似微信小程序中`app.json`的**页面管理**部分。注意定位权限申请等原属于`app.json`的内容,在uni-app中是在manifest中配置。 -### 配置项列表 +# 配置项列表 |属性|类型|必填|描述|平台兼容| |:-|:-|:-|:-|:-| @@ -118,7 +118,7 @@ } ``` -# globalStyle +## globalStyle 用于设置应用的状态栏、导航条、标题、窗口背景色等。 @@ -130,15 +130,15 @@ |navigationStyle|String|default|导航栏样式,仅支持 default/custom。custom即取消默认的原生导航栏,需看[使用注意](/collocation/pages?id=customnav)|微信小程序 7.0+、百度小程序、H5、App(2.0.3+)| |backgroundColor|HexColor|#ffffff|下拉显示出来的窗口的背景色|微信小程序| |backgroundTextStyle|String|dark|下拉 loading 的样式,仅支持 dark / light|微信小程序| -|enablePullDownRefresh|Boolean|false|是否开启下拉刷新,详见[页面生命周期](/collocation/frame/lifecycle?id=页面生命周期)。|| -|onReachBottomDistance|Number|50|页面上拉触底事件触发时距页面底部距离,单位只支持px,详见[页面生命周期](/collocation/frame/lifecycle?id=页面生命周期)|| +|enablePullDownRefresh|Boolean|false|是否开启下拉刷新,详见[页面生命周期](/tutorial/page.html#lifecycle)。|| +|onReachBottomDistance|Number|50|页面上拉触底事件触发时距页面底部距离,单位只支持px,详见[页面生命周期](/tutorial/page.html#lifecycle)|| |backgroundColorTop|HexColor|#ffffff|顶部窗口的背景色(bounce回弹区域)|仅 iOS 平台| |backgroundColorBottom|HexColor|#ffffff|底部窗口的背景色(bounce回弹区域)|仅 iOS 平台| |titleImage|String||导航栏图片地址(替换当前文字标题),支付宝小程序内必须使用https的图片链接地址|支付宝小程序、H5、APP| |transparentTitle|String|none|导航栏整体(前景、背景)透明设置。支持 always 一直透明 / auto 滑动自适应 / none 不透明|支付宝小程序、H5、APP| |titlePenetrate|String|NO|导航栏点击穿透|支付宝小程序、H5| |pageOrientation|String|portrait|横屏配置,屏幕旋转设置,仅支持 auto / portrait / landscape 详见 [响应显示区域变化](https://developers.weixin.qq.com/miniprogram/dev/framework/view/resizable.html)|App 2.4.7+、微信小程序| -|animationType|String|pop-in|窗口显示的动画效果,详见:[窗口动画](api/router?id=animation)|App| +|animationType|String|pop-in|窗口显示的动画效果,详见:[窗口动画](/api/router?id=animation)|App| |animationDuration|Number|300|窗口显示动画的持续时间,单位为 ms|App| |app-plus|Object||设置编译到 App 平台的特定样式,配置项参考下方 [app-plus](/collocation/pages?id=app-plus)|App| |h5|Object||设置编译到 H5 平台的特定样式,配置项参考下方 [H5](/collocation/pages?id=h5)|H5| @@ -149,7 +149,7 @@ |mp-lark|Object||设置编译到 mp-lark 平台的特定样式|飞书小程序| |mp-qq|Object||设置编译到 mp-qq 平台的特定样式|QQ小程序| |mp-kuaishou|Object||设置编译到 mp-kuaishou 平台的特定样式|快手小程序| -|usingComponents|Object| |引用小程序组件,参考 [小程序组件](/frame?id=小程序组件支持)|| +|usingComponents|Object| |引用小程序组件,参考 [小程序组件](/tutorial/miniprogram-subject.html#小程序自定义组件支持)|| |renderingMode|String| |同层渲染,webrtc(实时音视频) 无法正常时尝试配置 seperated 强制关掉同层|微信小程序| |leftWindow|Boolean|true|当存在 leftWindow 时,默认是否显示 leftWindow|H5| |topWindow|Boolean|true|当存在 topWindow 时,默认是否显示 topWindow|H5| @@ -166,13 +166,13 @@ - `globalStyle`中设置的`titleImage`也会覆盖掉`pages`->`style`内的设置文字标题 - 使用 `maxWidth` 时,页面内fixed元素需要使用--window-left,--window-right来保证布局位置正确 -# topWindow@topwindow +## topWindow@topwindow uni-app 2.9+ 新增 leftWindow, topWindow, rightWindow 配置。用于解决宽屏适配问题。 以现有的手机应用为mainWindow,在左、上、右,可以追加新的页面显示窗体。 -整体的宽屏适配思路,参考单独的[宽屏适配指南](https://uniapp.dcloud.net.cn/adapt) +整体的宽屏适配思路,参考单独的[宽屏适配指南](https://uniapp.dcloud.net.cn/tutorial/adapt) |属性|类型|默认值|描述| |:-|:-|:-|:-| @@ -250,18 +250,18 @@ uni-app 2.9+ 新增 leftWindow, topWindow, rightWindow 配置。用于解决宽 案例演示:HBuilderX 2.9.9+,新建项目选择hello uni-app或新闻模板,或直接浏览:[https://hellouniapp.dcloud.net.cn/](https://hellouniapp.dcloud.net.cn/) -# leftWindow +## leftWindow 与[topWindow](/collocation/pages?id=topwindow)相同 -# rightWindow +## rightWindow 与[topWindow](/collocation/pages?id=topwindow)相同 窗口通信参考:[https://uniapp.dcloud.net.cn/api/window/communication](https://uniapp.dcloud.net.cn/api/window/communication) -# pages +## pages `uni-app` 通过 pages 节点配置应用由哪些页面组成,pages 节点接收一个数组,数组每个项都是一个对象,其属性值如下: @@ -326,8 +326,8 @@ uni-app 2.9+ 新增 leftWindow, topWindow, rightWindow 配置。用于解决宽 |disableScroll|Boolean|false|设置为 true 则页面整体不能上下滚动(bounce效果),只在页面配置中有效,在globalStyle中设置无效|微信小程序(iOS)、百度小程序(iOS)| |backgroundColor|HexColor|#ffffff|窗口的背景色|微信小程序、百度小程序、字节跳动小程序、飞书小程序| |backgroundTextStyle|String|dark|下拉 loading 的样式,仅支持 dark/light|| -|enablePullDownRefresh|Boolean|false|是否开启下拉刷新,详见[页面生命周期](/collocation/frame/lifecycle?id=页面生命周期)。|| -|onReachBottomDistance|Number|50|页面上拉触底事件触发时距页面底部距离,单位只支持px,详见[页面生命周期](/collocation/frame/lifecycle?id=页面生命周期)|| +|enablePullDownRefresh|Boolean|false|是否开启下拉刷新,详见[页面生命周期](/tutorial/page.html#lifecycle)。|| +|onReachBottomDistance|Number|50|页面上拉触底事件触发时距页面底部距离,单位只支持px,详见[页面生命周期](/tutorial/page.html#lifecycle)|| |backgroundColorTop|HexColor|#ffffff|顶部窗口的背景色(bounce回弹区域)|仅 iOS 平台| |backgroundColorBottom|HexColor|#ffffff|底部窗口的背景色(bounce回弹区域)|仅 iOS 平台| |titleImage|String||导航栏图片地址(替换当前文字标题),支付宝小程序内必须使用https的图片链接地址|支付宝小程序、H5| @@ -342,7 +342,7 @@ uni-app 2.9+ 新增 leftWindow, topWindow, rightWindow 配置。用于解决宽 |mp-lark|Object||设置编译到 mp-lark 平台的特定样式|飞书小程序| |mp-qq|Object||设置编译到 mp-qq 平台的特定样式|QQ小程序| |mp-kuaishou|Object||设置编译到 mp-kuaishou 平台的特定样式|快手小程序| -|usingComponents|Object||引用小程序组件,参考 [小程序组件](/frame?id=小程序组件支持)|App、微信小程序、支付宝小程序、百度小程序| +|usingComponents|Object||引用小程序组件,参考 [小程序组件](/tutorial/miniprogram-subject.html#小程序自定义组件支持)|App、微信小程序、支付宝小程序、百度小程序| |leftWindow|Boolean|true|当存在 leftWindow时,当前页面是否显示 leftWindow|H5| |topWindow|Boolean|true|当存在 topWindow 时,当前页面是否显示 topWindow|H5| |rightWindow|Boolean|true|当存在 rightWindow时,当前页面是否显示 rightWindow|H5| @@ -375,7 +375,7 @@ uni-app 2.9+ 新增 leftWindow, topWindow, rightWindow 配置。用于解决宽 ### 自定义导航栏使用注意@customnav 当navigationStyle设为custom或titleNView设为false时,原生导航栏不显示,此时要注意几个问题: -- 非H5端,手机顶部状态栏区域会被页面内容覆盖。这是因为窗体是沉浸式的原因,即全屏可写内容。uni-app提供了状态栏高度的css变量[--status-bar-height](/frame?id=css%e5%8f%98%e9%87%8f),如果需要把状态栏的位置从前景部分让出来,可写一个占位div,高度设为css变量。 +- 非H5端,手机顶部状态栏区域会被页面内容覆盖。这是因为窗体是沉浸式的原因,即全屏可写内容。uni-app提供了状态栏高度的css变量[--status-bar-height](/tutorial/syntax-css.html#css-变量),如果需要把状态栏的位置从前景部分让出来,可写一个占位div,高度设为css变量。 ```html