关于uni-app:解决uniapp-vue3-nvue中使用pinia页面空白问题让你的应用更稳定

嗨,各位小伙伴们,我是你们的好盆友咕噜铁蛋!随着Vue3和nvue在uni-app中的广泛应用,应用pinia作为状态管理工具曾经成为了不少开发者的首选。然而,在理论开发过程中,咱们有时会遇到一个奇怪的问题:在应用pinia后,nvue页面会呈现空白的状况。明天,我将和大家分享如何解决uni-app vue3 nvue中应用pinia页面空白问题,让你的利用更加稳固!一、问题剖析在应用pinia后,咱们有时候会发现nvue页面呈现了空白,这可能是因为pinia与nvue的兼容性问题导致的。在nvue中,咱们须要通过Vue.use()来装置pinia插件,然而在Vue3中,这种形式并不实用。所以当咱们在nvue页面中应用pinia时,可能会呈现一些兼容性问题,导致页面无奈失常显示。二、解决方案为了解决这个问题,咱们须要依照以下步骤进行操作: 装置vuex-composition-helpers插件为了在nvue中应用pinia,咱们能够应用vuex-composition-helpers插件进行状态治理,这个插件能够帮忙咱们在Vue3的composition API中应用Vuex。咱们能够通过npm install vuex-composition-helpers命令来装置这个插件。在nvue页面中应用vuex-composition-helpers装置完vuex-composition-helpers后,咱们能够在nvue页面中应用这个插件来进行状态治理。首先,在nvue页面中导入pinia和vuex-composition-helpers: import { defineComponent } from "vue"import pinia from "@/store/pinia"import { useStore } from "vuex-composition-helpers"而后,在组件中应用useStore()办法来获取store实例,并且通过computed属性来获取须要应用的状态: export default defineComponent({ setup() { const store = useStore(pinia) const count = computed(() => store.state.count) return { count } }})这样,咱们就能够在nvue中失常应用pinia进行状态治理了。 应用pageLifetimes监听页面生命周期在nvue中,咱们须要应用pageLifetimes来监听页面的生命周期,以确保在页面渲染时正确获取到状态。在页面的onReady办法中,咱们能够通过setData()办法来更新页面数据。 export default defineComponent({ pageLifetimes: { show() { this.setData({ count: useStore(pinia).state.count }) } }, setup() { return {} }})通过以上步骤,咱们能够解决uni-app vue3 nvue中应用pinia页面空白问题,让你的利用更加稳固。如果你遇到了其余技术问题,或者有其余须要帮忙的中央,欢送在评论区留言,咱们一起交流学习吧!感激大家的浏览,咱们下期再见!

February 26, 2024 · 1 min · jiezi

关于uni-app:UniApp中打开蓝牙所需哪些权限

<article class=“article fmt article-content”><p>Hello,各位同学们新年好呀,咱们又见面了!我是咕噜铁蛋!随着挪动利用的遍及,蓝牙技术正变得越来越重要。在UniApp中,关上蓝牙性能为咱们提供了更多便当和翻新的可能性。然而,很多人可能不分明在UniApp中关上蓝牙须要哪些权限。明天铁蛋将带你深刻摸索这个问题,帮忙你理解UniApp中关上蓝牙所需的权限。<br/>蓝牙技术作为一种短距离无线通信技术,曾经广泛应用于各种设施中,包含智能手机、智能手表、蓝牙耳机等。在UniApp中,通过关上蓝牙性能,咱们能够实现更多乏味的性能,如蓝牙音频传输、蓝牙设施连贯等。然而,为了保障用户的隐衷和数据安全,UniApp在关上蓝牙时须要获取一些权限。<br/>一、UniApp中关上蓝牙的权限列表<br/>以下是UniApp中关上蓝牙所需的权限列表:</p><ol><li>蓝牙权限<br/>为了可能失常应用蓝牙性能,UniApp须要获取蓝牙权限。蓝牙权限容许UniApp扫描、连贯和通信蓝牙设施。用户在应用UniApp时,须要受权利用获取蓝牙权限。</li><li>定位权限<br/>在某些状况下,为了可能失常应用蓝牙性能,UniApp还须要获取定位权限。定位权限能够帮忙UniApp确定设施的地位信息,从而更好地进行蓝牙设施的扫描和连贯。用户在应用UniApp时,须要受权利用获取定位权限。</li><li>存储权限<br/>UniApp中关上蓝牙可能波及到数据的读取和存储操作,因而须要获取存储权限。存储权限容许UniApp拜访设施上的文件和文件夹,以便进行数据的读取和存储。用户在应用UniApp时,须要受权利用获取存储权限。</li><li>网络权限<br/>在UniApp中关上蓝牙时,可能须要通过网络连接获取一些额定的数据或者进行蓝牙设施的互联互通。因而,UniApp须要获取网络权限。网络权限容许UniApp进行网络通信,包含数据的发送和接管。用户在应用UniApp时,须要受权利用获取网络权限。<br/>以上是UniApp中关上蓝牙所需的次要权限列表,具体权限可能会依据不同的UniApp版本和性能有所差别。<br/>二、权限的正当应用<br/>在获取这些权限时,开发者须要留神权限的正当应用和隐衷爱护。以下是一些倡议:</li><li>仅获取必要权限:开发者在设计利用时,应仅获取必要的权限,并对权限的应用进行正当限度。防止滥用权限,以爱护用户的隐衷和数据安全。</li><li>明确告知用户:在利用中,开发者应清晰明确地告知用户须要获取哪些权限,并解释为什么须要这些权限。用户应该可能明确为什么他们须要受权利用获取这些权限。</li><li>受权治理:开发者应提供权限治理性能,使用户可能自主抉择是否受权利用获取某些权限。用户应具备撤销权限受权的权力。</li><li>数据安全爱护:开发者在应用蓝牙性能时,须要留神用户数据的平安爱护。采取适当的安全措施,确保用户的数据不被歹意利用或泄露。<br/>咱们理解到在UniApp中关上蓝牙所需的权限包含蓝牙权限、定位权限、存储权限和网络权限。这些权限的正当应用能够为用户带来更好的体验,同时也须要开发者增强隐衷爱护和数据安全。心愿通过明天铁蛋的分享,大家可能更好地了解UniApp中关上蓝牙所需的权限,并在利用开发中正当应用这些权限,为用户提供更好的服务。</li></ol></article>

February 20, 2024 · 1 min · jiezi

关于uni-app:踩坑日记uniapp相机抽帧相机被多次初始化问题

缘起:最近频繁接到应用咱们AI运行辨认插件用户的反馈,局部机型在uni中抽几帧后,就不再帧的了。开始认为又是小程序的API兼容的问题(确有机型呈现过抽帧兼容性问题),前面越来越多的反馈在原生下无问题,只有采纳uni-app计划的有问题...一、先看抽帧简略代码上面是小程序做AI静止辨认的第一步,摄像头帧数据采集的精简代码版段,大抵流程是:在摄像头初始化实现后,初始化一个CameraFrameListener、进行抽帧,并依据抽取的帧图像大小,调整Camera组件大小与帧图大小同比缩放(宽全为全屏、高自适应)。 为什么要同比缩放的起因,请见咱们的系列分享:【一步步开发AI静止小程序】四、小程序如何抽帧<template> <view class="container"> <camera id="preview" class="preview" :style="videoStyles" flash="off" :device-position="deviceKey" resolution="high" frame-size="low" @initdone="onCameraReady"> </camera> </view></template><script> export default { data() { return { deviceKey: "back", previewWidth: 480, previewHeight: 640, previewRate: 1, frameWidth: 480, frameHeight: 640 }; }, computed: { videoStyles() { const style = `width:${this.previewWidth}px;height:${this.previewHeight}px;`; return style; } }, methods: { autoFitPreview(width, height) { const sifno = uni.getSystemInfoSync(); let rate = sifno.windowWidth / width; this.previewWidth = width * rate; this.previewHeight = height * rate; this.previewRate = rate; this.frameWidth = width; this.frameHeight = height; }, initCamera(){ //避免重初始化 if(this.listener) return; const that = this; const context = wx.createCameraContext(); const listener = context.onCameraFrame((frame) => { //当帧图像大小发生变化时,从新调整摄像头代码 if(that.frameWidth != frame.width) that.autoFitPreview(frame.width, frame.height); console.log(frame.data instanceof ArrayBuffer, frame.width, frame.height) }); listener.start(); }, onCameraReady(e) { this.autoFitPreview(480, 640); this.initCamera(); }, onStart(){ this.listener.start(); }, onStop(){ this.listener.stop(); } } }</script>二、BUG复现在确认原生小程序抽帧无问题后,咱们偿试了问题复现,通过屡次测试,发现在uni下,Camera组件会屡次触发initdone事件,进一步测试后发现,只有动静扭转camera的style高、宽,便会触发从新初始化。 ...

September 19, 2023 · 1 min · jiezi

关于uni-app:环信uniappdemo-升级改造计划单人多人音视频通话三

前序文章: 环信 uni-app Demo降级革新打算——Vue2迁徙到Vue3(一) 环信即时通讯SDK集成——环信 uni-app-demo 降级革新打算——整体代码重构优化(二) 概述在将声网 uni-app 音视频插件正式集成进入环信的 uni-app-demo 中,标记着本次降级革新至此根本告一段落。在第三期的降级革新中,次要工作为在 Demo 层造成一个较为容易拆分的无关音视频相干组件,力求第一:代码是否可读、第二:能够对参考源码的同学提供实例、第三:可能不便在脱离其余 IM 性能时,实现对音视频性能的复用。 同时也棘手针对 emChat 组件进行小范畴重构,解决了 uni-app 在 App 以及小程序端,软键盘弹起音讯列表不滚动以及软键盘遮挡性能栏问题。 上面我将尽可能详细描述一下本次针对音视频性能、以及音讯列表重写的心路历程。 性能背景以及目标有越来越多的用户在 IM 性能实现中未免向相似微信聊天的性能靠齐,除了日常 IM 性能中,也离不开音视频通话性能,因而须要在环信uni-app-demo中减少实现音视频通话的示例代码,可能对想要实现音视频性能的用户造成可参考的 demo 代码,以及可复用的音视频功能模块组件。 前置筹备确认实现性能范畴 接听呼叫(单聊一对一、群组多人音视频通话)且只反对 uni-app 原生端应用。浏览声网音视频 uni-app 端相干文档,相熟大抵流程以及相熟局部外围 API,跑通示例 Demo。相熟环信其余端PCWeb端、安卓、iOS端callKit 信令交互相干逻辑,确保实现 uni-app 所实现的音视频性能可能与其余端 Demo 进行互通。理解nvue组件相干语法布局款式等与vue的差别,推拉流视频容器仅反对在nvue组件中进行应用。实际见真章Tip:以下展现代码因篇幅所限,均做了不同水平的删减保留了外围逻辑展现,具体代码文末会给出源码地址。step1:在我的项目中集成音视频相干插件Agora(声网)Demo 示例中有两个插件是必须要进行集成的,别离为Native原生插件,Js插件。Agora-Demo 示例插件下载地址以及性能简介详见下方提供的链接。 Quick-start-demoAgora 原生插件地址Agora JS 插件地址具体插件的导入形式就不在本篇中具体介绍,上方插件下载地址中有提到插件导入形式,能够进行参阅。 特地留神:Agora-Uni-App JS 插件导入之后会在目录下生成一个package.json文件,这个文件会与通过 npm 导入的easemob-websdk的package.json重合,因而 Demo 中只保留了easemob-demo的package.json step2: 设计搭建 emCallKit(音视频组件)逻辑构造主体大抵构造如下: graph TDCallKit --> emCallkitemCallkit --> callKitManageemCallkit --> configemCallkit --> contantsemCallkit --> storesemCallkit --> utilsemCallkit --> index.jsCallKit --> emCallkitPagesemCallkitPages --> alertScreen.vueemCallkitPages --> inviteMembers.vueemCallkitPages --> multiCall.nvueemCallkitPages --> singleCall.nvue其中components/emCallKit次要为外围 emCallKit 逻辑层代码,callKitManage文件中次要蕴含对外公布订阅频道内工夫逻辑代码,以及频道内信令发送代码。config声网 AppId 配置。contants文件夹音视频频道内常量、stores频道内外围逻辑在此,利用 pinia 进行频道内状态治理。utils工具办法,index.jsemCallkit 入口文件,该文件内挂载信令监听初始化频道内 IM Client。 ...

September 7, 2023 · 8 min · jiezi

关于uni-app:IoTOSApp移动端-v010-免费开源-商用

IoTOS-App v0.1.0后端程序为 https://gitee.com/chinaiot/iotos 一款高效实用 IoTCard 治理 & 经营零碎 - 挪动端。IoTOS 挪动端;基于RuoYi-App 开发 适配国际化多语言 UI 应用 uView ,集成 J-IM(t-io 网络框架 谭聊原型外围)<div class="shields-wrapper"> <img alt="GitHub license" src="https://img.shields.io/github/license/IoTCard/iotos-app?style=flat-square&logo=github&color=616ae5"> <a target="\_blank" class="shields-wrapper-image" href='https://github.com/IoTCard/iotos-app'><img alt="GitHub stars" src="https://img.shields.io/github/stars/IoTCard/iotos-app?style=flat-square&logo=github&color=616ae5"></a> <a target="\_blank" class="shields-wrapper-image" href='https://github.com/IoTCard/iotos-app'><img alt="GitHub forks" src="https://img.shields.io/github/forks/IoTCard/iotos-app?style=flat-square&logo=github&color=616ae5"></a> <img src='https://gitee.com/chinaiot/iotos-app/badge/star.svg?theme=dark' alt='star'></img> <img src='https://gitee.com/chinaiot/iotos-app/badge/fork.svg?theme=dark' alt='fork'></img> </div> 一、 对于 IoTOS-App1.1 介绍IoTOS-App 挪动解决方案,采纳uniapp框架,一份代码多终端适配,同时反对APP、小程序、H5!实现了与IoTO、IoTOS-IM完满对接的挪动解决方案!目前曾经实现登录、国内语言切换、工作台、编辑材料、头像批改、明码批改、常见问题、对于咱们等根底性能。 配套后端代码仓库地址[IoTOS](https://gitee.com/chinaiot/iotos) 。中间件网络框架[IoTOS-IM](https://gitee.com/chinaiot/iotos-im) 。利用框架基于[uniapp](https://uniapp.dcloud.net.cn),反对小程序、H5、Android和IOS。前端组件采纳[uView](https://gitee.com/umicro/uView),全端兼容的高性能UI框架。1.2 性能介绍目前已实现性能后盾零碎告诉 用户登录后通过 IoTOS-IM 及时下发 布告 与告诉实现国际化语言二、演示安装包'apk' 目录下 [iotos-app\_v0.1.0.apk](/apk/iotos-app\_v0.1.0.apk) 【安卓版本】三、后盾演示地址开源演示地址:[http://demo.iotos.top/](http://demo.iotos.top/) 默认账号密码:iotos,iotos.top 四、分割咱们如果你想退出咱们的开源交换群、有任何 IoTOS 产品上的想法、意见或倡议,或商务上的单干需要,请扫码增加 IoTOS 我的项目作者,退出群聊: 微信 微信公众号 五、我的项目展现登录页 工作台 我的 语言切换 登录布告与告诉

July 9, 2023 · 1 min · jiezi

关于uni-app:uniapp-h5-端在-jenkins-构建报错

h5 端在本地 dev 以及 build 都没问题,在 jenkins 上报错报错一找不到依赖包 解决:将本地 node_modules 压缩后放在服务器上相应文件解压。 这里还有另一个问题就是服务器上 node 版本太低了, 前面降级之后还是存在依赖包找不到问题 报错二cross-env: Permission denied 上面代码是我从网上截取的,不过问题都是一样。应该是由手动在服务器上增加的 node_modules引起。 解决 // 执行如下命令 在执行打包命令npm rebuild该报错信息相干文章连贯 sh: 1: cross-env: Permission deniednpm ERR! code ELIFECYCLEnpm ERR! errno 126npm ERR! @ development: `cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js`npm ERR! Exit status 126npm ERR! npm ERR! Failed at the @ development script.npm ERR! This is probably not a problem with npm. There is likely additional logging output above.npm ERR! A complete log of this run can be found in:npm ERR! /home/shanmaseen/.npm/_logs/2019-02-22T16_32_08_191Z-debug.lognpm ERR! code ELIFECYCLEnpm ERR! errno 126npm ERR! @ dev: `npm run development`npm ERR! Exit status 126npm ERR! npm ERR! Failed at the @ dev script.npm ERR! This is probably not a problem with npm. There is likely additional logging output above.npm ERR! A complete log of this run can be found in:npm ERR! /home/shanmaseen/.npm/_logs/2019-02-22T16_32_08_241Z-debug.log因为是手动增加的 node_modules 在 jenkins 上配置构建命令时 不须要再进行 install 间接执行 rebuild 在进行 build ...

June 9, 2023 · 1 min · jiezi

关于uni-app:uniapp微信小程序React-Native跨端原理初探

文章内容以官网文档为根底,对uni-app的根底框架(逻辑层、渲染层)、组件、API进行简略地剖析以官网文档为根底,对微信小程序框架(逻辑层、视图层)、运行时进行简略地剖析以官网文档为根底,对React Native旧架构和新架构进行简略地剖析1. uni-app编译在web平台,将.vue文件编译为js代码。与一般的vue cli我的项目相似在微信小程序平台,编译器将.vue文件拆分生成wxml、wxss、js等代码在app平台,将.vue文件编译为js代码。进一步,如果波及uts代码: 在Android平台,将.uts文件编译为kotlin代码在iOS平台,将.uts文件编译为swift代码编译器分vue2版和vue3版 vue2版:基于webpack实现vue3版:基于Vite实现,性能更快编译器反对条件编译,即能够指定某局部代码只编译到特定的终端平台。从而将专用和个性化交融在一个工程中。 2. uni-app运行时runtime2.1 根底框架在web和小程序上,不须要uni-app提供js引擎和排版引擎,间接应用浏览器和小程序的即可。但app上须要uni-app提供App的js引擎:App-Android上,uni-app的js引擎是v8,App-iOS是jscoreApp的渲染引擎:同时提供了2套渲染引擎,.vue页面文件由webview渲染,原理与小程序雷同;.nvue页面文件由原生渲染,原理与react native雷同。开发者能够依据须要自主抉择渲染引擎。uni-app App 端内置了一个基于 weex 改良的原生渲染引擎,提供了原生渲染能力 在 App 端,如果应用 vue 页面,则应用 webview 渲染如果应用 nvue 页面(native vue 的缩写),则应用原生渲染一个 App 中能够同时应用两种页面,比方首页应用 nvue,二级页应用 vue 页面,hello uni-app 示例就是如此尽管 nvue 也能够多端编译,输入 H5 和小程序,但 nvue 的 css 写法受限,所以如果你不开发 App,那么不须要应用 nvue。 2.1.1 逻辑层和渲染层拆散在web平台,逻辑层(js)和渲染层(html、css),都运行在对立的webview里。但在小程序和app端,逻辑层和渲染层被拆散了。 拆散的外围起因是性能。过来很多开发者吐槽基于webview的app性能不佳,很大起因是js运算和界面渲染抢资源导致的卡顿。不论小程序还是app,逻辑层都独立为了独自的js引擎,渲染层依然是webview app上也反对纯原生渲染,应用.nvue文件2.1.2 逻辑层详解逻辑层是运行在一个独立的jscore里的,它不依赖于本机的webview,所以一方面它没有浏览器兼容问题,能够在Android4.4上跑es6代码,另一方面,它无奈运行window、document、navigator、localstorage等浏览器专用的js API。 jscore就是一个规范js引擎,规范js是能够失常运行的,比方if、for、各种字符串、日期解决等。js和浏览器的区别要留神辨别开来。 所谓浏览器的js引擎,就是jscore或v8的根底上新增了一批浏览器专用API,比方dom;node.js引擎,则是v8根底上补充一些电脑专用API,比方本地io;那么uni-app的App端和小程序端的js引擎,其实是在jscore上补充了一批手机端罕用的JS API,比方扫码。2.1.3 渲染层详解h5和小程序平台,以及app-vue,视图层是webview,即.vue文件都会被渲染为WebView app-nvue的视图层是基于weex革新的原生渲染视图,即.nvue文件会被革新为APP原生组件 兼容性 在iOS上,只能应用iOS提供的Webview(默认是WKWebview)。它有肯定的浏览器兼容问题,iOS版本不同,它的体现有轻微差别(个别可疏忽)。 在Android上,小程序大多自带了一个几十M的chromium webview,而App端没方法带这么大体积的三方包,因而uni-app默认应用了Android system webview,这个零碎webview追随手机不同而有差别 在Android上,App端也反对应用腾讯X5引擎,这样就对立版本,尽可能减少兼容性问题2.1.4 逻辑层和渲染层小结逻辑层: js根本没有不同手机的兼容问题(因为js引擎自带了) 渲染层: 在app-vue上应用零碎webview时会有手机浏览器的css兼容问题。此时或者不要用太新的css语法,或者集成腾讯x5引擎。 2.1.5 逻辑层和渲染层拆散的利与弊逻辑层和视图层拆散,益处是js运算不卡渲染,最简略间接的感触就是:窗体动画稳。 如果开发者应用过App,应该有概念,webview新窗体一边做进入动画,一边本身渲染,很容易卡动画。而uni-app则无需写预载代码,新窗体渲染快且动画稳固。然而两层拆散也带来一个害处,这两层相互通信,其实是有损耗的。 iOS还好,但Android低端机上,每次通信都要耗时几十毫秒。平时看不出来影响,但有几个场景体现显著: ...

April 19, 2023 · 3 min · jiezi

关于uni-app:uniappvue3vitetypescript架构搭建小程序

本文记录通过cli脚手架搭建uniapp+vue3+vite+typescript我的项目过程。 背景因为在开发uniapp我的项目时须要启动HbuilderX来运行我的项目,但很多时候是习惯应用vscode去开发的,而后再在小程序IDE上关上查看成果,一个我的项目须要开3个软件是很麻烦的一件事,所以看看能不能去掉HbuilderX这一环节,一看还真能够,uniapp官网曾经写出了应用cli创立我的项目的办法,我搭建了运行了一下没有问题,这里去记录一下搭建与欠缺过程。 创立我的项目在uniapp文档中有明确阐明有创立命令:传送门。我这里创立的是vite+ts的,我就间接贴代码了 vue create -p dcloudio/uni-preset-vue#alpha my-alpha-project如果碰到以下报错,须要去间接下载模板 [图片上传失败...(image-50ab5d-1680707519977)] 能够去uni-preset-vue的vite分支下间接下载zip包,解压后粘贴到本人的我的项目中。 实现后目录构造是这样 [图片上传失败...(image-c44f18-1680707519977)] 查看package.json中的script命令,运行命令启动小程序,这里我用微信小程序为例 pnpm run dev:mp-weixin启动起来后关上微信小程序IDE,抉择导入,而后抉择dist目录下dev文件夹下的mp-weixin导入,这里运行不同的环境和不同的小程序平台,打的包是不同的,所以留神辨别。 我的项目关上后初始就是这样,并且反对热更新,还是很不便的。 [图片上传失败...(image-df148a-1680707519977)] 配置eslint接下来就要配置代码查看的货色了, 首先装置eslint pnpm add eslint -D初始化eslint pnpm eslint --init我的抉择如下 [图片上传失败...(image-71753e-1680707519977)] 装置好后进入.eslintrc.js文件,在env中增加node:true解决报错 在package.json中增加lint命令 "lint": "eslint . --ext .vue,.js,.ts,.jsx,.tsx --fix"接下来运行pnpm run lint发现代码有谬误咱们一一解决。 .vue文件解析谬误,代码谬误如下[图片上传失败...(image-42a23b-1680707519977)] 解决办法 "parser": "vue-eslint-parser","parserOptions": { "ecmaVersion": "latest", "parser": "@typescript-eslint/parser", "sourceType": "module"},起因能够看这篇文章: vue3+ts+vite我的项目中应用eslint+prettier+stylelint+husky指南 - 掘金 vue文件命名不标准[图片上传失败...(image-e0325f-1680707519977)] 解决办法:在eslint中配置相应规定 "rules": { 'vue/multi-word-component-names':"off",}配置.eslintignore文件**/node_modules/***/build/***/dist/*配置prettier增加prettier pnpm add prettier -D在根目录新建.prettierrc.js module.exports = { // 一行的字符数,如果超过会进行换行,默认为80 printWidth: 100, // 一个tab代表几个空格数,默认为2 tabWidth: 2, // 是否应用tab进行缩进,默认为false,示意用空格进行缩减 useTabs: false, // 字符串是否应用单引号,默认为false,应用双引号 singleQuote: false, // 行位是否应用分号,默认为true semi: false, // 是否应用尾逗号,有三个可选值"<none|es5|all>" trailingComma: 'none', // 对象大括号间接是否有空格,默认为true,成果:{ foo: bar } bracketSpacing: true}在package.json中配置format命令 ...

April 5, 2023 · 1 min · jiezi

关于uni-app:uniapp打包web项目uniapp开发vue网页应用

uni-app是什么uni-app 是一个应用 Vue.js 开发所有前端利用的框架,开发者编写一套代码,可公布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快利用等多个平台。 本文内容应用 uni-app 这个平台进行开发web利用,语法是Vue.js的。 筹备1、下载 HBuilder 下载地址:htttps://hx.dcloud.net.cn/2、创立我的项目 3、开发 代码pages/index/index.vue <template> <view class="content"> <ul v-for="reslist in reslists"> <li @click="resinfo(reslist.res_id)"> <view class="res_title">{{reslist.res_title}}</view> <view class="res_category_equal"> <span class="res_category">{{reslist.res_category}}</span> <span class="res_equal">{{reslist.res_equal}}</span> </view> </li> </ul> </view></template><script> export default { data() { return { reslists:'' } }, onLoad() { uni.request({ url: 'http://demo.likeyunba.com/api/reslist/reslist.php', header: { 'header': 'application/json' }, success: (res) => { // 将获取到的后果存入reslists数组 this.reslists = res.data; } }); }, methods: { resinfo:function(res_id){ // 跳转到resinfo页面 uni.navigateTo({ url: '../resinfo/resinfo?res_id=' + res_id }); } } }</script><style> *{ padding: 0; margin: 0; } page{ background: #eee; } .content{ width: 90%; margin:30px auto; } .content ul li{ list-style: none; width: 100%; height: 80px; background: #fff; margin-bottom: 10px; border-radius: 10px; } .content ul li .res_title{ width: 100%; height: 40px; line-height: 50px; font-size: 17px; color: #333; text-indent: 15px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; word-break: break-all; } .content ul li .res_category_equal{ width: 100%; height: 40px; line-height: 30px; font-size: 14px; color: #999; text-indent: 15px; } .content ul li .res_category_equal .res_category{ float: left; } .content ul li .res_category_equal .res_equal{ float: left; } .content ul li .res_category_equal .res_creattime{ float: right; font-size: 13px; margin-right: 15px; }</style>pages/resinfo/resinfo.vue ...

March 13, 2023 · 2 min · jiezi

关于uni-app:uniapp中安卓包检查更新新版本下载下载进度条显示功能实现

需要形容如果想要做一个app的话,能够有很多种抉择计划,uni-app是其中的一个性价比高一些(坑多一些)的计划。本文记录一下,uni-app打安卓包当前,须要查看并下载更新,且显示进度条的性能。 代码在本人公司我的项目中利用,大家可放心使用。需要: 查看版本是否是最新版若不是最新版就下载远端服务器的最新的apk包下载中须要显示下载了多少了,当下载到100%的时候,主动装置接口思路剖析比方咱们有一个设置页面,在设置页面中能够去进行版本更新。 1. 查看是不是最新版当每次进入设置页面的时候,在onShow钩子中向后端发申请,获取最新版本的信息,并与以后的版本信息做比照。 比方后端提供的有这样一个:获取最新版本信息 的接口 // 接口申请,返回数据如下:{    "code": 1,    "success": true,    "data": {        "id": 123456, // 存在数据库的id        "applyName": "拼夕夕", // 版本名称        "applyVersion": "1.2.3", // 版本号        "versionDescribe": "此版本新增,是兄弟就帮忙砍一刀性能", // 版本形容 "fileSize":11566511, // 文件的总大小,计算下载进度百分比须要应用        "filePath": "http://ashuai.work:10000/appSrc/pdd.apk", // 版本的url门路,失常在浏览器地址栏中输出即间接下载了 ... // 等等    },    "msg": "操作胜利"}咱们首先拿到后端返回的这个applyVersion字段的值"1.2.3"去和当下的版本值作比照。如果远端的最新版的版本号高于当下的版本号,就阐明要更新了。否则当下的就是最新版,就不必更新。 那问题又来了,如何能拿到当下的版本呢?没关系,官网提供的有api,能够间接获取的,代码如下: plus.runtime.getProperty(plus.runtime.appid, (info) => { this.currentVersion = info.version; // 将当下版本存到currentVersion字段中去})留神这个获取版本号的操作是异步的哦,异步,异步。而后将版本号字符串"a.b.c"转换成数字进行比照即可。 形式有很多种,比方:a*100000 + b*1000 + c*1 // 当然这里须要if(this.applyVersionVal > this.currentVersionVal){ // 须要更新 this.AndroidUpdate()}else { // 以后已是最新版本 uni.showToast({ title: '以后已是最新版本', duration: 2000, icon:'none' }); return}2. 更新下载服务器远端的apk文件&进度条显示调用安卓的办法,创立一个下载工作,能拿到某一时刻下载的文件的大小,比照总大小即可失去下载进度百分比 AndroidCheckUpdate() { const _this = this uni.showModal({ title: "版本更新", content: 'APP有新版本公布,点击 立刻更新 进行最新版本下载。', confirmText: '立刻更新', cancelText: '稍后进行', success: function(res) { if (res.confirm) { _this.show = true // show变量管制一个下载进度弹框(这个UI款式本人写即可) // 创立一个下载工作,并依据后端返回的apk动态资源地址filePath进行下载 var dtask = plus.downloader.createDownload(_this.filePath, {}, function(d, status) { // 下载实现 if (status == 200) { _this.show = false // 下载实现再把下载进度弹框敞开即可 plus.runtime.install(plus.io.convertLocalFileSystemURL(d .filename), {}, {}, function(error) { uni.showToast({ title: '装置失败', duration: 1500 }); }) } else { uni.showToast({ title: '更新失败', duration: 1500 }); } }); dtask.start(); // 下载工作开始下载 // 对于进度的获取是应用定时器一直获取曾经下载的文件的大小,再比照总大小即可 let timer = setInterval(() => { let percent = (dtask.downloadedSize / this.fileSize).toFixed(2) // fileSize文件总大小,后端返回的 _this.percentVal = Math.floor(percent * 100) // 转成整数展现 if (percent >= 1) { // 留神百分比,及时革除定时器即可 clearInterval(timer) } }, 18) } else if (res.cancel) { console.log('稍后更新'); } } });}进度条应用的是u-popup组件,如下: ...

February 7, 2023 · 2 min · jiezi

关于uni-app:vue3-uniapp-vite构建流程h5简易版

看不清的话,能够按浏览器ctrl++放大查看 flowchart TB subgraph "命令行工具" scriptRun["uni dev"] end subgraph "vite-plugin-uni" uniDefaultDef["export default uni"] uniPluginNote["在此处定义了很多vite钩子"] uniPluginNote -..-> uniDefaultDef end subgraph 我的项目根目录 viteConfigDef["vite.config.ts"] viteConfigDef -."config.plugins".-> uniDefaultDef end subgraph "#64;vue/shared" shareExtendDef["shared.extend"] end subgraph vite serverCreateServerDef["server.createServer"] serverCreateServerDef -."process.env.VITE_ROOT_DIR".-> viteConfigDef end subgraph uni-app-vite subgraph dist subgraph utils subgraph easycom initEasycomDef["easycom.initEasycom"] end end subgraph cli subgraph index.js %% runBuildExc["action.runBuild"] runDevExc["action.runDev"] end runDevExc -..-> runDevDef subgraph action.js runDevDef["action.runDev"] --> shareExtendExc["shared.extend"] --> utilsInitEnvExc["utils.initEnv"] --> serverCreateServerExc["server.createServer"] --> initEasycomExc["easycom.initEasycom"] end scriptRun -..-> runDevExc shareExtendDef -..-> shareExtendExc utilsInitEnvDef -..-> utilsInitEnvExc serverCreateServerDef -..-> serverCreateServerExc initEasycomDef -..-> initEasycomExc subgraph utils.js utilsInitEnvDef["utils.initEnv"] end end end end ...

January 17, 2023 · 1 min · jiezi

关于uni-app:uniapp运行微信小程序无法启动小程序Enable-IDE-Service-yN-27D27C

uni-app运行微信小程序无奈启动小程序异样信息如下Enable IDE Service (y/N) [27D[27C(如下图) 解决形式手动开启微信小程序开发工具 -> 设置 -> 平安 -> 关上服务端口 参考资料uni-app官网文档中运行uni-app中第3点配置,其中留神项enable ide service (y/n) [27d[27c

December 27, 2022 · 1 min · jiezi

关于uni-app:小程序uniapp接媳妇文本

1.uniapp插件市场下载mp-html。 链接:https://files.cnblogs.com/fil... 2.放到components目录下。 3.引入 import mpHtml from '@/components/mp-html/mp-html' components: { mpHtml },4.应用 <mp-html :content="content" />

October 17, 2022 · 1 min · jiezi

关于uni-app:融云-uniapp-原生插件生态丰富高效集成

uni-app 作为业内最风靡的利用框架之一,撑持着 12 亿沉闷手机用户的宏大生态。关注【融云寰球互联网通信云】理解更多 这个框架因在小程序端的舒爽构建体验和丰盛的开发生态而备受开发者青眼,同时可用来编译 App、Web 端利用,尤其是对于一些轻量级利用来说,是疾速实现多端笼罩产品的优选。融云为 uni-app 生态提供了丰盛的原生插件,蕴含单群聊、超级群,一对一、一对多音视频通话,低提早直播、视频会议等多种场景能力,并提供美颜、推送等 X 通信周边服务,助力开发者方便快捷地实现相干利用。 uni-app 缘何大火?uni-app 所属公司 DCloud 领有 900 万开发者、数百万利用、12 亿手机端月活用户,以及数千款 uni-app 插件。 开发一次,多端笼罩在 uni-app 开发一套源码,能够同时运行到 iOS、Android、Web、微信小程序、支付宝小程序、百度小程序、头条小程序、QQ 小程序、钉钉小程序等多端。在不就义平台特色的同时,实现对平台专有能力的优雅调用,做到了海纳百川、各取所长。 丰富多彩的周边生态DCloud 创立了凋谢、兼容的插件零碎,品种繁多,数量宏大,可满足开发者各种开发需要,包含前端组件、JS SDK、页面模版、我的项目模版、原生插件等数千款。 学习老本和开发成本低uni-app 开发以通用前端技术栈为根底,采纳 Vue 框架 JavaScript 语言,对于前端开发者来说简直没有额定的学习老本。不须要转换开发思维、不须要更改开发习惯即可实现跨端开发,疾速交付我的项目。 融云 uni-app 原生插件及跨平台 SDK融云为 uni-app 生态提供了丰盛的原生插件,开发者无需配置原生我的项目即可开发原生 App,助力开发者打造更好的 App 体验。 RCUniIMV2基于原生 IM SDK 封装成的 uni-app 原生插件,反对 Android 和 iOS 平台,接口易用、功能丰富、集成简略。 RCUniPush基于 Android 厂商推送 SDK 封装成的 uni-app 原生插件,配合 RCUniIMV2 插件,可实现融云音讯在 Android 端和 iOS 的推送告诉能力。安卓厂商推送蕴含华为、小米、OPPO、vivo、魅族。开发者只需在 uni-app 层设置推送参数,即可疾速实现融云音讯离线推送性能。 ...

October 11, 2022 · 2 min · jiezi

关于uni-app:ShareSDK-Uniapp-插件

筹备下载开发工具HBuilderX 筹备uniapp我的项目如果没有曾经创立好的我的项目,能够自行创立新的我的项目 之后抉择新建uni-app我的项目。关上HBuildX的文件->导入->本地我的项目导入创立的文件夹->创立。 插件集成本地插件集成[下载离线插件](https://ext.dcloud.net.cn/plu...) 将下载好的插件放在我的项目的nativeplugins文件夹中。(若没有则创立此目录) 目录构造如下: 之后在uniapp的“manifest.json”中抉择“app原生插件配置”,点击抉择本地插件,如图: 云端插件集成在uniapp的“manifest.json”中抉择“app原生插件配置”,点击抉择云端插件,如图: 留神:本地插件和云端插件能够任选一样配置,区别在于本地插件寄存到工程nativeplugins目录下的原生插件,实用于未公布到插件市场的公有原生插件进行云打包,云端插件是曾经在插件市场购买或绑定试用的插件,无需下载插件到工程中,云打包时会间接合并打包原生插件到App中。不过咱们提供的插件是收费的哦!iOS平台相干配置配置初始化信息和URL SCheme在“app原生插件配置”中增加MobTech平台注册的MOBAppKey和MOBAppSecret,如何失去这2个参数,请参考这个流程。以及微信、QQ、新浪、Facebook、Twitter等平台的注册平台信息。各平台注册地址,请点击 这里 。 并在“app罕用其余设置”中的“iOS设置”中填写URL Scheme,以及白名单等信息,具体每个平台如何配置,请参考 原生文档配置Xcode我的项目这块。 配置平台的Universal Link微信以及qq要求用户在新版SDK中填写universalLink,所以须要在利用中配置通用链接,须要在manifest.json的源码视图添"app-plus"->"distribute"->"ios"下,增加如下代码: Android平台相干配置留神:安卓端只反对本地依赖形式导入 增加依赖 在uniapp插件市场找到ShareSDK插件,点击下载for离线打包 2.解压到uni-app利用的nativeplugins目录中具体参考:https://ask.dcloud.net.cn/art...,实现后如下图: 配置分享平台信息配置ShareSDK.xml文件在我的项目中mob-sharesdk/android下新建assets目录,在新创建的assets目录中创立名为ShareSDK.xml的文件,如下图: ShareSDK.xml文件内容示例为: 其中各平台的appkey等信息仅为demo示例,正式应用请替换为本人在分享受权平台申请的<?xml version="1.0" encoding="utf-8"?><DevInfor><SinaWeibo Id="1" SortId="59" AppKey="568898243" AppSecret="38a4f8204cc784f81f9f0daaf31e02e3" ShareByAppClient="true" Enable="true" RedirectUrl="http://www.sharesdk.cn" /><TencentWeibo Id="2" SortId="2" AppKey="801307650" AppSecret="ae36f4ee3946e1cbb98d6965b0b2ff5c" Enable="true" RedirectUri="http://sharesdk.cn" /><Douban Id="16" SortId="16" Enable="true" ApiKey="031a96a3aa8b28af094fc3eaffa17a0d" Secret="2e675e730571b75d" RedirectUri="http://mob.com" /><QZone Id="3" SortId="3" AppId="100371282" AppKey="aed9b0303e3ed1e27bae87c33761161d" ShareByAppClient="true" BypassApproval="false" Enable="true" /><Renren Enable="false" /><KaiXin Enable="false" /><Facebook Id="8" SortId="8" ShareByAppClient="true" Enable="true" ConsumerKey="2796236850615578" ConsumerSecret="7d353609b517b23a80dcb057995ef30c" RedirectUrl="https://mob.com" /><Twitter Id="9" SortId="9" ShareByAppClient="true" Enable="true" ConsumerKey="viOnkeLpHBKs6KXV7MPpeGyzE" ConsumerSecret="NJEglQUy2rqZ9Io9FcAU9p17omFqbORknUpRrCDOK46aAbIiey" CallbackUrl="http://mob.com" /><Evernote Id="19" SortId="19" HostType="sandbox" ShareByAppClient="true" Enable="true" ConsumerKey="sharesdk-7807" ConsumerSecret="d05bf86993836004" /><FourSquare Enable="false" /><GooglePlus Id="21" SortId="21" OfficialVersion="default" ShareByAppClient="true" Enable="true" ClientID="236300675100-am5pm8km7md1memjevq8rl9pg5c4s4b8.apps.googleusercontent.com" RedirectUrl="http://localhost" /><Instagram Id="28" SortId="28" ShareByAppClient="true" Enable="true" ClientId="ff68e3216b4f4f989121aa1c2962d058" ClientSecret="1b2e82f110264869b3505c3fe34e31a1" RedirectUri="http://sharesdk.cn" /><LinkedIn Id="20" SortId="20" ShareByAppClient="true" Enable="true" ApiKey="ejo5ibkye3vo" SecretKey="cC7B2jpxITqPLZ5M" RedirectUrl="http://sharesdk.cn" /><Tumblr Enable="false" /><Email Id="12" SortId="12" Enable="true" /><ShortMessage Id="13" SortId="13" Enable="true" /><Wechat Id="4" SortId="4" AppId="wx4868b35061f87885" AppSecret="64020361b8ec4c99936c0e3999a9f249" WithShareTicket="true" BypassApproval="false" Enable="true" /><WechatMoments Id="5" SortId="5" AppId="wx4868b35061f87885" AppSecret="64020361b8ec4c99936c0e3999a9f249" BypassApproval="false" Enable="true" /><QQ Id="7" SortId="7" AppId="100371282" AppKey="aed9b0303e3ed1e27bae87c33761161d" ShareByAppClient="true" BypassApproval="false" Enable="true" /><Instapaper Id="38" SortId="38" Enable="true" ConsumerKey="4rDJORmcOcSAZL1YpqGHRI605xUvrLbOhkJ07yO0wWrYrc61FA" ConsumerSecret="GNr1GespOQbrm8nvd7rlUsyRQsIo3boIbMguAl9gfpdL0aKZWe" /><Pocket Id="37" SortId="37" Enable="true" ConsumerKey="32741-389c565043c49947ba7edf05" /><YouDao Id="17" SortId="17" HostType="product" Enable="true" ConsumerKey="dcde25dca105bcc36884ed4534dab940" ConsumerSecret="d98217b4020e7f1874263795f44838fe" RedirectUri="http://www.sharesdk.cn/" /><Pinterest Enable="false" /><Flickr Enable="false" /><Dropbox Enable="false" /><VKontakte Id="27" SortId="27" ShareByAppClient="true" Enable="true" ApplicationId="3921561" /><WechatFavorite Id="6" SortId="6" AppId="wx4868b35061f87885" AppSecret="64020361b8ec4c99936c0e3999a9f249" BypassApproval="false" Enable="true" /><Yixin Enable="false" /><YixinMoments Enable="false" /><Mingdao Enable="false" /><Line Id="32" SortId="32" callbackscheme="lineauth" Enable="true" ChannelID="1639219273" ChannelSecret="58faad55ffce8bf8f63b59fe6fb702ae" RedirectUri="https://www.mob.com/" /><WhatsApp Id="35" SortId="35" Enable="true" /><KakaoTalk Id="33" SortId="33" AppKey="48d3f524e4a636b08d81b3ceb50f1003" Enable="true" /><KakaoStory Id="34" SortId="34" AppKey="48d3f524e4a636b08d81b3ceb50f1003" Enable="true" /><FacebookMessenger Id="39" SortId="39" AppId="107704292745179" OfficialVersion="default" Enable="true" /><Alipay Id="50" SortId="50" AppId="2015072400185895" Enable="true" /><AlipayMoments Id="51" SortId="51" AppId="2015072400185895" Enable="true" /><Dingding Id="52" SortId="52" AppId="dingoanxyrpiscaovl4qlw" BypassApproval="false" Enable="true" /><Youtube Id="53" SortId="53" AppSecret="AIzaSyAO06g-0TDpHcsXXO918a7QE3Zdct2bB5E" ShareByAppClient="true" Enable="true" ClientID="370141748022-bicrnsjfiije93bvdt63dh3728m4shas.apps.googleusercontent.com" RedirectUrl="http://localhost" /><Meipai Id="54" SortId="54" AppSecret="y9ym6rrjjijtkt23qtsc" ShareByAppClient="true" Enable="true" ClientID="1089867596" /><Telegram Id="47" SortId="47" AppKey="782826033" Enable="true" RedirectUrl="http://www.mob.com" /><Cmcc Id="55" SortId="55" AppId="300011860247" AppKey="2D464D8BFCE73A44B4F9DF95A2FDBE1C" /><Reddit Id="56" SortId="56" AppKey="MExDxPuTCtFiRw" RedirectUrl="http://www.sharesdk.cn" /><Telecom Id="57" SortId="57" AppKey="8148612606" AppSecret="mCltrhUqwshFa86egDTs0491ibaAulKA" Enable="true" RedirectUrl="http://www.sharesdk.cn" /><Accountkit Id="58" SortId="58" AppKey="579465512480462" AppSecret="8a6383652dd9f23fb0994f03d350d0ca" Enable="true" RedirectUrl="http://www.sharesdk.cn/" /><Douyin Id="59" SortId="1" AppKey="aw9ivykfjvi4hpwo" AppSecret="42b4caa6bda60bd49f05f06d0a4956e1" Enable="true" /><Wework Id="60" SortId="60" AppKey="wwa21eaecf93f0e3ba" AppSecret="dW7e27P7Hc8NiYdRxnbTeOLgfI1ugR72e-PM8uusq2s" AgentId="1000012" Schema="wwautha21eaecf93f0e3ba000012" /><HWAccount Enable="false" /><Oasis Enable="false" /><XMAccount Enable="false" /><SnapChat Enable="false" /><Kuaishou Id="68" SortId="68" Enable="true" /><Littleredbook Enable="false" /><Watermelonvideo Enable="false" /><Tiktok Enable="false" /></DevInfor>配置manifest.json抉择manifest.json文件中的App原生插件配置,增加本地插件或云端插件mob-sharesdk,别离填写Mob-AppKey、Mob-AppSecret、QQ-AppId、Facebook-AppKey、Line-CallBackScheme,其中Mob-AppKey、Mob-AppSecret为必填,其余三项可按需填写。 ...

September 22, 2022 · 4 min · jiezi

关于uni-app:uniapp浙政钉H5项目埋点

稳定性监控留神:间接把上面的代码复制到本人我的项目的public/index.html下<script src='https://wpk-gate.zjzwfw.gov.cn/static/wpk-jssdk.1.0.2/wpkReporter.js' crossorigin='true'></script><script>try { const config = { bid: '须要自行替换', signkey: '须要自行替换', gateway: 'https://px-emas.dg-work.cn'专有云利用,参数在部署时请替换为正确的专有云地址https://wpk-gate.zjzwfw.gov.cn};const wpk = new wpkReporter(config);wpk.installAll();window._wpk = wpk;} catch (err) { console.error('WpkReporter init fail', err);}</script> 流量剖析 (1)通用采集SDK 留神:同上,间接把上面的代码复制到本人我的项目的public/index.html下,跟在稳定性监控代码上面<script> (function(w, d, s, q, i) { w[q] = w[q] || []; var f = d.getElementsByTagName(s)[0],j = d.createElement(s); j.async = true; j.id = 'beacon-aplus'; j.src = 'https://alidt.alicdn.com/alilog/mlog/aplus_cloud.js'; f.parentNode.insertBefore(j, f); })(window, document, 'script', 'aplus_queue'); aplus_queue.push({ action: 'aplus.setMetaInfo', //专有云利用,第二个参数在部署时请替换为正确的专有云地址alog.zjzwfw.gov.cn arguments: ['aplus-rhost-v', 'alog.dg-work.cn'] }); aplus_queue.push({ action: 'aplus.setMetaInfo', //专有云利用,第二个参数在部署时请替换为正确的专有云地址alog.zjzwfw.gov.cn arguments: ['aplus-rhost-g', 'alog.dg-work.cn'] }); var u = navigator.userAgent var isAndroid = u.indexOf('Android') > -1 var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/) aplus_queue.push({ action: 'aplus.setMetaInfo', arguments: ['appId', isAndroid ? '28302650' : isIOS ? '28328447' : '47130293'] });</script> ...

September 8, 2022 · 2 min · jiezi

关于uni-app:云对象-重新定义前后端交互

背景从2000年开始,xml作为数据交换格局开始风行,服务器拼接xml接口,客户端js获取xml内容,动静批改页面。 几年后,数据量更小的json代替了xml。 挪动互联网到来后,因为客户端决裂,加剧了接口的泛滥。 一转眼,接口曾经玩了20年了。其余技术飞速发展,而前后端交互却始终是接口,没有什么翻新。 js曾经有了import、export,为什么调用后端接口,不能像调用一个前端模块一样呢? serverless,让这所有开始了变动。 亚马逊lambda提出了云函数的概念,不再应用restful的url,但依然是基于json替换前后端数据。 uniCloud最后也以反对云函数为开始,但咱们发现这仍不够优雅、简洁、直观、对立。 从HBuilderX 3.4 开始,uniCloud推出了“云对象”,让调用云端服务,真正变成像调用前端模块一样简略。 什么是云对象云对象:服务器编写API,客户端调用API,不再开发传输json的接口。思路更清晰、代码更精简。 比方服务端编写一个云对象news,该对象导出若干办法:add()、getList()、getDetailById()、softDel()、changeContent()、allowPublic()、addComment()、getComments()...等办法。 客户端的js则能够间接import这个news云对象,而后间接调用add等办法。 服务器示例代码如下: HBuilderX中在uniCloud/cloudfunctions目录新建云函数/云对象,抉择类型为云对象,起名为news。关上云对象入口index.obj.js,增加一个add办法。 // 云对象名:newsmodule.exports = { add(title, content) { title = title.trim() content = content.trim() if(!title || !content) { return { errCode: 'INVALID_NEWS', errMsg: '题目或内容不可为空' } } // ...其余逻辑 return { errCode: 0, errMsg: '创立胜利' } }}而后在客户端的js中,import这个news对象,调用它的add办法。 const news = uniCloud.importObject('news') //第一步导入云对象async function add () { try { const res = await news.add('title demo', 'content demo') //导入云对象后就能够间接调用该对象的办法了,留神应用异步await uni.showToast({ title: '创立胜利' }) } catch (e) { // 合乎uniCloud响应体标准 https://uniapp.dcloud.net.cn/uniCloud/cf-functions?id=resformat,主动抛出此谬误 }}能够看到云对象的代码十分清晰,代码行数也只有27行。 ...

September 8, 2022 · 2 min · jiezi

关于uni-app:如何在uniapp使用iconfont字图标

增加图标关上,https://www.iconfont.cn/ 网站,找到本人的喜爱的图表退出到我的项目中 下载本地点击下载至本地 拷贝文件将iconfont.css,iconfont.woff,iconfont.woff2 复制到本人的我的项目中, 关上iconfont.css文件,我须要去编辑框框的中央 资源转换uni-app 字体文件小于 40kb,uni-app 会主动将其转化为 base64 格局uni-app 本地门路图标字体反对状况:字体文件大于等于 40kb, 需开发者本人转换,否则应用将不失效转换工具https://www.giftofspeed.com/base64-encoder/ 关上转换工具网站,抉择iconfont.ttf字体进行转换 复制内容,回到代码 成果浏览器端 App端

August 17, 2022 · 1 min · jiezi

关于uni-app:Uniapp开发App和插件以后如何开通广告盈利uniAD

Uni-app 作为近些年国内逐步衰亡的跨平台开发架构,一次开发就能够实现小程序、iOS APP、安卓 APP、 H5等平台的打包是受到关注的起因。于此同时,很多开发者也开始关注Uni-app架构之外的货色,比如说如何退出广告性能让本人的软件可能实现变现。 其实 Uni-app 的开发团队 DCloud 早就推出了一款名为 uni-AD 广告联盟的产品,开发者能够通过 uni-AD 广告联盟实现信息流广告/原生广告、插屏广告等性能。明天智密科技就来为大家介绍一下这款官网推出的广告公布插件。 uni-AD 目前反对的平台APP、微信小程序广告、H5 uni-AD 在APP端反对的广告渠道优量汇,快手,穿山甲,百度,华为,Sigmob,360 开明 uni-AD 的流程uni-AD登录地址:请登录uni-AD后盾进行注册,而后进行实名认证(确保实名认证的信息与广告联盟收款人信息保持一致)进入后盾,开明根底广 告与加强广告,加强广告须要软著和利用商店上架(快手和Sigmob广告除外)。根底广 告开明后即可应用,加强广告须要审核后才可应用,审核工夫为1-2个工作日遇节假日顺延。注:加强广告聚合了优量汇,快手等广告渠道,收益较根底广告要高审核通过后,即可创立广 告位,创立广 告位后生成apdid,进行广告代码部署与调试,确保利用上的广告位均可失常展现,从新公布您利用的新版本让用户进行更新。什么是根底广告和加强广告根底广告的模式包含:开屏广告悬浮广告推送广告加强广告的模式包含:开屏广告信息流广告激励视频广告全凭视频广告插屏广告因为uni-AD的所有申请程序都是动静调整的,会优先展现收益更高的渠道。因而如果是开屏广告同时存在有根底广告和加强广告,算法就会主动展现收益更高的广告。 部署根底广告API对接DPS广告,无需开发间接点击启动就能够展现广告部署加强广告通过SDK集成支流的广告联盟须要肯定的额定开发如何抉择原生利用广告接入与uni-app中应用uni-AD利用以后uni-AD反对应用原生利用广告接入。然而开发者在用原生利用接入广告时通常比uni-app利用接入广告要更费时(uni-app接入广告会比原生节俭一半工夫),这是因为原生代码相比uni-app的代码繁琐导致部署与调试效率降落。

July 14, 2022 · 1 min · jiezi

关于uni-app:uniapp下拉触底节流

<template> <view ><view class="clor" v-for="(item,index) in MathArr" :key="index":style="'background: rgba('+item+');'" >{{item}} </view></view></template> <script>export default { data(){ return { MathArr:[], lond:'' } },methods:{getColor(){ this.lond=true uni.showLoading({ title:'正在加载中...' }) const t=this uni.request({ url:'https://www.escook.cn/api/color', method:'GET', success:({data:res})=> { t.MathArr=[...t.MathArr,...res.data] }, complete:()=>{ uni.hideLoading() this.lond=false } })}},onLoad(){ this.getColor()},onReachBottom() { if(this.lond==false){ this.getColor()//下拉到底 触发申请 而后新旧数组一起合并 失去第二组第三组.....数据 }},}</script> <style> .clor{ line-height: 100px; height: 100px; border-radius: 8px; border: solid 1px #E6F3F9; text-align: center;}</style>

July 7, 2022 · 1 min · jiezi

关于uni-app:云开发扫码点餐系统实战

云开发是什么?还不晓得云开发是什么?看看微信官网的视频介绍:云开发是什么,置信看完之后,你会有所理解。 单刀直入扫码点餐零碎后盾治理端地址:乔巴餐饮店 账号:18000000000 明码:123qweASD 大家也能够本人注册账号密码去登录。 目前后盾菜品等数据较少,大家能够自行添加,就能够在小程序中展现进去了。 小程序端地址:默认是001号桌,这样就会间接进入点餐界面,不会到首页 也能够间接扫码 001号桌,能够进入首页,抉择就餐人数 示意图: 技术栈基于vue2.x语法的uniapp实现微信小程序云开发 + 云函数 + 云数据库 + 云托管 + 动态网站托管 + 腾讯云cos对象存储 + nodejs + koa + GoEasy 即时通讯。波及到的技术点还是比拟多的,然而都是目前支流的技术点,云开发更是将来的趋势。最初云开发当初越来越炽热,生态也越来越欠缺,各家云厂商更是百花齐放。腾讯云借助本身微信生态的劣势,更是吸引宽广程序员蠢蠢欲动,某些业务场景更是颠覆了传统的开发模式,一举成为 "短平快" 我的项目的宠儿。之前基于微信小程序云开发做过的一个cms相干的小程序,更是不到一周就搞定上线了,若依照传统开发模式去做,可能至多须要2~3周工夫。因为基于微信小程序云开发去实现,间接省去了后盾开发和后盾管理系统开发,间接基于微信云函数、云存储、云数据库、以及微信内置的弱小的 "内容治理" 零碎,只用将重心关注在小程序性能实现上,开发效率晋升好几倍,不要太爽! **学习,慢慢来,会很快。 有趣味能够关注下我的微信公众号 "面向 CtrlCV 编程",所有最新文章、学习资源、工具、会最先在公众号内公布。**回复 “点餐”,即可取得小程序端源码,可自行二次开发。有问题可扫下面二维码增加我的微信号。

May 31, 2022 · 1 min · jiezi

关于uni-app:uniapp复制功能

<template> <view> <view @click="copy("123")"></view> </view></template> <script>copy(value){ //提醒模板 uni.showModal({ content:value,//模板中提醒的内容 confirmText:'复制内容', success:()=>{//点击复制内容的后调函数 //uni.setClipboardData办法就是讲内容复制到粘贴板 uni.setClipboardData({ data:value,//要被复制的内容 success:()=>{//复制胜利的回调函数 uni.showToast({//提醒 title:'复制胜利' }) } }); } });}</script>

May 3, 2022 · 1 min · jiezi

关于uni-app:unipopup样式及遮罩

/小声BB/ :最近开始写uni-app,发现ui框架是真的很...难用。官网文档也...一言难尽。或者某种意义上来讲,这也属于是由奢入俭难吧。同样的,存在也即是正当,我没有不感恩的意思。 效果图: template:<template> <view> <view class="mark" v-show="showMask"></view> <!-- 其余组件代码略 --> <uni-popup ref="delete" type="dialog" class="popup-style"> <uni-popup-dialog type="error" cancelText="勾销" confirmText="确认" title="删除" content="是否确认删除" @confirm="deleteConfirm" @close="showMask=false"></uni-popup-dialog> </uni-popup> </view></template>script:import uniPopup from "@/components/uni-popup/uni-popup"import uniPopupDialog from "@/components/uni-popup-dialog/uni-popup-dialog"export default { components:{ uniPopup, uniPopupDialog }, data() { return { showMask: false, } }, <!-- 其余代码略 -->},scss:<style lang="scss" scoped> // uni-popup款式重置 /deep/.popup-style { .uni-popup-dialog { position: fixed; top: 30%; left: calc((100vw - 300px)/2); } // 遮罩层 .mark { height: 100vh; width: 100vw; background: rgba(0, 0, 0, 0.5); position: absolute; left: 0%; right: 0%; z-index: 1; }}</style>

April 29, 2022 · 1 min · jiezi

关于uni-app:开发日记03-uniapp-打包为-app

uni-app 打包为 app 前置条件老手向,但须要有一些开发根底。 Git官网下载:https://git-scm.com/downloads应用以下命令验证是否可用 git version# 示例输入# git version 2.32.0 (Apple Git-132)NodeJSnodejs 应用 lts 长期反对版本就行。 官网下载:https://nodejs.org/zh-cn/download/应用以下命令验证是否可用 node -v# 示例输入# v16.14.1装置全局须要用到的工具,如果是 mac 零碎须要加 sudo npm i yarn tbify -g# yarn: nodejs 包治理# tbify: 国内减速下载代理验证是否装置胜利 tyn -v# 示例输入# 1.22.17tnpm -v# 示例输入# 8.5.0HbuilderX下载正式版本下的 app 开发版本。 官网下载:https://www.dcloud.io/hbuilderx.html装置 sass 编译插件:https://ext.dcloud.net.cn/plugin?name=compile-node-sass 克隆代码git clone [你我的项目的git地址]# 示例git clone https://github.com/SunSeekerX/uni-app-starter.git 装置我的项目依赖uni-app 我的项目有两种类型, 一种是通过 HbuilderX 工具创立的一种是通过命令行工具创立的我比拟喜爱命令行工具创立的,因为所有依赖都能本人治理。同时也能进行 ci&cd集成,HbuilderX 创立的则更为简略不便。 分别形式 HbuilderX 工具创立 我的项目根目录下个别无 src 文件夹pages 文件夹在根目录命令行工具 ...

March 22, 2022 · 1 min · jiezi

关于uni-app:uniapp-通过命令行编译打包

# 切换node版本(不肯定须要)nvm use v16.2.0# 进入HBuild的cli目录# uni-app打包相干命令都封装在cli外面了cd /Applications/HBuilderX.app/Contents/HBuilderX/plugins/uniapp-cli/# 指定我的项目根地址INIT_CWD=/Users/robin/DO/VUE/xxx# H5端开发模式运行(对应IDE上的运行到浏览器,会主动关上浏览器)cross-env UNI_INPUT_DIR=$INIT_CWD/ UNI_OUTPUT_DIR=$INIT_CWD/unpackage/dist/dev/h5 UNI_PLATFORM=h5 NODE_ENV=development node bin/uniapp-cli.js# 开发模式打包appcross-env UNI_INPUT_DIR=$INIT_CWD/ UNI_OUTPUT_DIR=$INIT_CWD/unpackage/dist/dev/app-plus UNI_PLATFORM=app-plus NODE_ENV=development node bin/uniapp-cli.js# 打包编译H5端(对应IDE上的发行网站)cross-env UNI_INPUT_DIR=$INIT_CWD/ UNI_OUTPUT_DIR=$INIT_CWD/unpackage/dist/build/h5 UNI_PLATFORM=h5 NODE_ENV=production node bin/uniapp-cli.js# 发行模式打包app(最终生成wgt)# 先导出rm -rf $INIT_CWD/unpackage/dist/build/app-pluscross-env UNI_INPUT_DIR=$INIT_CWD/ UNI_OUTPUT_DIR=$INIT_CWD/unpackage/dist/build/app-plus UNI_PLATFORM=app-plus NODE_ENV=production node bin/uniapp-cli.js# 在zip压缩成wgtcd $INIT_CWD/unpackage/dist/build/app-pluszip -q -r $INIT_CWD/unpackage/release/app-plus.wgt ./

March 22, 2022 · 1 min · jiezi

关于uni-app:uniapp混合开发以微信小程序为例

官网文档uni-app 全局变量的几种实现形式:http://ask.dcloud.net.cn/arti...uni-app反对混合开发。详见:https://uniapp.dcloud.io/hybrid重点中央次要应用计划三:原生开发的小程序仍保留,局部新性能应用uni-app开发。 新建uni-app我的项目我的项目全局变量引入vuex vue create -p dcloudio/uni-preset-vue my-project装置vuexnpm i install vuex --save页面引入vuex,和惯例vue我的项目统一新建页面,page.json写门路混合开发打包 npm run build:mp-weixin -- --subpackage=sub16.dist文件夹内找到打包后的sub1的文件夹 新建一个小程序新建一个文件夹,放入刚刚sub1的文件夹的文件app.json写入subpackages,补充完sub1的页面门路全局变量通信uni-app我的项目是用的vuex,无奈应用微信小程序的全局变量要在App.vue 里定义和小程序同样的变量名,就能够读取到主程序的全局变量App.vueindex.vue setText () { getApp().globalData.text++ this.text = getApp().globalData.text }此处的getApp().globalData.text会读取到主程序的全局变量,进行操作 全局办法通信uni-app我的项目调用微信小程序app.js 定义的办法在小程序里uni-app useMainFun () { getApp().globalData.useMainFun() }uni.app 的页面就能够调用小程序主包的办法了

February 15, 2022 · 1 min · jiezi

关于uni-app:uniapp热更新后不匹配的版本可能造成应用异常的原因和解决方法

问题的呈现线上紧急修复bug的时候,常常应用热更新,最近一次热更新后遇到了问题:更新完后下一次关上app时,提醒了: “本利用应用HBuilder3.2.16编译或对应的cli版本编译,而手机端SKD版本是3.2.9。不匹配的版本可能造成利用异样。”呈现这一提醒的起因是,上一次版本公布的app曾经大半个月了,期间我降级了HBuilder的利用版本,在打包wgt文件时,应用了3.2.16版本的hbuilder打包进去的,而用户手机上安装的是3.2.9版本的hbuilder打包的整包,所以在更新时提醒编译版本和手机内运行的版本不统一。 解决办法1、从新打包apk解决这个问题的办法有很多,其中对app来说,最好的办法就是用高版本的3.2.16打一个新包,并让用户强制更新到新包,因为hbuilder降级会修复很多bug,其中有一些bug是须要咱们关注的,降级到最新版本能够达到缩小bug的目标。 2、回退hbuilder版本然而整包强制更新对用户不太敌对,对于用户来说,最好的办法就是重新安装3.2.9的hbuilder打包,放弃和用户手机对立的版本,在下一次须要整包更新的再降级到最新的hbuilder,这样的毛病就是,当hbuilder修复了一些重要的bug,作为开发者不能第一工夫享受到这个修复,如果这个bug还影响用户,那就必须进行降级了。 3、疏忽弹窗第三种办法就是不解决版本差别,而间接疏忽弹窗,“不匹配的版本可能造成利用异样。”,可能也就代表了不肯定,小版本的更新,少数状况下咱们是能够间接疏忽的,疏忽的办法也很简略: 在manifest.json中,"app-plus"->"compatible"增加配置: "app-plus": { "compatible": { "ignoreVersion": true //true示意疏忽版本查看提示框,HBuilderX1.9.0及以上版本反对 }}, 更多细节内容能够参考官网的阐明: uni-app运行环境版本和编译器版本不统一的问题

February 13, 2022 · 1 min · jiezi

关于uni-app:vue3和vite双向加持uniapp性能再次提升

uni-app对vue3 & Vite的降级,是一个渐进式过程: 2020年9月:小程序平台反对 vue3 开发,小程序平台编译器仍然应用webpack;2021年5月:H5平台反对 vue3 开发,H5平台编译器降级为 Vite;2021年8月:App平台反对 vue3 开发,App平台编译器降级为 Vite;2021年11月:小程序平台编译器降级为 Vite;至此,uni-app在全平台反对了 Vite 编译及Vue 3.x 运行。 so,这场持续一年之久的大版本升级,到底给uni-app我的项目带来了哪些晋升? 是时候总结(秀)一波了。 新版 uni-app 框架次要做了三大改良: 重写框架内核:基于vue3 + ts重写内置组件和API,实现更彻底、更高效的tree-shaking;新增反对 Vite 构建工具,在H5平台实现秒开预览;新增反对 Vue3.x,实现更灵便的开发方式,及更高的运行性能;基于这三大改良,uni-app我的项目取得了多快好省四大收益: 更多的语法反对,反对组合式API,业务聚焦,开发效率更高;更快的编译速度,H5平台十倍减速,小程序、App减速30%以上;更好的运行性能,用户端响应更快,体验更好;更小的代码体积,瘦身30%以上,更省体积、更省流量更多的语法反对新版uni-app反对Vue 3.x框架,反对组合式API,可实现更聚焦的业务开发。 Vue 3.x的一些新增个性,uni-app也曾经齐全反对,如: 反对<script setup>反对<style scoped>、<style module>、State-Driven Dynamic CSS(v-bind)反对jsx、tsx(h5,app 平台反对,小程序不反对)另外,在小程序平台,新版uni-app也扩大了更多的语法,如: 更欠缺的模板语法反对(如 class、style 反对函数、变量等,不再局限数组、对象类型)更残缺的 props 反对(如传递函数)更欠缺的 slot 反对(如作用域插槽)更快的编译速度开发者日常工作中,最无聊的就是期待编译构建。 某乎上还有一个”程序员在期待编译的时候都做什么?“的探讨帖,可见编译工夫对开发者而言,是一个如许难堪无聊的碎片工夫。 uni-app本次降级vue3 & Vite后,在编译工夫上有多少改良?带给开发者多少福利?咱们安顿实在测试,以数据谈话。 测试环境阐明: 硬件:RedmiBook 14 二代处理器:Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz 内存:16.0 GB操作系统:Windows 11 专业版 64 位操作系统对于编译速度,咱们做了两个维度的比照: 纵向比照:筛选uni-app罕用我的项目模板,在H5、小程序、App平台,别离测试vue 2.6和vue 3.x的编译工夫横向比照:应用业内优良的其它跨端框架,创立默认我的项目模板,记录其编译工夫,和uni-app的vue 3.x版本进行比照uni-app 历史版本纵向比照咱们抉择uni-app默认模板、uni-starter、hello-uniapp三个我的项目模板,别离测试vue 2.6和vue 3.x的编译工夫。 ...

January 11, 2022 · 1 min · jiezi

关于uni-app:拥抱简洁代码vue3中的script-setup最强解析

vue3除了Composition API是一个亮点之外,尤大大又给咱们带来了一个全新的玩意 —— script setup,对于setup大家置信都不生疏,而对于script setup有些同学则示意难以了解,那么从当初开始,这一篇文章将让你一看就懂。 ref与reactive在setup中,咱们领有ref和reactive俩个api去创立一个响应式变量,这俩者存在的区别是ref是针对根本类型的响应,而reactive是针对援用类型的响应。 import { ref, reactive } from 'vue'const data = ref('123')const other = reactive({ is: '123' })console.log(data.value)console.log(other.is)// 这里须要留神,reactive的对象能够间接拜访,批改外部的子数据,而data须要应用.value拜访批改,如下data.value = '666' // okdata = '666' // noother.is = '666' // okother = '666' // no导入自定义组件在之前的optionApi中咱们应用的是components: { ... } 的形式导入自定义组件,而在当初,咱们只须要间接import组件即可应用 <template> <Button>OK!</Button></template><script setup> import Button from 'element-ui-plus'</script>自定义办法在之前的optionApi中咱们应用的是在methods中写自定义办法,而这里咱们间接定义一个办法或者变量,在template中间接应用即可 <template> <button @click="touchMe">OK!</button> <button @click="touchIt">OK!</button></template><script setup> import { ref, reactive } from 'vue' const text = ref('123') const touchMe = () => { text.value = '666' } function touchIt() { text.value = '666' }</script>个别状况下笔者倡议开发者都应用ref,因为ref适用范围更广。 ...

December 12, 2021 · 1 min · jiezi

关于uni-app:uniapp过滤器兼容全平台写法

过滤器过滤器是vue框架里格式化的性能,它十分不便,在原始的vue外面能够用于模板插值和组件属性 <div>{{ val | num(0) }}</div><div :id="val | num(0)"></div>当初的小程序广泛提供了一套脚本语言能够实现雷同的性能,比方微信的wxs,百度与字节的sjs。uni-app文档给的例子外面引入了多个版本的js文件,然而兼容性仍然不够好,而且齐全不兼容html-vue框架。 <script module="utils" lang="filter" src="./utils.filter.js"></script><script module="utils" lang="sjs" src="./utils.sjs"></script>其实在vue外面过滤器是注册在$options上的。依据这点,能够写出一种兼容所有平台的写法。 <!-- 模板插值与之前统一 --><div>{{ val | num(0) }}</div><!-- 属性赋值改为表达式 --><input :value="$options.filters.num(val, 0)"/><!-- 类名属性须要加上中括号 --><img :class="[$options.filters.num(val, 0)]"/>

December 3, 2021 · 1 min · jiezi

关于uni-app:uniapp框架如何实现仿微信相册插件-图视频编辑-压缩

在上上篇文章中(),咱们基于uniapp框架实现了仿微信相册中的拍照+录像性能。明天,就持续在uni-app中实现: 1: 图片编辑 2: 视频编辑 3: 文件压缩 成果预览: 技术实现开发环境:HbuilderX + nodejs技术框架:uniapp + vue2.x测试环境:App端(Android + IOS)、代码:开源 成果预览 业务剖析 这里次要是承接上次写的仿微信相册(https://segmentfault.com/a/11...)的持续扩大上来,对于插件而言,当用户点击图片非选区的地位的时候,插件会调用回调事件反馈点击编辑事件,具体如下: // 相册事件回调AlbumCallbackHanlder (res) { let { type, data } = res switch (type) { // 触发点击编辑图视频 case 'onClickEditImage': // 这里的data就是触发的文件门路 console.log(res); break; default: console.log(res) break; }}当咱们触发了编辑事件之后,咱们就能够开始调用api执行编辑图视频 编辑图视频编辑图视频相对来说简略,咱们只须要传入文件门路,插件本人外部会主动解析应该是编辑图片还是编辑视频,然而咱们提供的门路必须是原生可辨认的门路, 以 / 结尾。如果是非凡门路,能够应用plus自带的办法进行门路转换,具体如下: let localPath = plus.io.convertLocalFileSystemURL(path)引入插件对象 var sdkwx = uni.requireNativePlugin('Zhimi-EditImage');编辑图视频 // path 原文件门路// distPath 编辑后文件保留门路sdkwx.edit(path, distPath => { console.log(distPath)})这里其实很简略的就是传入门路之后就会弹出来文件编辑界面,然而不一样的是如果咱们编辑之后须要同步的更新到相册中,咱们须要调用以下办法:更新相册Item // 这里编辑实现之后调用,过后调用默认更新最初一次编辑的文件albumView.changeListEditImage(path)图片视频压缩在这里个别失去的是原图,原视频。随着当初手机设施的性能晋升,相机分辨率也随之晋升,拍进去的视频图片往往曾经超过了1080p的领域了,对于服务器来说压力十分在,在这里咱们能够通过插件内置的压缩模块压缩图片视频,一共有3种压缩形式。 引入压缩模块 var sdkwx = uni.requireNativePlugin('Zhimi-compression');压缩图片 ...

November 28, 2021 · 1 min · jiezi

关于uni-app:uniapp框架如何实现仿微信相册-图视频过滤相册选择功能

明天咱们分享基于uniapp + vue实现仿微信相册实例,该插件齐全还原了微信相册的性能 1: 相册抉择 2: 图片,视频类型过滤 3: 自定义相册界面UI 技术实现 开发环境:HbuilderX + nodejs技术框架:uniapp + vue2.x测试环境:App端(Android + IOS)代码:开源成果概览  界面布局这里仿微信相册界面次要还是款式为主,性能上应用了“智密相册-自定义原生相册”插件,应用插件实现相册的相干性能,而后咱们本人实现仿微信相册界面。这里布局代码次要如下 <view class="album-container" :style="{ paddingTop: statusBarHeight + 'px' }"> <!-- 顶部栏,用于显示按钮和下一步 --> <view class="album-title-bar"> <view class="album-title-bar__left" @click="doClear"> <image class="album-close-btn" src="../../static/icon_close.png" mode="widthFix"></image> </view> <view class="album-title-bar__center" @click="showAlbumSelect = !showAlbumSelect"> <view class="album-title-bar__center-album-btn"> <text class="album-title-bar__center-name">{{ albumName || '所有照片' }}</text> <view class="album-title-bar__center-arrow"> <image class="album-title-bar__center-arrow-inner" src="../../static/icon_arrow_down.png" mode="widthFix"></image> </view> </view> </view> <view class="album-title-bar__right" @click="doFinish"> <text class="album-title-bar__right-btn">下一步{{ selectedCount ? `(${selectedCount})` : '' }}</text> </view> </view> <!-- 插件自带的原生控件 --> <zhimi_album_view ref='albumView' class="album-elem" :class="{ 'show-album-ctx': !showAlbumSelect }"></zhimi_album_view> </view>这里有个重点,因为咱们去掉了原生的标题栏,这须要在pages.json中进行配置,具体配置如下 { "path": "pages/index/wxAlbum", "style": { "navigationStyle":"custom" }},相册控件初始化在这里咱们次要是操作原生控件“zhimi_album_view”提供的办法,首先咱们须要执行控件办法设置相册类型,回调事件,以及获取相册列表,具体如下设置回调事件 ...

November 13, 2021 · 2 min · jiezi

关于uni-app:关于uni-开发跨平台App的坑

1.uni.share()问题,分享图文时,图片不显示?解决办法:将图片大小进行解决,大概为20k,应用腾讯云oss 图片地址增加 '?imageView2/2/w/100/h/100/q/60',进行品质压缩,根本能够应用2.uni对于组件款式兼容微信小程序的坑//自定义组件 在微信小程序无奈失效的问题//须要在组件内减少属性 解决办法:export default { options: { styleIsolation: 'shared' }, //将属性失效至页面}3.对于uni-app input组件无奈监听 keyup.enter事件问题解决办法:<input class="search_input" type="text" placeholder-class="search_placeholder" placeholder="搜寻资讯题目,关键词" v-model="queryParams.keyword" confirm-type="search" @confirm="handleSearch" /> //最初一句confirm-type="search"最为重要4.对于uni 自适应 rpx 在ipad pro不失效问题解决办法:须要在pages.json中globalStyle字段下进行非凡配置 "globalStyle": { "navigationBarTextStyle": "white", "navigationBarTitleText": "uni-app", "navigationBarBackgroundColor": "#007AFF", "backgroundColor": "#FFFFFF", "rpxCalcMaxDeviceWidth": 960, // rpx 计算所反对的最大设施宽度,单位 px,默认值为 960 "rpxCalcBaseDeviceWidth":1024, // rpx 计算应用的基准设施宽度,设施理论宽度超出 rpx 计算所反对的最大设施宽度时将按基准宽度计算,单位 px,默认值为 375 "rpxCalcIncludeWidth": 750 // rpx 计算非凡解决的值,始终按理论的设施宽度计算,单位 rpx,默认值为 750}5.对于uni canvas各类问题canvas操作时 尤其是canvasGetImageData、canvasPutImageData 其width、height 特地留神 整数 以及 边界值 ,极有可能造成fail,在进行图片变色 canvasPutImageData时,在 微信小程序 兼容上会有通明局部 间接将底色笼罩景象,h5以及app失常,须要将图片信息获取之后 拼接到另一个canvas实现背景色浮现,uni.createCanvasContext(canvasId,this);uni.canvasGetImageData(Object,this);uni.canvasPutImageData(Object,this);三个 this 很重要,遗记增加 及其容易产生bug ...

September 27, 2021 · 1 min · jiezi

关于uni-app:uniapp-下拉刷新

"globalStyle": { // "enablePullDownRefresh": true // 开启全局下拉刷新 "pullToRefresh": { // 下拉款式 "support": true, "color": "#000000", "style": "circle" } }, "pages": [ { "path": "pages/home", "style": { // 开启单页刷新 "enablePullDownRefresh": true, } }, ]

September 24, 2021 · 1 min · jiezi

关于uni-app:uniapp的项目如何去掉顶端uniapp字样

1. 先看一下有uni-app字样的状况: 2. 没有uni-app字样: 3. 如何去掉在pages.json页面中退出 "titleNView": false 当然也能够批改uni-app的款式:文字改为“这里显示uni-app字样”,背景色改为“#007AFF”显示成果

August 15, 2021 · 1 min · jiezi

关于uni-app:uniapp开发App引导页

App的疏导页是当用户第一次关上一款App时所展现的3-5精美的图片,用于告知用户产品的性能及特点。好的疏导页会促使用户对产品减少更多的趣味,当然这是UI设计的能力体现了,只管很多人都会疾速的滑过。对于开发人员怎么去增加这几张图片只有在用户第一次关上app时展现呢。 其实原理很简略,在本地设置标识flag,默认为false,从而进入疏导页,进入之后,flag设置为true,下次进入天然不会展现的;当然这个疏导页能够设置为一个页面,用轮播图搁置几张疏导页;只有不革除本地的flag缓存,则疏导页只会呈现一次;以uniapp开发的我的项目为例:在onLaunch函数中,查看flag是否为false,如果为false,则跳转到疏导页面,在疏导页中可设置跳转到首页。留神,最好用reLaunch,防止,用户物理按键返回;为true,则存储flag到本地。原理既是如此;然而理论开发时,会发现,存在闪屏景象,这样用户的体验就不太好,所以比拟要害的中央就在于这块,还是以uniapp为例,须要在uniapp的源码视图下将splashscreen的设置进行批改,将autoclose改为false,在onLaunch中通过设置延迟时间调用plus.navigator.closeSplashscreen办法来敞开启动图。delay设置为0。这样启动图的设置就ok了。以下封装了查看是否进入疏导页的办法,仅供参考下: guidePage(){ try { // 获取本地存储中launchFlag标识 console.log(uni.getStorageSync('first_flag')) if(!uni.getStorageSync('first_flag')){//第一次进入app,为false // 进入疏导页 uni.reLaunch({ url:'/pages/GuidePage/GuidePage', }) } } catch(e) { //error // 设置为true uni.setStorageSync('first_flag', true); }}Tip: 在屡次的利用中发现,如果在手机自身比拟卡的状况下,用户在第一次开启app时,还是会存在首页在疏导页之前呈现,这种状况的解决形式是将疏导页默认设置为主页,即在路由治理中,将疏导页写在第一个,而后通过flag去判断是否跳转到首页;以上的疏导页开发只是提供一种思路,还有很多其余的形式,比方后端去管制是否展现疏导页,疏导页的动态变化。当然问题自身不难实现,关键在于理论利用时所存在的问题。

August 10, 2021 · 1 min · jiezi

关于uni-app:uniapp四步搞定支付

传统的开发领取须要前后端做很多工作,各种参数的解决,签名,秘钥的验证校验等,尤其是波及到多种不同的平台领取,更是繁琐;而且以往的领取是由后端主导的,如果后端是个菜鸡,那么做这个领取会相当累人,所以为了防止这种阻碍,前端只须要一个人就能搞定领取,uniapp的云开发提供了一种形式,一套代码兼容不同的领取形式,小程序,App,H5等一网打尽,最次要还收费。上面就介绍下这种无脑开发的领取形式有多简略,但前提是应用的框架要可能创立uniCloud云空间,否则下列的做法可能不适宜! 第一步:我的项目创立云空间; 在Hbuilderx中抉择我的项目,右键创立云开发环境,目前只有腾讯云和阿里云,阿里云是收费的,如果是仅仅做领取,阿里云是足够的;我的项目中如果曾经存在云空间,则不必创立;创立之后,会在cloundfunctions文件夹中含有common目录和database,common是搁置公共模块的目录,database是数据库相干的目录,只做领取的话,不波及到database目录; 第二步:引入uni-pay插件: 能够通过在插件市场引入或者npm的形式下载,当初次要说的是插件市场引入,引入之后,会在common目录下引入uni-pay模块,外面默认有index.js和package.json文件;之后再上传公共模块到服务空间; 第三步:云函数的创立及编写: 云函数的创立,在uniCloud/cloudfunctions中右键创立云函数,会默认生成index.js文件,是该云函数的入口文件;留神:云函数的创立同名,则会笼罩; 如果该云函数依赖某个公共模块的函数,须要装置该公共模块函数的依赖;如果uni-pay是通过uni_modules引入的,这时在云函数目录右键“治理公共模块依赖”,须要哪个公共模块,则抉择那个;依赖装置之后,在index.js中引入uni-pay;如果uni-pay是通过非uni_modules装置的,则须要先给该函数通过npm init -y生成package.json文件,再在该云函数中通过终端,执行npm install '须要引入的云函数模块门路'; 云函数的编写,以App的微信领取为例: 先要引入uni-pay; const unipay = require('unipay');再初始化unipay实例const unipayIns = unipay.initWeixin({ appId: 'your appId',//利用在对应领取平台的appId mchId: 'your mchId',//商户号 key: 'you parterner key',//领取秘钥 pfx: fs.readFileSync('/path/to/your/pfxfile'), // p12文件门路,应用微信退款时须要,须要留神的是阿里云目前不反对以相对路径读取文件,请应用绝对路径的模式})领取的参数,以app 的微信领取为例 exports.main = async function (event,context) { //event是客户端传过来的参数 let orderInfo = await unipayIns.getOrderInfo({ body: '商品形容', outTradeNo: '商户订单号', totalFee: 1, // 金额,单位分 tradeType:'APP' notifyUrl: 'https://xxx.xx' // 领取后果告诉地址 }) return { orderInfo }}第四步:客户端调用云函数 uniCloud.callFunction({ name: 'getOrderInfo', //这个name是须要调用的云函数名称 data:{},//领取所须要的参数,用于向云函数传递 success(res) { uni.requestPayment({ // #ifdef APP-PLUS provider: ‘wxpay’// App端此参数必填,能够通过uni.getProvider获取 // #endif // #ifdef MP-WEIXIN ...res.result.orderInfo, // #endif // #ifdef APP-PLUS || MP-ALIPAY orderInfo: res.result.orderInfo, // #endif ...res.result.orderInfo success(){ 返回领取后果 }, fail(){} }) }})至此,领取的流程曾经完结,付款后果会返回,如果须要查问订单,则须要调用unipayIns.orderQuery函数去查问了。 ...

August 10, 2021 · 1 min · jiezi

关于uni-app:uniapp项目瀑布流布局完美解决方案

预览图 应用教程间接复制代码 <hd-list/> 列表布局数据本人写 <template> <view class="waterfall-wrap"> <view class="waterfall-list"> <view class="left"> <hd-list :listData="item" v-for="(item,index) in goodsLeftList" :key="index" @onImageLoad="onImageLoad" ></hd-list> </view> <view class="right"> <hd-list :listData="item" v-for="(item,index) in goodsRightList" :key="index" @onImageLoad="onImageLoad" ></hd-list> </view> </view> </view></template><script>import hdList from "../component/hd-list.vue";export default { name: "waterfall", props: { listData: { type: Array, default: [] } }, components: { hdList }, watch: { /** * 监听listData数据 */ listData: { handler: function(data) { data.length > 0 && this.waterfallImage(); }, immediate: true } }, data() { return { goodsListCount: 0, //加载第i张图片 // 左侧商品列表 goodsLeftList: [], goodsLeftListHeight: 0, // 右侧商品列表 goodsRightList: [], goodsRightListHeight: 0 }; }, methods: { // 图片绑定事件,通过比拟左右列表高度,实现瀑布流展现 onImageLoad: function(e) { let divWidth = 342; //显示的单栏宽度,我设为342rpx let oImgW = e.detail.width; //图片原始宽度 let oImgH = e.detail.height; //图片原始高度 let rImgH = (divWidth * oImgH) / oImgW + 32; //依据宽高比计算以后载入的图片的高度 if (this.goodsListCount == 0) { this.goodsLeftListHeight += rImgH; //第一张图片高度加到goodsLeftListHeight this.goodsListCount++; //图片索引加1 this.goodsRightList.push(this.listData[this.goodsListCount]); //增加第二张图片到goodsRightList数组,因为第一张曾经初始化到左侧列表中 } else { this.goodsListCount++; //图片索引加1 if (this.goodsLeftListHeight > this.goodsRightListHeight) { //把图片的高度加到目前高度更低的栏中 this.goodsRightListHeight += rImgH; //第二张图片高度加到goodsRightListHeight } else { this.goodsLeftListHeight += rImgH; } if (this.goodsListCount < this.listData.length) { //依据目前的栏高,把下一张图片,push到低的那栏 if (this.goodsLeftListHeight > this.goodsRightListHeight) { this.goodsRightList.push(this.listData[this.goodsListCount]); } else { this.goodsLeftList.push(this.listData[this.goodsListCount]); } } } }, // 向商品列表增加第一张图片 async waterfallImage() { this.goodsListCount = 0; this.goodsLeftList.push(this.listData[0]); } }};</script>兼容性uni-app我的项目中应用都兼容 ...

August 4, 2021 · 1 min · jiezi

关于uni-app:uniapp导入企业微信sdk的血泪史

废话不多说,间接上后果 uni-app导入企业微信sdk办法: npm install wecomjsdkwecomjsdk文档地址:https://www.npmjs.com/package... 并且uni-app有个坑,就是uni-app有个内置的wx变量,所以要依照上面的办法改: //main.js//调用企业微信api的时候将wx换成$wximport wx from "wecomjsdk"Vue.prototype.$wx = wx这样就能在uni-app里引入胜利,失常调用企业微信的api了 感激这位大佬上传了这个企业微信sdk的npm版,把我从秃头的危机中拯救了进去....

July 19, 2021 · 1 min · jiezi

关于uni-app:uniapp自定义弹框uapopup组件增强版

组件介绍UA-Popup 一款基于 uniapp 开发的轻量级多端自定义弹框组件。反对超过20+参数配置、组件式+函数式两种调用形式。完满运行到h5+App端+小程序及Nvue原生组件页面。 如上图:兼容h5+小程序+App端,运行成果统一。 导入组件在main.js中全局引入组件。 import UAPopup from './components/ua-popup/index.vue'Vue.component('ua-popup', UAPopup)当然,也反对 easycom 模式。能够省略下面这一步导入。 反对组件式写法和函数调用两种形式。 组件式调用<!-- msg提醒 --><ua-popup v-model="showMsg" anim="fadeIn" content="上善若水,水利万物而不争" shadeClose="false" time="3" /><!-- 信息框 --><ua-popup v-model="showInfo" anim="scaleIn" content="阳光下人走不出本人的影子,光明中人看不见本人的影子。只有还有今天,明天就永远是起跑线。" :btns="[ {text: '晓得了', style: 'color:#999;', click: hideInfo}, ]"/> 函数式调用// 函数式嵌套调用handleInfo() { let $ua = this.$refs.uapopup let $toast = this.$refs.uatoast $ua.open({ content: '人生漫漫,且行且珍惜', customStyle: {'background-color': 'rgba(170, 0, 127, 0.6)', 'color': '#fff'}, time: 3, onClose() { $ua.open({ type: 'android', content: '<div style="color:#aa007f">预测将来的最好方法是本人亲手发明将来</div>', customStyle: {'width': '200px'}, zIndex: 202120, btns: [ { text: 'close', click() { $ua.close() } }, { text: 'Get一下', style: 'color:#00aa00;', click() { $toast.open({ type: 'toast', icon: 'loading', content: '请稍后...', opacity: .2, time: 2, zIndex: 202125, }) } } ] }) } })},handleBtnClick() { this.$refs.uapopup.open({ content: '正在操作中,请稍后...', shadeClose: false, anim: 'footer', customStyle: {'background-color': 'rgba(0, 170, 0, 0.6)', 'color': '#fff', 'border-radius': '6px'}, opacity: .1, time: 2, onClose: () => { this.$refs.uatoast.open({ type: 'toast', icon: 'success', content: '操作胜利', time: 2, }) } });}, ...

July 11, 2021 · 4 min · jiezi

关于uni-app:uniapp中使用echarts-时在h5中-tooltips无效的解决办法

版本信息echarts:5.1.2uniapp:3.1.8 起因:echarts 引入的时候,会优先判断以后的环境。 uniapp的又一个全局变量就叫做wx。导致这里的判断间接走第一个。 解决办法:在main.js中 window.wx = {}间接将wx从新赋值。

July 7, 2021 · 1 min · jiezi

关于uni-app:uniapp在编译多端时vfor在H5和小程序端编译结果不一致

在应用 v-for="number in productImage.cutCount"遍历一个数值时, <view v-for="number in productImage.cutCount"> <view>{{ number }}</view> </view>在微信小程序中,遍历进去的后果是 <view>0</view> <view>1</view> <view>2</view> <view>3</view> <view>4</view> 在H5中,遍历进去的后果是 <view>1</view> <view>2</view> <view>3</view> <view>4</view> <view>5</view>注意事项在H5平台 应用 v-for 循环整数时和其余平台存在差别,如 v-for="(item, index) in 10" 中,在H5平台 item 从 1 开始,其余平台 item 从 0 开始,可应用第二个参数 index 来保持一致。

June 17, 2021 · 1 min · jiezi

关于uni-app:uniapp自定义密码输入框

最近在用uni-app开发时遇到一个相似微信领取的明码框需要,要求:用户输出明码后主动向后跳转一个输入框,并且取得焦点,直到输出结束。用户删除时,删除完以后输入框的内容,再按一个“退格/删除”键,则主动往前跳一个输入框,并将其内容删除。成果如: 实现思路有且只能有一个input输入框 如果采纳一个方框用一个input输入框,在模拟器里没有什么问题,但在实在的手机中会呈现软件盘弹起不了问题。肉眼看到的输入框(方框)是虚构的,光标也是虚构的input输入框的大小与方框大小统一,字体大小保持一致,字体色彩为通明,设置字体色彩为通明后输入框的光标也会随之隐没光标挪动到哪个方框,input输入框也要随之挪动input输入框限度最多只能输出2个字符,如果只有一个字符则要在该字符后面补一个空格 因为要实现以后输入框的值删除掉后再按一个“退格/删除”键以后输入框的前一个输入框的值也要删除掉性能用户在方框中输出一个字符后,input输入框立刻挪动到下一个方框,并且清空input输入框删除行为,在input输入框中应用input事件来模仿“退格/删除”行为代码实现template <template> <view class="password-input-com" ref="passwordInputCom"> <input ref="passwordInput" v-model="inputValue" :focus="inputFocus" :style="{left: passwordInputLeft + 'px'}" type="text" maxlength="2" @input="onInput" @blur="onBlur" class="password-input"> <view class="virtual-input-list" ref="virtualInputList"> <view class="virtual-input-item" v-for="(item, index) in virtualInputs" :key="index" :class="{security: mask, 'input-focus': virtualInputItemIndex == index}" @click="onVirtualInputClick(index)"> <view v-if="!mask" class="text-viewer">{{item.value}}</view> <view v-show="item.value != ' ' && mask" class="security-mask"></view> <view class="virtual-input-cursor"></view> </view> </view> </view></template>javascript <script> export default { name: "PasswordInput", props: { value: { type: String, default: '' }, length: { // 明码最大长度 type: Number, default: 6 }, mask: { type: Boolean, default: false } }, data() { // 获取运行平台 let getPlatform = () => { let platform; // #ifdef H5 platform = 'H5'; // #endif // #ifdef MP-WEIXIN platform = 'mp-weixin'; // #endif // #ifdef MP-ALIPAY platform = 'mp-alipay'; // #endif return platform; } return { platform: getPlatform(), virtualInputs: [], // specialStr: '●', // 特殊字符 // splitStr: '★', // 宰割字符 inputValue: '', inputFocus: false, passwordInputLeft: 1, virtualInputItemIndex: -1, passwordInputComRect: { width: 0, height: 0, left: 0, right: 0 }, virtualInputItemRect: { width: 0, height: 0, left: 0, right: 0 } }; }, watch: { value: { immediate: true, handler(newVal){ this.calcVirtualInputs(newVal); } } }, methods: { // 计算须要输入框的个数 calcVirtualInputs(newVal){ let valueArr = ((newVal + '').length > 0 ? (newVal + '') : '●●●●●●●●●●●●●●●●●●●●●●●●').split(''); let length = this.length; // console.log('valueArr', valueArr) if(valueArr.length > length){ valueArr.splice(length); }else if(valueArr.length < length){ let lengthDiff = length - valueArr.length; while(lengthDiff > 0){ valueArr.push('●'); lengthDiff--; } } let virtualInputs = valueArr.map((str, index) => { return { value: str == '●' ? ' ' : str, focus: false, index: index }; }); this.virtualInputs = virtualInputs; }, onInput(evt){ // console.log(evt) let val = evt.detail.value; let virtualInputItemIndex = this.virtualInputItemIndex; console.log('onInput', val); if(val.length == 2){ // 以后虚构输入框输出值后立刻向后一个输入框挪动 this.virtualInputs[virtualInputItemIndex].value = val.charAt(1); if((virtualInputItemIndex + 1) < this.length){ this.virtualInputItemIndex = virtualInputItemIndex + 1; this.inputMoveTo(this.virtualInputItemIndex, () => { let nextVirtualInputVal = this.virtualInputs[this.virtualInputItemIndex].value; console.log('nextVirtualInputVal', nextVirtualInputVal) // 这里须要提早60毫秒再设置下一个虚构输入框的值,不然有效 let timer = setTimeout(() => { clearTimeout(timer); this.inputValue = nextVirtualInputVal == ' ' ? nextVirtualInputVal : (' ' + nextVirtualInputVal); console.log('this.inputValue', this.inputValue) }, 60); }); } this.$nextTick(() => { this.detectInputComplete(); }); } else if(val.length == 1){ console.log('length等于1', val) if(val == ' '){ // 以后操作为删除虚构框中的值 this.virtualInputs[virtualInputItemIndex].value = ' '; }else{ // 以后操作为正在输出 if((virtualInputItemIndex + 1) < this.length){ this.virtualInputItemIndex = virtualInputItemIndex + 1; this.inputMoveTo(this.virtualInputItemIndex, () => { let nextVirtualInputVal = this.virtualInputs[this.virtualInputItemIndex].value; let timer = setTimeout(() => { clearTimeout(timer); this.inputValue = nextVirtualInputVal == ' ' ? nextVirtualInputVal : (' ' + nextVirtualInputVal); console.log('this.inputValue2', this.inputValue) }, 60); }); } this.$nextTick(() => { this.detectInputComplete(); }); } } else if(val.length == 0){ // 往前一个输入框挪动,并删除其值 if(virtualInputItemIndex - 1 >= 0){ this.virtualInputItemIndex = virtualInputItemIndex - 1; this.inputMoveTo(this.virtualInputItemIndex, () => { this.virtualInputs[this.virtualInputItemIndex].value = ' '; // 这里须要提早60毫秒再设置下一个虚构输入框的值,不然有效 let timer = setTimeout(() => { clearTimeout(timer); this.inputValue = ' '; }, 60); }); } } }, onBlur(){ this.inputFocus = false; this.virtualInputItemIndex = -1; }, detectInputComplete(){ let length = this.length; let valStr = this.getValue(); console.log('detectInputComplete', valStr); if(length == valStr.length){ this.$emit('complete', valStr); } }, inputMoveTo(virtualInputIndex, cb){ console.log('inputMoveTo', virtualInputIndex) let passwordInputComRect = this.passwordInputComRect; let obj = uni.createSelectorQuery().in(this).selectAll('.virtual-input-item'); // 获取元素宽高 obj.boundingClientRect((rectData) => { console.log(rectData) let currentDomRect = rectData[virtualInputIndex]; console.log('currentDomRect', currentDomRect, virtualInputIndex, passwordInputComRect) // +1是因为有1px的左边框 this.passwordInputLeft = currentDomRect.left - passwordInputComRect.left + 1; typeof cb == 'function' ? cb() : 1; }).exec(); }, onVirtualInputClick(index){ console.log('onVirtualInputClick', index) let $passwordInput = this.$refs.passwordInput; this.inputMoveTo(index, () => { let virtualInputVal = this.virtualInputs[index].value; this.inputFocus = true; this.inputValue = virtualInputVal == ' ' ? virtualInputVal : (' ' + virtualInputVal); this.virtualInputItemIndex = index; if(this.platform == 'H5'){ this.$refs.passwordInput.$el.focus(); } }); }, getValue(){ let length = this.length; let valStr = this.virtualInputs.reduce((res, item) => { let itemVal = item.value.replace(/ /g, ''); return res += itemVal; }, ''); if(valStr.length > length){ valStr = valStr.substr(0, length); } return valStr; } }, mounted() { this.$nextTick(() => { let obj = uni.createSelectorQuery().in(this).select('.password-input-com'); // 获取元素宽高 obj.boundingClientRect((data) => { if(!data){ // 支付宝小程序获取不到地位信息 let systemInfo = uni.getSystemInfoSync(); let wh = systemInfo.windowWidth; let rpxCalcIncludeWidth = 750; let pagePaddingLeft = 48; data = { left: wh / 750 * 48 } }else{ this.passwordInputComRect = data; } console.log('组件宽高地位信息', data) }).exec(); }); } }</script>css ...

June 17, 2021 · 4 min · jiezi

关于uni-app:uniapp开发工具

uni-app开发应用到的工具栈 1、路由uni-simple-router路由守卫 npm install uni-simple-router --save-dev链接:https://hhyang.cn/v2/ 2、vuex npm install vuex --save-dev链接:https://vuex.vuejs.org/zh/guide/ 3、基于Promise开发的uni-app跨平台申请库 luch-request npm install luch-request --save-dev链接:https://www.quanzhan.co/luch-...

May 31, 2021 · 1 min · jiezi

关于uni-app:uniapp的安卓平台App本地离线打包流程

建设我的项目下载 HBuilderX,登录 dclould账号(必须)新建我的项目本地打包 打包后的文件 回到 上两层目录 待会须要复制整个 \_\_UNI\_\_354F6F0 目录 生成离线打包 Key具体方法: https://ask.dcloud.net.cn/art... 生成证书装置 JDK后输出以下命令 命令格局: keytool -genkey -alias 证书别名 -keyalg RSA -keysize 2048 -validity 证书的有效期 -keystore 证书文件名 留神: 输出上述命令后的第一个输出时明码,这个明码是证书的明码,必须记录,假如这里的明码是"leonardpwd"再输出一连串信息后他会问你是否正确,此时须要手动输出 "是"keytool -genkey -alias leonard-app -keyalg RSA -keysize 2048 -validity 36500 -keystore leonard-app.keystore查看证书keytool -list -v -keystore leonard-app.keystoreEnter keystore password: //输出明码,我的是下面设置的"leonardpwd",回车显示的信息相似下方文本,其中 证书指纹 的 SHA1 待会须要应用 输出密钥库口令:密钥库类型: PKCS12密钥库提供方: SUN您的密钥库蕴含 1 个条目别名: leonard-app创立日期: 2021年5月31日条目类型: PrivateKeyEntry证书链长度: 1证书[1]:所有者: CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown发布者: CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown序列号: a2ac5fd0886b0130失效工夫: Mon May 31 10:51:26 CST 2021, 生效工夫: Wed May 07 10:51:26 CST 2121证书指纹: SHA1: 99:23:00:18:40:20:D1:F3:41:D5:70:6D:38:94:56:58:68:C3:1E:33 SHA256: 8F:17:A9:63:3A:34:26:15:1C:6F:B8:30:D7:A4:59:42:99:F8:04:60:86:84:4C:83:B3:1E:C4:2E:F3:AA:EB:07签名算法名称: SHA256withRSA主体公共密钥算法: 2048 位 RSA 密钥版本: 3扩大:#1: ObjectId: 2.5.29.14 Criticality=falseSubjectKeyIdentifier [KeyIdentifier [0000: 88 41 F4 2F A9 C5 F4 68 86 D7 6E E9 D5 3D A9 F1 .A./...h..n..=..0010: A2 DF 3B 89 ..;.]]设置 Key关上 DCloud 开发者核心,并点击咱们的我的项目 ...

May 31, 2021 · 2 min · jiezi

关于uni-app:uniappunicloud诗歌起名小程序开发到上线

起名小程序 github地址 https://github.com/calvin008/...这是款uni-app + unicloud上线的起名小程序(诗歌起名) 1通过古诗词匹配生成姓名1.1创立我的项目1.2uni-app前端配置组件抉择 单选框 radio 输入框 input 按钮 button <view class="content"> <view class="radio-list"> <radio-group class="radio-group" @change="radioChange"> <label class="radio" v-for="(item, index) in array" :key="index"> <view style="display: flex; flex-wrap: nowrap;"> <radio :value="item" color="#000000" :checked="index === current" /> <view>{{ item }}</view> </view> </label> </radio-group> </view> <view class="form-item"> <image class="img" src="../../static/icon_search.png"></image> <input confirm-type="search" v-model="userName" focus placeholder="输出姓氏" /> <button class="button" type="primary" size="mini" @click="subName">起名</button> </view> <view class="name-list"> <view class="name-container" v-for="item in nameList" :key="item._id"> <view class="name-info"> {{userName}}{{item.name}} </view> <view class="sentence">[{{item.sentence}}]</view> <view class="name-other"> <view>{{item.book}} ● {{item.title}}</view> <view>[{{item.dynasty}}] {{item.author}}</view> </view> </view> </view>插入数据 ...

May 15, 2021 · 4 min · jiezi

关于uni-app:uniapp-video标签打包H5Android上支持播放m3u8-hls直播流

默认uni-app打包进去的H5在Android上是没法播放.m3u8直播流的,控制台或报错 Uncaught (in promise) DOMException: The element has no supported sources.能够用hls.js来解决,在App.vue的onLaunch办法中减少加下列代码即可: // 上面的代码减少对Android H5播放m3u8反对// #ifdef H5if (uni.getSystemInfoSync().platform != 'ios') { var script = document.createElement("script"); script.src = "https://cdn.jsdelivr.net/npm/hls.js@latest"; script.onload = function() { let init = function(video) { if (!video.getAttribute('hls-inited')) { let hls = null; let load = function() { let src = video.src; if (!src || src.indexOf('.m3u8') < 0) return if (!hls) { hls = new Hls(); hls.attachMedia(video); } hls.loadSource(src); } video.addEventListener("error", function() { load(); }, false); video.addEventListener("DOMNodeRemovedFromDocument",function(){ if(hls){ hls.destroy() } }, false); video.setAttribute('hls-inited', 'ok'); } } document.getElementsByTagName("video").forEach(init) document.body.addEventListener("DOMNodeInserted", function(e) { let ele = e.relatedNode; if (ele.tagName === 'VIDEO') { init(ele); } ele.getElementsByTagName("video").forEach(init) }) } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(script, s);}// #endif

May 10, 2021 · 1 min · jiezi

关于uni-app:uniapp-选择图片上传到服务器云储存

1、抉择图片到node服务器uni-app代码 uni.chooseImage({ success: (res) => { let tempFilePaths = res.tempFilePaths; tempFilePaths.forEach((item) => { uni.uploadFile({ url: '', //服务器地址 fileType: "image", //ZFB必填,不然报错 filePath: item, //这个就是咱们下面拍照返回或者先中照片返回的数组 name: 'file', success: (uploadFileRes) => { } }); }) }});node服务代码 const path = require("path"); //导入path模块const multer = require("multer"); //导入multer模块const fs = require("fs"); //导入文件操作模块const util = require("../public/util");const upload = multer({ dest: "tmp/" });let express = require("express");let router = express.Router();router.post("/upload", upload.single("file"), function (req, res) { let imgFile = req.file; //获取图片上传的资源 var tmp = imgFile.path; //获取长期资源 let ext = path.extname(imgFile.originalname); //利用path模块获取 用户上传图片的 后缀名 let newName =util.getNowFormatDate('-','-')+ "-"+new Date().getTime() + Math.round(Math.random() * 10000) + ext; //给用户上传的图片重新命名 避免重名 let newPath = "/public/images/" + newName; //给图片设置寄存目录  提前给以后文件夹下建设一个   images文件夹  !!!! let fileData = fs.readFileSync(tmp); //将上传到服务器上的长期资源 读取到 一个变量外面 let filePath = path.join(__dirname, '..'+newPath); fs.writeFileSync(filePath, fileData); //从新书写图片文件  写入到指定的文件夹下 res.send(newPath); //上传胜利之后  给客户端响应});router.get('/public/images/*', function (req, res) { let newPath = ".."+req.url; let filePath = path.join(__dirname,newPath); res.sendFile(filePath);})module.exports = router;2、抉择图片到云贮存uni.chooseImage({ success: (res) => { let tempFilePaths = res.tempFilePaths; tempFilePaths.forEach((item) => { uniCloud.uploadFile({ filePath: item, cloudPath: 'item.jpg', success(res) { }, fail(res) { }, complete() {} }); }) }});

April 2, 2021 · 1 min · jiezi

关于uni-app:如何在Uniapp中访问CabloyJS后端API管理系统

介绍CabloyJS是一款收费开源的NodeJS全栈开发框架,采纳前后端拆散设计,具备开箱即用的后盾管理系统 Cabloy-SDK是专门为Uniapp利用量身定制的前端SDK,用于便捷的拜访CabloyJS提供的所有API接口,让Uniapp前端开发再无后顾之忧 个性各个平台的小程序后端API零碎,最简单的就是账号体系对接。CabloyJS提供了一个模块化的生态,须要开发什么平台下的小程序利用,只需装置相应的模块即可 目前Cabloy-SDK反对以下平台小程序的开箱即用: 微信小程序企业微信小程序钉钉小程序如何应用 - 前端1. 导入插件进入Uniapp插件页面,点击按钮应用HBuilderX导入插件,将Cabloy-SDK插件导入Uniapp我的项目中 强烈建议下载示例我的项目查看插件的根本用法2. 批改main.js在main.js文件中增加如下代码: import Vue from 'vue'import App from './App'import Cabloy from './js_sdk/cabloy-sdk/main.js'// 初始化cabloyconst cabloyOptions = { base: { scene: 'default', locale: 'en-us', }, api: { baseURL: 'https://yourdomain.com', },}Vue.prototype.$cabloy = Cabloy(Vue, cabloyOptions)// 登录Vue.prototype.$cabloy.util.login().then(res => { // 因为 login 是网络申请,可能会在 Page.onLoad 之后才返回 // 所以此处退出 callback 以避免这种状况 if (Vue.prototype.$cabloy.__loginReadyCallback) { Vue.prototype.$cabloy.__loginReadyCallback(res); }}).catch(err => { console.log(err)})Vue.config.productionTip = falseApp.mpType = 'app'const app = new Vue({ ...App})app.$mount()首先要初始化一个cabloy实例,并保留至Vue.prototype.$cabloy,便于在所有Vue组件中援用其次调用cabloy.util.login进行登录cabloyOptions名称阐明base.scene小程序场景名,默认为defaultbase.locale前端默认应用的语言api.baseURL后端服务的API地址base.scene:CabloyJS后端能够反对创立多个小程序,前端通过此参数设置要对接的小程序场景名,默认为default3. API清单插件Cabloy-SDK次要提供了以下API组件 ...

January 24, 2021 · 1 min · jiezi

关于uni-app:开发日记01-uniapp-使用等宽字体对齐数字宽度

uni-app 应用等宽字体对齐数字宽度0️ 问题 ❓开发的过程中遇到数字显示列表,发现同样的数字数宽度不一。android 不会有, web 浏览器和 ios 会呈现。 之前也有遇到过,也解决了,写过文章记录 在网站中应用谷歌“ROBOTO”字体(解决 ios 数字 1 和 0 大小不等宽问题),不过文章没有明确的代码,也比拟潦草,这次加上代码。 本次解决方案不仅仅实用于 uni-app,包含 nvue, 还有一般的 vue react 我的项目都能用。晓得原理了,移植解决方案很简略。 起因:默认或者应用了非等宽字体,安卓默认的字体 Roboto 就是等宽的,啥叫非等宽,就是字体的宽度不一样,比方 1 和 2 在显示的时候所占用的宽度不一样。(中文字体默认就是等宽的) <img src="https://image.yoouu.cn/2021/dev-diary01/img1.jpg" style="zoom: 50%;" /> 解决后: 看起来难受了很多 ???? <img src="https://image.yoouu.cn/2021/dev-diary01/img2.jpg" style="zoom: 50%;" /> 1️ 下载须要的字体链接:https://www.fontsquirrel.com/fonts/roboto 抉择 Webfont KitChoose a Subset 默认就行Choose Font Formats 默认的 WOFF就行点击 Download @font-face Kit关上压缩包应用 roboto_regular_macroman/Roboto-Regular-webfont.woff2️ 在 uni-app 中应用本次测试了 app,h5 端,其余端未测试,实践通用。 将下载的 Roboto-Regular-webfont.woff 放在 我的项目的 static/fonts/Roboto-Regular-webfont.woff ...

January 6, 2021 · 2 min · jiezi

关于uni-app:uniappuView结合input使用icon点击icon不生效

1.开发环境 uni-app+uView2.电脑系统 windows10专业版3.在应用uni-app+uView开发的应用,咱们常常会联合input应用icon,上面我来分享遇到的问题和解决办法,心愿对你有所帮忙。4.废话不多说,间接上效果图: 你在点击扫码图标的时候可能不会触发对应的事件5.造成问题的起因,在这里我应用绝对定位把图标放到了这个地位,同时给这个图标的父元素配置了position: relative;然而这样就会造成图标元素的层级问题,如何解决呢?办法如下: //给这个 图标晋升层级(使点击的时候,能点到这个元素).chen-icon { position: absolute; margin-left: 2%; z-index: 1;//要害代码}6.本期的分享到了这里就完结啦,心愿对你有所帮忙,让咱们一起致力走向巅峰!

January 5, 2021 · 1 min · jiezi

关于uni-app:uniscanCode无法重新赋值

1.开发环境 uni-app+uView2.电脑系统 windows10专业版3.在应用uni-app+uView开发的过程中,咱们在应用 uni.scanCode进行扫码的时候无奈进行从新赋值,上面我来分享一下解决办法,心愿对你有所帮忙。4.废话不多说,间接上代码: Equipmentcheck() { uni.scanCode({ success: function (res) { console.log("条码内容:" + res.result); this.chenwen=res.result; uni.showToast({ title: "扫码胜利", });},fail: function (err) { console.log("扫码失败", err); }, });},5.在return 中增加如下代码: chenwen:""6.你会发现在手机上本页面,扫码进去的数据,无奈赋值给标签,造成这个问题的起因是 this 指向产生了变动,解决办法如下。7.针对上述呈现的问题,解决办法如下: //办法一:Equipmentcheck() { const _this=this; uni.scanCode({ success: function (res) { console.log("条码内容:" + res.result); _this.chenwen=res.result; uni.showToast({ title: "扫码胜利", });},fail: function (err) { console.log("扫码失败", err); }, });},//办法二: 应用箭头函数Equipmentcheck() { uni.scanCode({ success: res=> { console.log("条码内容:" + res.result); this.chenwen=res.result; uni.showToast({ title: "扫码胜利", });},fail: function (err) { console.log("扫码失败", err); }, });},8.本期的分享到了这里就完结啦,是不是很nice,心愿对你有所帮忙,让咱们一起致力走向巅峰! ...

January 4, 2021 · 1 min · jiezi

关于uni-app:uniappuView优雅的使用flex

1.开发环境 uni-app+uView2.电脑系统 windows10专业版3.在应用uni-app+uView开发的过程中,咱们常常会应用到flex进行布局,上面我来分享一下如何优雅的应用。4.废话不多说,间接上代码: <u-row gutter="16" justify="space-between"> <u-col span="3"> <view></view> </u-col> <u-col span="9"> <view></view> </u-col></u-row> //在这里咱们间接能够应用 u-row,而后增加 justify 属性,依据需要进行不同的配置,这样咱们就不必再写一个 view 而后再设置款式5.本期的分享到了这里就完结啦,心愿对你有所帮忙,让咱们一起致力走向巅峰!

December 30, 2020 · 1 min · jiezi

关于uni-app:uniapp新增步骤条不知道有多少步骤

1.开发环境 uni-app+uView2.电脑系统 windows10专业版3.在应用 uni-app+uView开发的过程中,咱们常常在新增的时候新增步骤,然而不晓得有多少步骤,因而不能写死,上面我来分享一下我的办法,心愿对你有所帮忙。4.废话不所说,间接上代码,在 return 中增加如下代码: projectstepsObj:{ num:"0", chenarr:[], con:"", }, chenarrObj:{ num:0, id:"", con:"" }5.在新增事件中增加如下代码: chenfonts(){ this.projectstepsObj.num+=1; this.chenarrObj.num=this.projectstepsObj.num; this.chenarrObj.id=this.projectstepsObj.num; this.chenarrObj.con=""; this.projectstepsObj.chenarr.push(this.chenarrObj); // console.log(this.projectstepsObj.chenarr); }6.在template中增加如下代码: <u-form-item v-for="(item,index) in projectstepsObj.chenarr" :key="index" :label="'我的项目第'+`${index+1}`+'步'"> <u-input v-model="item[index]" /> </u-form-item>7.在提交办法中增加如下代码: chensubmit() { console.log("++++++"); console.log(this.chenarrObj); console.log("--------");}8.成果如下:9.本期的分享到了这里就完结啦,心愿对你有所帮忙,让咱们一起致力走向巅峰!

December 29, 2020 · 1 min · jiezi

关于uni-app:vfor循环动态绑定vmodel

1.开发环境 uni-app+uView2.电脑系统 windows10专业版3.在应用 uni-app开发的过程中,咱们会遇到vue在循环的时候须要动静绑定不同的v-model,上面我来分享一下办法,对你有所帮忙。4.废话不多说,间接上代码: <u-form-itemv-for="(item,index) in projectstepsObj.chenarr" :key="index" :label="'我的项目第'+`${index+1}`+'步'"> <u-input v-model="item[index]" /></u-form-item>5.本期的分享到了这里就完结啦,是不是很nice,心愿对你有所帮忙,让咱们一起致力走向巅峰!

December 29, 2020 · 1 min · jiezi

关于uni-app:uniapp调用手机摄像头进行扫码

1.开发环境 uni-app+uView2.电脑系统 windows10专业版3.在应用 uni-app+uView开发的过程中,咱们常常会应用到手机进行扫码,上面我来分享一下应用uni-app如何进行手机扫码,心愿对你有所帮忙。4.在 template中增加如下代码: <view class="chen-orders chenshebei" @click="Equipmentcheck"> <u-icon name="scan" color="#2979ff" size="108"></u-icon> <text>设施点检</text> </view>5.在 methods中增加如下代码: Equipmentcheck() { uni.scanCode({ success: function (res) { //胜利之后的回调 console.log('条码内容:' + res.result); // res.result 二维码的内容 uni.showToast({ title: res.result, }); }, fail: function (err) { //失败之后的回调 console.log("扫码失败", err); }, }); },6.本期的剖析到了这里就完结啦,是不是很nice,心愿对你有所帮忙,让咱们一起致力走向巅峰!

December 23, 2020 · 1 min · jiezi

关于uni-app:uView中吸顶使用

1.开发环境uni-app+uView2.电脑系统 windows10专业版3.在应用 uni-app+uView开发的过程中,咱们常常会应用到各种性能,上面我来分享一下,uni-app+uView中如何应用吸顶和遇到的问题!心愿对你有所帮忙!4.在template中增加如下代码: <!-- 吸顶内容 --> <view id="chenceiling"> <u-sticky offset-top="0"> <!-- 搜寻性能 --> <view class="chen-search"> <u-search placeholder="请输出客户名称/联系电话/公司名称" :clearabled="true" @custom="chensearch" v-model="keyword" ></u-search> </view> <!-- 搜寻性能 完结啦 --> <!-- 新增 --> <view class="chen-add" @click="chenadd"> <u-icon name="plus-circle"></u-icon> </view> <!-- 新增 完结啦 --> </u-sticky> </view> <!-- 吸顶内容 完结啦 --> //留神:这个 offset-top="0" 是间隔顶部的间隔,也是间隔顶部多少间隔的时候开始吸顶5.如何自定义吸顶模板的色彩呢,在css中增加如下代码: #chenceiling { //u-sticky-wrap u6zTsRZKbLyLFJ0S5VVMfiXblSXCLc2F /deep/ .u-sticky-wrap { background: blue; /deep/ .u-sticky { background: blue; } } } //留神:我在这里应用的是 scss 语法,看到这里的小伙伴都是会 scss 语法的,如果还不会 scss 语法的小伙伴倡议去学习一下!6.本期的分享到了这里就完结啦,心愿对你有所帮忙,让咱们一起致力走向巅峰! ...

December 18, 2020 · 1 min · jiezi

关于uni-app:uniapp中scss的简单使用

1.开发环境 uni-aapp+scss2.电脑系统 windows10专业版3.在试验uni-app开发的过程中,咱们可能会应用到scss,上面我来分享一下scss简略的应用,心愿对你有所帮忙!4.如果你的我的项目中有几处小小的款式相似(例如统一的色彩和字体),那么应用变量来对立解决这种状况是十分不错的抉择。然而当你的款式变得越来越简单,你须要大段大段的重用款式的代码,独立的变量就没方法应酬这种状况了。你能够通过sass的混合器实现大段款式的重用。混合器应用@mixin标识符定义,下边的这段sass代码,定义了一个混合器,目标是应用flex布局。 在 uni.scss中增加如下代码:@mixin chenflex { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap;}5.在应用的模板中增加如下代码: .title-wrap{ width: 100%; height: 100rpx; background-color: #ccc; padding: 10rpx; box-sizing: border-box; @include chenflex; //应用办法 }6.本期的分享到了这里就完结啦,是不是很nice,心愿对你有所帮忙,让咱们一起致力走向巅峰!!!

December 16, 2020 · 1 min · jiezi

关于uni-app:UNIAPP-实践问题记录

UNI-APP 实际问题记录最近须要将一个原来vuejs 技术栈的 挪动端业务革新小程序,基于老本和工夫的思考,抉择了 uni-app ,一开始间接将旧代码迁入到新的工程里。在逐渐开发过程中,遇到了一些问题,整顿记录一下,当然这些问题可能只是在咱们我的项目特定场景、特定状况下呈现的,仅供参考,提供一个思路。 语法问题编译后,WXML提醒 bad attrs 在于template中写了个短路运算,v-if="false && item.count > 1" (之前次要是为了避免产品又要改回来,加了短路运算)。 解决方案:删除短路运算相干代码 v-show 判断问题v-show 在数据表达式条件成立后,体现后果谬误。 v-show="count > 0", 当count > 0的时候,v-show对应的el 仍旧没有显示进去。 解决方案: v-show 改为 v-if 自定义配置自定义构建配置咱们须要将小程序中用到的图片、字体构建到cdn 服务中,而不是打包在小程序代码中,所以须要批改构建工作流。 在官网文档中,反对 vue.config.js来配置一些 webpack 工作流。 对于图片、字体等默认是会对小于40KB进行base64。 因为vue-cli 中,字体、图片等用的是 url-loader,所以为了将图片、字体构建到cdn种,须要在 vue.config.js 中配置 url-loader, url-loader fallback 到 file-loader。 先看下残缺配置 // vue.config.js'use strict'const path = require('path')const isWin = /^win/.test(process.platform)const isProd = process.env.NODE_ENV === 'production'const normalizePath = (path) => (isWin ? path.replace(/\\/g, '/') : path)const extConfig = require('./src/ext.json')function resolve(dir) { return path.join(__dirname, dir)}// 配置H5 跨域const devServer = { target: 'your.domain.com', // 重要 changeOrigin: true, pathRewrite: { '^/': '' }, // 重要 secure: false, prependPath: true, onProxyReq: function (proxyReq, req, res) { },}module.exports = { // 门路别名 chainWebpack: (config) => { /* .resolve.alias .set('@', resolve('src')) .set('@p', resolve('src/pages')) .set('@c', resolve('src/components')) .set('@a', resolve('src/assets')) .set('@utils', resolve('src/utils')) .end() .extensions.add('.js') .add('.vue') .add('.scss') .end() .end() */ config.module .rule('vue') .test([/\.vue$/, /\.nvue$/]) .use('vue-loader') .tap((options) => Object.assign({}, options, { // 配置 小程序image标签的src 也进行资源门路转换 transformAssetUrls: { image: 'src', }, }), ) .end() if (isProd) { config.module .rule('images') //.test(/\.(png|jpe?g|gif|svg)(\?.*)?$/) .use('url-loader') .tap((args) => { const newArgs = Object.assign({}, args, { // 配置转换规则,-1 示意任何大小的资源都不进行base64转换 limit: -1, // 这里重要,publicPath 配置给url-loader 会不失效,必须配置到fallback里传递给file-loader fallback: { loader: 'file-loader', options: { publicPath(url, resourcePath, context) { return ( extConfig.ext.publicPath + normalizePath(path.relative(process.env.UNI_INPUT_DIR, resourcePath)) ) }, emitFile: false, }, }, }) return newArgs }) .end() .end() .rule('fonts') .use('url-loader') .tap((args) => { const newArgs = Object.assign({}, args, { limit: -1, fallback: { loader: 'file-loader', options: { publicPath(url, resourcePath, context) { return ( extConfig.ext.publicPath + normalizePath(path.relative(process.env.UNI_INPUT_DIR, resourcePath)) ) }, emitFile: false, }, }, }) return newArgs }) } }, devServer: { disableHostCheck: true, proxy: { '/api': devServer, }, },}另外,uni-app 中 门路别名默认 @ 指向 src目录,如果配置了其余自定义别名,比方下面配置中的 @c会导致编译的时候无奈正确辨认 @c 援用的资源。 ...

December 10, 2020 · 2 min · jiezi

关于uni-app:uniapp中子组件调用父组件的方法

1.开发环境 uni-app+uView2.电脑系统 windows10专业版3.在应用uni-app+uView开发的过程中,咱们可能会须要在子组件中调用父组件的办法,上面我来做一个分享,心愿对你有所帮忙!4.在父组件中增加事件,在methods中增加代码如下: gochencheckedxq(){ console.log("我要去审核详情页"); uni.navigateTo({ url: "../../pages/entrustchenckxq/entrustchenckxq", }); }5.在父组件中应用子组件,在template中增加如下代码: <entruscheck v-on:Chencheckedxq="gochencheckedxq"></entruscheck>6.在子组件中,须要增加事件的元素上,增加如下代码: <u-button :ripple="true" ripple-bg-color="#909399" @tap="gochencheckedxq">详情</u-button>7.在子组件中增加 gochencheckedxq 事件,代码如下: gochencheckedxq(){ this.$emit("Chencheckedxq"); } //应用 this.$emit进行触发 父组件事件8.本期的分享到了这里完结啦,是不是很nice,心愿对你有所帮忙,让咱们一起致力走向巅峰!

December 10, 2020 · 1 min · jiezi

关于uni-app:UNIAPP使用云开发跨全端开发实战讲解

UNI-APP 是一个应用 Vue.js 开发所有前端利用的框架,开发者编写一套代码,可公布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)、快利用等多个平台。 本文为大家解说如何采纳云开发官网JS-SDK,接入云开发后端服务并反对UNI-APP全副端(不止于微信小程序) JS-SDK和UNI-APP适配器1.JS-SDK和适配器云开发官网提供的@cloudbase/js-sdk,次要用来做惯例WEB、H5等利用(浏览器运行)的云开发资源调用,也是目前最为欠缺的客户端SDK。 目前市面上大部分的轻利用、小程序包含挪动利用APP都是采纳JS来作为开发语言的,所以咱们能够对TA进行轻微革新,就能够轻松应用在各种平台中。 然而独自革新SDK包会有些许危险,比方在原SDK包降级时须要从新结构,就造成了无穷无尽的麻烦,革新老本相当大。 官网的产品小哥哥深知这种不适和苦楚,所以在@cloudbase/js-sdk 中提供一套残缺的适配扩大计划,遵循此计划标准可开发对应平台的适配器,而后搭配 @cloudbase/js-sdk 和适配器实现平台的兼容性。 不理解的小伙伴必定会有些茫然,我来用通俗的语言解释一下,就是@cloudbase/js-sdk 将底层的网络申请以及相干根底需要以接口的模式裸露进去,咱们依照平台的非凡API来补充这些接口,sdk就能够依据这些补充的接口,无障碍的运行在平台中了。 如果咱们想在UNI-APP中应用@cloudbase/js-sdk ,底层网络申请你须要来补充,因为sdk本来是适应浏览器的,TA不晓得UNI-APP怎么对外发申请,所以你须要将uni.request 办法补充到TA裸露的接口中。补充结束后,@cloudbase/js-sdk 就能够在UNI-APP中活跃的运行了。 咱们将所有的uni办法全副补充到JS-SDK暴漏的接口中去,就造成了一个残缺的适配器,咱们将其成为uni-app适配器。 2.UNI-APP适配器UNI-APP的整体接口都是公开通明的,咱们在开发UNI-APP时也都遵循同一套接口标准。所以小编曾经将uni-app适配器制作结束,大家只须要在应用时接入适配器就能够了。 咱们在我的项目目录main.js中引入云开发JS-SDK,而后接入咱们的UNI-APP适配器即可。 import cloudbase from '@cloudbase/js-sdk'import adapter from 'uni-app/adapter.js'cloudbase.useAdapters(adapter);cloudbase.init({ env: '',//云开发环境ID appSign: '',//凭证形容 appSecret: { appAccessKeyId: 1,//凭证版本 appAccessKey: ''//凭证 }})挪动利用登录凭证云开发SDK在应用过程中,向云开发服务零碎发送的申请都会须要验证申请起源的合法性。 咱们惯例 Web 通过验证平安域名,而因为 UNI-APP 并没有域名的概念,所以须要借助平安利用凭证辨别申请起源是否非法。 登录云开发 CloudBase 控制台,在平安配置页面中的挪动利用平安起源一栏: 点击“增加利用”按钮,输出利用标识:uni-app(也能够输出其余有标志性的名称),须要留神利用标识必须是可能标记利用唯一性的信息,比方微信小程序的 appId 、挪动利用的包名等。 增加胜利后会创立一个平安利用的信息,如下图所示: 咱们须要保留一下上图中的版本(示例为1)、利用标识(示例为uni-app)、以及点击获取到的凭证(示例为demosecret) 在我的项目目录中,咱们将main.js中的init局部补全 import cloudbase from '@cloudbase/js-sdk'import adapter from 'uni-app/adapter.js'cloudbase.useAdapters(adapter);cloudbase.init({ env: 'envid',//云开发环境ID,保障与你操作登录凭证统一 appSign: 'uni-app',//凭证形容 appSecret: { appAccessKeyId: 1,//凭证版本 appAccessKey: 'demosecret'//凭证 }})如此,你就能够失常的进行云开发的登录应用了。 ...

December 9, 2020 · 2 min · jiezi

关于uni-app:uniappuView重置表单

1.开发环境 uni-app+uView2.电脑系统 windows10专业版3.在应用uni-app+uView开发的过程中,咱们在提交实现之后会进行表单的重置,上面我来分享一下,uni-app+uView表单重置的办法,心愿对你有所帮忙!4.在return中代码如下: chenwtdaddform: { wtdh: "", wtpeople: "", wtpeoplephone: "", wtypname: "", wtyptm: "", bt: "", content: "", addresscon: "", mode: "range", show: false, show2: false, chenvalue:0 },5.页面成果如下:6.我在提交的时候清空表单,在事件中增加如下代码: this.chenwtdaddform=this.$options.data().chenwtdaddform;//在点击提交的时候,把之前存在 data里的chenwtdaddform原始值拷贝一份,而后从新赋值给 chenwtdaddform7.本期的分享到了这里就完结啦,是不是很nice,心愿对你有所帮忙,在成长的到了上心愿你不要认输,不要抬头,不要放弃,加油,让咱们一起致力走向巅峰!

December 9, 2020 · 1 min · jiezi

关于uni-app:uniapp使用uninavigateTo进行页面传值

1.开发环境 uni-app+uview2.电脑系统 windows10专业版3.在应用uni-app+uview开发的过程中,咱们分享一下uni.navigateTo办法进行页面传值,心愿对你有所帮忙!若有不对的中央,请多多指教!4.废话不多说,间接上代码,在template中增加如下代码: <view class="chenwtdadd"> <u-form :model="chenwtdaddform" ref="chenwtdaddform" id="chenwtdaddform"> <u-form-item label="委托单号:" ><u-input v-model="chenwtdaddform.wtdh" /></u-form-item> <u-form-item label="委托人:" ><u-input v-model="chenwtdaddform.wtpeople" /></u-form-item> <u-form-item label="联系电话:" ><u-input v-model="chenwtdaddform.wtpeoplephone" /></u-form-item> <u-form-item label="样品名称:" ><u-input v-model="chenwtdaddform.wtypname" /></u-form-item> <u-form-item label="样品条码:" ><u-input v-model="chenwtdaddform.wtyptm" /></u-form-item> <u-form-item label="委托日期:"> <u-calendar v-model="chenwtdaddform.show" :mode="chenwtdaddform.mode" @change="change" ></u-calendar> <u-input v-model="chenwtdaddform.content" @click="chenformdate" /> </u-form-item> <u-form-item label="委托地址:"> <u-select v-model="chenwtdaddform.show2" mode="mutil-column-auto" :list="list" @confirm="confirm" ></u-select> <u-input v-model="chenwtdaddform.addresscon" @click="chenformaddress" /> </u-form-item> <u-form-item label="备注:"> <u-input v-model="chenwtdaddform.bt" /> <!-- <textarea rows="20" /> --> </u-form-item> </u-form> <view class="chensubmit"> <u-button shape="square" :ripple="true" ripple-bg-color="#909399" @click="chensubmit" >提交</u-button > </view> </view>5.在return中增加如下代码: ...

December 9, 2020 · 2 min · jiezi

关于uni-app:uniappuview使用Calendar-日历

uni-app+uview应用Calendar 日历1.开发环境 uni-app+uview2.电脑系统 windows10专业版3.在应用uni-app+uview开发的过程中应用Calender日期组件遇到的坑,上面是我做的分享,心愿对你有帮忙!4.uni-app+uview应用Calendar 日历遇到的坑,款式错乱,成果如下: 遇到问题不要怕,没有什么解决不了的,要置信本人!我简略的分享一下我的办法,看看渲染的dom构造,看看css款式是否失效,心愿对你有多帮忙!这个错乱的成果是因为,日历组件的 弹性盒子的款式没有失效,所以到导致了页面错乱。5.解决办法,在css款式中增加如下代码: /deep/ .u-calendar__action{ display: flex; justify-content: space-between; align-items: center; }6.成果如下:7.本期的分享到了这里就完结啦,是不是很nice,心愿对你有所帮忙,让咱们一起致力走向巅峰!

December 7, 2020 · 1 min · jiezi

关于uni-app:uninavigateTo不能跳转的问题

碰到uni.navigateTo办法不能跳转,咱们先应用fail函数来找出错误信息 uni.navigateTo({ url:"saveUserProfile", fail: (res) => { console.log(res)//打印错误信息 } })提醒办法无奈找到页面,那可能是之前页面没有在配置文件定义该页面的门路,找到uniapp配置文件pages.json,退出配置门路: { "path" : "pages/my/saveUserProfile", "style" : { "navigationBarTitleText": "保留用户信息" } } 再次运行,胜利跳转。

December 4, 2020 · 1 min · jiezi

关于uni-app:uniapp打包后提示本应用使用HBuilderX-297或对应的cli版本编译解决方案

1.开发环境 uni-app2.电脑系统 windows10专业版3.在uni-app开发的过程中,咱们在我的项目实现之后,打包app运行到手机上之后,正告:uni-app打包后提醒,本利用应用HBuilderX 2.9.7或对应的cli版本编译,而手机端SDK版本是2.9.10。不匹配的版本可能造成利用异样。上面我来分享一下解决办法,心愿对你有所帮忙!4.uni-app打包app,运行到手机上,报错如下:5.解决办法如下: 能够在manifest.json文件的源码视图中配置疏忽这个揭示,形式如下:"app-plus": { "compatible": { "ignoreVersion": true //true示意疏忽版本查看提示框,HBuilderX1.9.0及以上版本反对 }, }, 以下办法可针对指定版本防止弹出提示框"app-plus": { "compatible": { "runtimeVersion": "1.7.0", //依据理论状况填写 "compilerVersion": "1.7.1" //依据理论状况填写 }, //.... }, 6.再次打包之后,就不会存在这个问题了,本期的分享到了这里就完结啦,是不是很nice,心愿对你有所帮忙,让咱们一起致力走向巅峰!

November 23, 2020 · 1 min · jiezi

关于uni-app:uniapp使用uView

uni-app应用uView1.开发环境 uni-app+uView2.电脑系统 windows10专业版3.在咱们第一次应用uni-app+uView开发的过程中,咱们可能会遇到一些问题,上面我来分享一下在 uni-app应用uView,心愿对你有所帮忙。2.首先咱们来一下,uView官网文档3.首先下载 uView,地址为: [https://ext.dcloud.net.cn/plugin?id=1593](https://ext.dcloud.net.cn/plugin?id=1593)4.下载实现之后,咱们会失去这样的一个目录,如下:5.在main.js中增加如下代码: import uView from "uview-ui";Vue.use(uView);6.在pages.json中增加如下代码: "easycom": { // 下载安装的形式须要后面的"@/",npm装置的形式无需"@/" // 下载安装形式 "^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue" // npm装置形式 // "^u-(.*)": "uview-ui/components/u-$1/u-$1.vue" },//留神:这个代码和 pages 是同级的关系6-1.应用 easycom的劣势: 7.在uni.scss中增加如下代码: @import "uview-ui/theme.scss";8.装置sass9.在.vue模板中应用,增加如下代码: <u-button type="success">胜利按钮</u-button>10.从新运行我的项目,成果如下:11.本期的分享到了这里就完结啦,是不是很nice,心愿对你有所帮忙,让咱们一起致力走向巅峰!

November 20, 2020 · 1 min · jiezi

关于uni-app:uniapp中h5端和小程序数据请求封装和传参

1.开发环境 uni-app2.电脑系统 windows10业余为版3.在应用uni-app开发的过程中,咱们须要数据申请,然而应用uni-app 框架自带的申请形式咱们须要写很多反复的代码,我进行了封装,心愿对你有所帮忙,为什么要封装h5端数据申请还要封装微信端的数据申请,上面会有所解释!4.封装前的数据申请办法: chengeth5(){ return new Promise((resolve,reject)=>{ uni.request({ url:'/api/feng', //申请接口 method:'post', //申请办法 data:this.ChenindexconOnj,//传递的参数 success:(res)=>{ // console.log(res);//输入申请到的数据 resolve(res); }, }) }) }, 5.对h5端数据申请封装,在 pages 目录下新建 h5hhtp 文件,在文件下新建一个 h5hhp.js,增加如下代码: function req(obj) { return new Promise((resolve, reject) => { // const HOST = baseUrl; const HOST = 'http://192.168.137.78:3000'; //申请后盾地址 var method = obj.method || "GET"; //申请形式,默认为GET var url = HOST + obj.url || ""; var url = obj.url || ""; var data = obj.data || {}; var header = obj.header || obj.method == ('post' || 'POST') ? { 'Content-Type': obj.contentType || 'application/x-www-form-urlencoded', } : { 'Content-Type': obj.contentType || 'application/json', }; var success = obj.success; // 胜利回调函数 var fail = obj.fail; //示意失败后,要执行的回调函数 uni.request({ url: url, data: data, method: method, header: header, success: ((res) => { if (res.statusCode === 203) { console.log('返回203状态码') // 错误处理,返回登录页 // uni.reLaunch({url:'/pages/login/index'}) } else if (res.statusCode === 200) { resolve(res) } }), fail: ((err) => { reject(err) }) }) })}export default req6.在http目录同级,新增 api 文件,在api目录下,新建一个 api.js,增加代码如下: ...

November 19, 2020 · 2 min · jiezi

关于uni-app:uniapp数据请求封装和api接口管理

uni-app数据申请封装和api接口治理1.开发环境 uni-app2.电脑系统 windows10专业版3.在应用uni-app开发的过程中,咱们常常会应用到数据申请,上面我我对uni-app数据申请的封装和接口治理,心愿对你有所帮忙!4.在pages同级新建一个目录,http(名字本人定义),在http目录下新建一个http.js文件,增加代码如下: function req(obj) { return new Promise((resolve, reject) => { // const HOST = baseUrl; var method = obj.method || "GET"; // var url = HOST + obj.url || ""; var url = obj.url || ""; var data = obj.data || {}; var header = obj.header || obj.method == ('post' || 'POST') ? { 'Content-Type': obj.contentType || 'application/x-www-form-urlencoded', } : { 'Content-Type': obj.contentType || 'application/json', }; var success = obj.success; // 胜利回调函数 var fail = obj.fail; //示意失败后,要执行的回调函数 uni.request({ url: url, data: data, method: method, header: header, success: ((res) => { if (res.statusCode === 203) { console.log('返回203状态码') // 错误处理,返回登录页 // uni.reLaunch({url:'/pages/login/index'}) } else if (res.statusCode === 200) { resolve(res) } }), fail: ((err) => { reject(err) }) }) })}export default req5.在http目录同级,新增一个api目录,在api目录上面新建一个api.js,增加如下代码: ...

November 18, 2020 · 1 min · jiezi

关于uni-app:uniapp项目中H5跨域小程序不跨域怎么解决方法兼容H5小程序

uni-app我的项目中H5跨域小程序不跨域怎么解决办法(兼容H5、小程序)1.开发环境 uni-app2.电脑系统 windows10专业版3.在应用uni-app开发的过程中,咱们在h5端会存在跨域的问题,在小程序中是没有跨域的,然而怎么同时兼容 h5和小程序呢?在这里我抉择应用 uni-app中的条件编译,上面我来分享一下具体方法,心愿对你有所帮忙!4.首先配置h5端跨域解决办法,在manifest.json 中增加如下如下代码: "h5": { "devServer": { "port" : 9008, //端口号 "disableHostCheck": true, "proxy": { "/api": { "target": "http://192.168.137.78:3000", //指标接口域名 "changeOrigin": true, //是否跨域 "secure": false, // 设置反对https协定的代理 "pathRewrite": { "^/api": "" //通过pathRewrite重写地址,将前缀/api转为/ } } } } }, //留神:增加的代码和 app-plus 是同级的关系!5.后盾接口地址为: http://192.168.137.78:3000/feng6.在 mounted 中增加如下代码: mounted() { // #ifdef H5 //在 h5端执行的代码 uni.request({ url:'/api/feng', 申请接口 method:'post', //申请办法 data:this.ChenindexconOnj, //传递的参数 success:(res)=>{ console.log(res); //输入 申请胜利的数据 }, }) // #endif // #ifdef MP-WEIXIN //在微信小城中执行的代码 this.chenget(); // #endif },7.在h5端成果为:8.在小程序端成果为:9.本期的分享到了这里就完结啦,是不是很nice,心愿对你有所帮忙,让咱们一起致力走向巅峰! ...

November 18, 2020 · 1 min · jiezi

关于uni-app:uniapp数据请求封装

uni-app数据申请封装1.开发环境 uni-app2.电脑系统 windows10专业版3.在应用uni-app开发的过程中,咱们会应用到数据申请,上面我来分享一下,uni-app数据申请封装,心愿对你有所帮忙!4.和pages同级新增一个目录,名字本人定义,在这里我的名字是 chenhttp在这个文件上面新建一个 chenhttp.js,代码如下: const BASE_URL='http://192.168.137.78:3000'; //后盾接口地址export const myRequest=(options)=>{ return new Promise((resolve,reject)=>{ uni.request({ url:BASE_URL+options.url, method:options.method || 'GET', //配置申请办法,默认为 get申请 data:options.data || {}, success:(res)=>{ if(res.data.statusCode ==0){ return uni.showToast({ title:'获取数据失败' }) } resolve(res) }, fail:(err)=>{ uni.showToast({ title:'申请接口失败' }) reject(err) } }) })}5.为了方便使用,咱们把这个办法挂载到全局,在main.js中增加如下代码: import {myRequest} from 'chenhttp/chenhttp.js';Vue.prototype.$myRequest=myRequest;6.在uni-app模板中应用,在methods中增加如下代码: async chenget(){ const res=await this.$myRequest({ url:'/feng', //申请的接口 method:'post', //申请办法 data:this.ChenindexconOnj //传递的参数 }) console.log(res); //输入申请的数据 }7.在mounted 进行调用,增加如下代码: this.chenget();8.成果如下:9.后盾承受的参数,成果为:10.本期的分享到了这里就完结啦,是不是很nice,心愿对你有所帮忙,让咱们一起致力走向巅峰!

November 18, 2020 · 1 min · jiezi

关于uni-app:uniapp页面传参非tabBar页面

uni-app页面传参(非tabBar页面)1.开发环境 uni-app2.电脑系统 windows10专业版3.应用 navigator 办法进行传参,在template中增加如下代码: <navigator :url="`../indexcon/indexcon?id=${title}`">去首页的详情页</navigator>//留神:在这里我应用了模板字符串的办法,这样能够使 title 作为一个变量,不然的话,会被辨认为一个字符串4.在 indexcon 页面中,在 onLoad中进行承受,代码如下: onLoad(options) { console.log(options); }, //应用 options 承受传递过去的参数5.成果如下:6.然而在开发的过程中,咱们必定不会只传一个参数,咱们个别会传多个参数,在这里我抉择的是,应用对象的办法!7.在template 中批改代码为: <navigator :url="`../indexcon/indexcon?id=${ChenindexconOnj}`">去首页的详情页</navigator>8.在return中增加如下代码: ChenindexconOnj:{ 'id':'100', 'name':'chen', 'sex':'男', 'age':'23', },9.在 indexcon 输入承受到的对象,成果如下: 依据输入这个后果,咱们能够得出结论,这个办法能够辨认字符串,解决办法如下10.在 onLoad中增加如下代码: onLoad() { this.ChenindexconOnj=JSON.stringify(this.ChenindexconOnj); }, // JSON.stringify(this.ChenindexconOnj) //作用:把这个变量转换为字符串11.再次测试,成果如下:12.本期的分享到了这里就完结啦,心愿对你有所帮忙,让咱们一起致力走向巅峰!

November 18, 2020 · 1 min · jiezi

关于uni-app:uniapp使用icon

1.开发环境 uni-app2.电脑系统 windows10专业版3.在应用 uni-app开发的过程中,咱们总是会应用到icon,上面我来分享一下在uni-app开发应用icon,心愿对你有所帮忙!4.在这里我抉择的字体库是阿里巴巴矢量库,登录,把图标下载下来5.下载完了之后关上文件,除了iconfont.css其余文件一律删除6.回到本人的iconfont我的项目,抉择unicode点击生成代码7.生成结束之后点击复制代码8.回到iconfont.css并且关上css文件,留神红框内容,全副删除,替换成第五步刚刚复制过去的9.替换结束之后,须要在//at后面加上https:10.在页面中应用iconfont,代码如下: <template> <view class="content"> <text class="iconfont iconche-copy"></text> </view></template><script> export default { data() { return { title: 'Hello' } }, onLoad() { }, methods: { } }</script><style>/抉择iconfont.css所在的门路/ @import '../../static/icon/iconfont.css'; .content { display: flex; flex-direction: column; align-items: center; justify-content: center; } .logo { height: 200rpx; width: 200rpx; margin-top: 200rpx; margin-left: auto; margin-right: auto; margin-bottom: 50rpx; } .text-area { display: flex; justify-content: center; } .title { font-size: 36rpx; color: #8f8f94; }</style>11.效果图如下: ...

November 13, 2020 · 1 min · jiezi

关于uni-app:uniapp-微信小程序报错Cannot-read-property-forceUpdate-of-undefined

uni-app 微信小程序报错:Cannot read property 'forceUpdate' of undefined1.开发环境 uni-app2.电脑系统 windows10专业版3.在首次应用uni-app开发的时候,把我的项目运行到小程序的时候会包 Cannot read property 'forceUpdate' of undefined,上面我来分享一下我的解决办法,心愿对你有所帮忙!4.我的项目运行到小程序,报错如下:5.解决办法:6.实现5的操作之后,先进行我的项目的运行,而后再次运行我的项目,成果如下:7.本期的分享到了这里就完结啦,心愿对你有所帮忙,让咱们一起致力走向巅峰!

November 13, 2020 · 1 min · jiezi

关于uni-app:uni-引入-animatecss-v4版本教程

1.官网链接https://animate.style/ 2.引入步骤:(1)npm install animate.css --save (2)App.vue中 @import 'animate.css' (3)页面中应用(留神双横线连贯): <div class='life'> <div class="animate__animated animate__swing animate__infinite animate__slower animate__delay-2s">你好今天</div></div>属性介绍(详见官网)①animate__animated 固定值②animate__swing 动画类名③animate__infinite 反复次数④animate__slower 执行速度⑤animate__delay-2s 提早两秒执行 (4)而后你会发现页面还是静止的,因为还有最要害的一步-定义初始变量,实现!! .life { --animate-duration: 1s; --animate-delay: 1s; }

November 3, 2020 · 1 min · jiezi

关于uni-app:uniapp原生App云打包

· HBuilderX开发工具,菜单栏:发行(U) → 原生App云打包(P) · 弹窗界面如下: 能够抉择打包Android(apk包)、ios(ipa包),单选或者多选Android包名,这里用咱们域名azapp.i72.com反转过去com.i72.azapp做为包名,必须合乎以下包名规定:一、包名必须蕴含至多两个段,由一个或多个点隔开。例如:com.abc,tencent.qq.mm;二、每个段的字符必须是小写字母、数字或下划线[a-z0-9_]组成;三、每个段必须以字母结尾; 留神:__包名(Package Name)作为利用的惟一标识。即:包名必须惟一,一个包名代表一个利用;用公布后,请不要随便批改包名,一旦您批改了包名,就会被当作一个新的利用,旧版用户无奈收到利用商店的降级揭示。 Android平台签名证书(.keystore)生成指南 3.抉择应用自有证书(须要用到数字证书进行签名),须要开发者本人生成证书;也可应用公共测试证书(不须要填写4,5,6项),免去制作证书的麻烦; 证书是一个开发者的身份标记,对Android零碎而言。应用一个证书签发的App,是属于同一个开发者的App。Android证书的生成是自助和收费的,不须要审批或付费。 4.证书别名 5.证书私钥明码 6.证书文件 7.渠道包,全副不勾选 HBuilderX默认提供 7 个渠道(Google、360、小米、华为、利用宝、vivo、oppo),更多能够在manifest.json文件中【源码视图】进行配置 8.抉择 打正式打包,如抉择 打自定义调试基座(去看这篇=》) 打正式打包次数有限度 9.原生混同,不勾选 10.全副不勾选 11.打包 · ios(ipa包) 1.抉择 ios(ipa包) 2.Bundle ID(AppID)为com.i72.azapp,跟Android包名统一 3.勾选反对iPhone,应用IDP/IEP证书 iOS证书(.p12)和形容文件(.mobileprovision)申请 4.证书私钥明码 5.证书profile文件 6.私钥证书 留神:证书profile文件和私钥证书辨别开发环境和生产环境,开发 请抉择dev下的证书profile文件和私钥证书 证书类型 应用场景 开发(Development)证书和形容文件 用于开发测试,在 HBuilderX 中打包后可在真机环境通过Safari调试 公布(Distribution)证书和形容文件 用于提交 AppStore,在 HBuilderX 中提交云打包后提交到 AppStore 审核公布 7.抉择打正式包 8.全副不勾选 9.打包 · 打包实现 调试能够应用自定义调试基座(菜单运行-手机或模拟器-制作自定义调试基座),不要重复打包 什么是自定义调试基座及应用阐明

October 30, 2020 · 1 min · jiezi

关于uni-app:uniapp跨域解决方案

uni-app跨域解决方案1.开发环境 uni-app2.电脑系统 windows10专业版3.在应用uni-app开发的过程中,在测试的时候咱们总是会遇到跨域的问题,怎么解决呢?计划如下:4.在 manifest.json中增加如下代码: "h5":{ "devServer" : { // "port" : 9001, //端口号 "disableHostCheck" : true, "proxy" : { "/api" : { "target" : "http://192.168.0.106:3000", //指标接口域名 "changeOrigin":true, //是否跨域 "secure":false, // 设置反对https协定的代理 "pathRewrite": { "^/api":"" //通过pathRewrite重写地址,将前缀/api转为/ } } } } }, //留神:增加的代码和 app-plus 是同级的关系!5.在vue模板中增加如下代码: uni.request({ url: "/api/feng", method:"post", success: (res) => { console.log(res.data); } });6.成果为:7.本期的教程到了这里就完结啦,是不是很nice,让咱们一起致力走向巅峰!

October 24, 2020 · 1 min · jiezi

关于uni-app:跨平台文件在线预览解决方案四Android和IOS原生插件

引言后面写了多篇对于<跨平台文件在线预览解决方案>,不论应用pdf.js、LibreOffice,还是永中DCS,各自都有本人的优缺点,比方:pdf.js不反对双指放大放大,LibreOffice加载迟缓,永中DCS免费等等。 跨平台(uni-app)文件在线预览解决方案跨平台文件在线预览解决方案(二)跨平台文件在线预览解决方案(三)- LibreOffice vs OpenOffice本文基于uni-app平台实现了Office文档在线预览原生插件Seal-OfficeOnline,同时反对Android和iOS,欢送下载应用~ Seal-OfficeOnline插件下载应用地址 <div class="half"> </div> 疾速上手demo工程地址 开发工具:HBuilderX Step1. 下载demo工程,应用HBuilderX关上Step2. 下载本文插件插件名称:Seal-OfficeOnline 下载插件解压搁置到我的项目根目录nativeplugins下,如图: Step3. 抉择manifest.json->App原生插件配置中加载本地插件 Step4. 应用插件在vue或nvue组件中,导入插件var testModule = uni.requireNativePlugin("Seal-OfficeOnline")应用openFile办法预览Office文件,反对如下格局:pdf、txt、doc、docx、xls、xlsx、ppt、pptxtestModule.openFile({ url: 'http://113.62.127.199:8090/fileUpload/1.xlsx', topBarBgColor: '#3394EC', topBarTextColor: '#FFFFFF', title: 'Office文档在线预览', isBackArrow: false, fileType: 'xlsx', fileName: '1'});openFile办法参数阐明urlurl参数反对如下三种地址形式: 文件网络地址,如:http://113.62.127.199:8090/fileUpload/1.xlsx手机本地文件地址,如:/data/user/0/com.HBuilder.UniPlugin/files/1.xlsx文件名,如:1.xlsx,拜访默认目录文件,默认目录为:/data/user/0/com.HBuilder.UniPlugin留神:手机本地地址目录须要有权限拜访 titletitle示意顶栏文本,默认为:SealOfficeOnline topBarBgColortopBarBgColor示意顶栏背景色彩,默认为:#177cb0(靛青) topBarTextColortopBarTextColor示意顶栏文本色彩,默认为:#FFFFFF(红色) isBackArrowisBackArrow示意是否显示返回按钮,默认为:true(显示) fileTypefileType示意能够指定文件类型,如:xlsx,在url参数无奈判断文件类型时,能够指定文件类型 fileNamefileName能够指定文件名,如:file1,留神此处不带文件扩展名,如果同时指定fileName和fileType,那么最初的文件名通过这两个参数组合起来,即:fileName.fileType Android预览成果预览docx 预览pptx 预览xlsx 预览pdf 预览txt iOS预览成果预览docx 预览pptx 预览xlsx 预览pdf 预览txt 转载请注明:我的技术分享 » 跨平台文件在线预览解决方案(四)-Android和IOS原生插件

October 17, 2020 · 1 min · jiezi

关于uni-app:mac-intellij-idea-rpx-格式化带空格的问题

因为公司的小程序都是外包的,偶然间被老大晓得我会写小程序之后,就把个紧急的小程序给我写了,就以国内的模式,不必uni-app来写太不适合了,然而作为一个业余java开发,习惯了 intellij idea 开发,而且凭借 intellij idea 弱小的代码索引性能,比起HBuilderX不便多了,然而 intellij idea 中的rpx报错,而且格式化还自带空格???? 解决形式 下载 file watchers 插件2.配置 vue file watcher-i "" s/"\ rpx"/rpx/g $FilePath$ 完

October 9, 2020 · 1 min · jiezi

关于uni-app:uniapp小程序录音上传解决方案后续更新Taro版

能力依赖RecorderManager 全局惟一的录音管理器录音性能的要求与限度与以后页面其余音频播放/录音性能互斥是否在录音中状态显示完结/不须要录音时,回收RecorderManager对象资料能够/完结 录音录音中 Codeing(后果代码间接看最初)结构一个简略的DOM构造<image @click="recordAction" :src="recordImg" class="record"/>先实现小程序的录音性能import iconRecord from '../../static/images/icon_record.png'import iconRecording from '../../static/images/icon_recording.png'// ...data() { recordImg: iconRecord, // 录音按钮的图标 rm: null, // 录音管理器},// ...mounted() { if (this.rm === null) { // 录音管理器如果没有初始化就先初始化 this.rm = uni.getRecorderManager() } // 绑定回调办法 this.rm.onStart((e) => this.onStart(e)) this.rm.onPause((e) => this.onPause(e)) this.rm.onResume((e) => this.onResume(e)) this.rm.onInterruptionBegin((e) => this.onInterruptionBegin(e)) this.rm.onInterruptionEnd((e) => this.onInterruptionEnd(e)) this.rm.onError((e) => this.onError(e))},// ...methods: { // ... recordAction() { if (this.recordImg === iconRecord) { // 设置格局为MP3,最长60S,采样率22050 this.rm.start({ duration: 600000, format: 'mp3', sampleRate: 22050, }) // 开始录音后绑定进行录音的回调办法 this.rm.onStop((e) => this.onStop(e)) } else if (this.recordImg === iconRecording) { this.rm.stop() }, }, onStart(e) { console.log('开始录音', this.question, this.subQuesIndex) this.recordImg = iconRecording console.log(e) }, onPause(e) { console.log(e) afterAudioRecord() }, onResume(e) { console.log(e) }, onStop(e) { console.log(e) this.recordImg = iconRecord // 完结录音之后上传录音 this.uploadMp3Action(e) }, onInterruptionBegin(e) { console.log(e) }, onInterruptionEnd(e) { console.log(e) }, onError(e) { console.log(e) }, uploadMp3Action(e) { // TODO uploadMp3 },},只能同时有一个录音,与音频播放互斥globalData中减少两个属性audioPlaying,audioRecording// src/App.vueexport default { globalData: { // 保障全局只有一个音频处于播放状态且录音与播放操作互斥 audioPlaying: false, audioRecording: false, }, // ...}, Util中减少判断办法// src/lib/Util.js// 完结录音之后开释录音能力export function afterAudioRecord() { getApp().globalData.audioRecording = false}// 完结音频播放之后开释音频播放能力export function afterAudioPlay() { getApp().globalData.audioPlaying = false}/** * 判断是否能够录音或者播放 * @param {string} type play | record */export function beforeAudioRecordOrPlay(type) { const audioPlaying = getApp().globalData.audioPlaying const audioRecording = getApp().globalData.audioRecording if (audioPlaying ||audioRecording) { uni.showToast({ title: audioPlaying ? '请先暂停其余音频播放' : '请先完结其余录音', icon: 'none' }) return false } else { if (type === 'play') { getApp().globalData.audioPlaying = true } else if (type === 'record') { getApp().globalData.audioRecording = true } else { throw new Error('type Error', type) } return true }}革新原有recordAction办法import { beforeAudioRecordOrPlay, afterAudioRecord} from '../../lib/Utils';// ...recordAction() {- if (this.recordImg === iconRecord) {+ if (this.recordImg === iconRecord && beforeAudioRecordOrPlay('record')) { // 设置格局为MP3,最长60S,采样率22050 this.rm.start({ duration: 600000, format: 'mp3', sampleRate: 22050, }) // 开始录音后绑定进行录音的回调办法 this.rm.onStop((e) => this.onStop(e)) } else if (this.recordImg === iconRecording) { this.rm.stop()+ afterAudioRecord() },},这样就防止了屡次录音小程序录音上传补全咱们的uploadMp3Action办法,咱们应用uni-app的uni.uploadFile()办法来上传录音文件 ...

September 16, 2020 · 2 min · jiezi

关于uni-app:记录一下最近uniapp的学习一

参考链接:保活知识点查录List上拉加载-下拉刷新sPullScrollLoadMore 加载更多Day.js 一、保活-前台运行:用于进步app存活概率或增加前台显示能够用于晋升app运行权限,减少保活概率,可使app长期后盾运行不会被杀死(用户被动清理就不能保了。)初始化: const hgService = uni.requireNativePlugin("HG-Background");配置插件: hgService.config({ title:"服务名称", content:"前台服务运行中", mode: 0, //0省电模式 1流氓模式});留神插件服务应用 app的 icon.png,与push.png 作为告诉栏图标 关上平安治理: hgService.showSafeSetting();检测是否限度后盾运行: var rsult=hgService.checkIfLimited();//console.log("isLimit=>"+rsult.isLimit );// modal.toast({// message: "是否受限:"+rsult.isLimit,// duration: 1.5// });返回数据阐明: { "isLimit":true // false 是否受限}申请运行后盾运行(仅针对andriod零碎,对于各厂家的平安治理设置要独自进行,这里只能肯定层度上减少app存活工夫): hgService.requestIgnoreLimit();启动前台服务: hgService.startService();全局事件回调(可用在uniapp执行工作,注册须要能够疾速返回,不能阻塞):工作启动工夫,会有肯定延时个别一分钟内: var globalEvent = uni.requireNativePlugin('globalEvent'); globalEvent.addEventListener('doJob', function() { counts+=1; modal.toast({ message: "工作执行次数:"+counts, duration: 1 }); });进行服务: hgService.closeService();二、List列表:list 列表组件个别用于导航菜单、列表、设置页排版等,能够在其中应用图标、略缩图或搁置任何你想放的元素.组件名:uni-list、uni-list-item组件应用注意事项: 组件须要依赖 sass 插件 ,请自行手动装置组件外部依赖 'uni-icons' 、uni-badge 组件uni-list 和 uni-list-item 须要配套应用,暂不反对独自应用 uni-list-item开启点击反馈后,会有点击选中成果应用插槽时,能够齐全自定义内容note 、rightText 属性临时没做限度,不反对文字溢出暗藏,应用时应该管制长度显示或通过默认插槽自行扩大如果须要批改 switch、badge款式,请应用插槽自定义应用形式:在应用 uni-ui 的时候,只有uni-ui 组件 装置在我的项目的 components 目录下,并合乎 components/组件名称/组件名称.vue 目录构造。就能够不必援用、注册,间接在页面中应用 uni-ui 组件 ...

September 11, 2020 · 2 min · jiezi

关于uni-app:uniapp生态下UI框架的优选欢迎爱开源的你也加入他们

uni-app (https://gitee.com/dcloud/uni-app)是一个应用 Vue.js 开发所有前端利用的框架,开发者编写一套代码,可公布到iOS、Android、H5、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)、快利用等多个平台。 明天为大家介绍的就是 uni-app 生态下的一款 UI 框架,他们的项目组也正在踊跃招募一起单干的小伙伴,如果你和他们一样喜爱 uni-app,那么无妨看上来吧。 项目名称:uView 我的项目作者:亡灵叙曲 开源许可协定:MIT 我的项目地址:https://gitee.com/xuqu/uView 我的项目简介 uView UI,是 uni-app 生态优良的UI框架,全面的组件和便捷的工具会让您信手拈来,蛟龙得水。 我的项目个性 兼容安卓,iOS,微信小程序,H5,QQ小程序,百度小程序,支付宝小程序,头条小程序60+精选组件,功能丰富,多端兼容,让您疾速集成,开箱即用泛滥贴心的JS利器,让您飞镖在手,召之即来,百步穿杨泛滥的罕用页面和布局,让您专一逻辑,事倍功半详尽的文档反对,现代化的演示成果按需引入,精简打包体积我的项目截图 开发者说 uView 的指标是做成 uniapp 生态的标杆,自在且收费开源。 对此,uView 有清晰且明确的打算安顿,uView 将会全面兼容 nvue,适配暗黑模式,整合unicloud,退出更多组件和模板等。 然而,一个人的力量是不够的: 为了开源,现实和自在,您能够退出 uView 的研发工作组,咱们一起并肩奋战。如果您是做 UI 开发的同学,uView 同样欢送,因为 uView 须要内外兼修。如果您是个踊跃沉闷的人,那么也欢迎您退出 uView 的QQ群成为管理员。所有退出 uView 奉献的同学,都会在官网申明,并且有本人的集体专属页。 如果你想要退出他们,或者理解我的项目更多的细节,那么就点击前面的链接返回我的项目主页看看吧:https://gitee.com/xuqu/uView

September 4, 2020 · 1 min · jiezi

关于uni-app:uniapp页面之间的传参让下一个页面接收上一个页面的值

为了实现页面之间的通信,或者数据交换,咱们要实现一个页面到另一个页面的传参,能够通过点击跳转的时候进行页面之间的传值。 <template> <view> <navigator url="../a/a?id=1" hover-class="none"> <view>跳转到A页面</view> </navigator> <navigator url="../b/b?id=2" hover-class="none"> <view>跳转到B页面</view> </navigator> <navigator url="../c/c?id=3" hover-class="none"> <view>跳转到C页面</view> </navigator> </view></template><script>export default { data() { return { } }, methods: { }, onLoad: function (option) { //取得上一个页面传过来的id var pageid = option.id; console.log(pageid); }}</script>Author:TANKINGWeb:http://www.likeyun.cn/Date:2020-8-13WeChat:face6009

August 13, 2020 · 1 min · jiezi

关于uni-app:uniapp提交表单到后端接收表单数据

要想接管表单数据,首先要在表单进行数据的绑定,咱们能够应用v-model="keyword"进行绑定。 而后在js获取这个绑定的值。 index.vue <template><view> <view class="search-con"> <view class="form-con"> <form class="search-form"> <input type="text" v-model="keyword" @tap="showsearchbtn" focus="true"/> <button form-type="submit" hover-class='none' @tap="keyword">提交</button> </form> </view> </view></view><template>js <script>export default { data() { return { } }, methods: { keyword(e){ // 获取表单值 let kw = this.keyword; console.log(kw); } } }</script>Author:TANKINGWeb:http://www.likeyun.cnDate:2020-8-13WeChat:face6009

August 13, 2020 · 1 min · jiezi

关于uni-app:uniapp提交表单到后端接收表单数据

要想接管表单数据,首先要在表单进行数据的绑定,咱们能够应用v-model="keyword"进行绑定。 而后在js获取这个绑定的值。 index.vue <template><view> <view class="search-con"> <view class="form-con"> <form class="search-form"> <input type="text" v-model="keyword" @tap="showsearchbtn" focus="true"/> <button form-type="submit" hover-class='none' @tap="keyword">提交</button> </form> </view> </view></view><template>js <script>export default { data() { return { } }, methods: { keyword(e){ // 获取表单值 let kw = this.keyword; console.log(kw); } } }</script>Author:TANKINGWeb:http://www.likeyun.cnDate:2020-8-13WeChat:face6009

August 13, 2020 · 1 min · jiezi

关于uni-app:源码测评来客推开发源码能用来做什么模式的商城B2B2CS2B2C云集模式淘宝模式

开源社区提到开源代码,在程序员眼中肯定有排名的是就是github. GitHub 是一个面向开源及公有软件我的项目的托管平台,因为只反对 Git 作为惟一的版本库格局进行托管,故名 GitHub。 GitHub 于 2008 年 4 月 10 日正式上线,除了 Git 代码仓库托管及根本的 Web 治理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、合作图谱(报表)、代码片段分享(Gist)等性能。目前,其注册用户曾经超过 350 万,托管版本数量也是十分之多,其中不乏出名开源我的项目 Ruby on Rails、jQuery、python 等。 2018 年 6 月 4 日,微软发表,通过 75 亿美元的股票交易收买代码托管平台 GitHub。 当然这个毕竟当初被微软操控着,在国内的访问速度可想而知,所以很多国内的程序员大佬会去另外一个国产平台gitee.com,名字获得很霸气「码云」,和咱们国民爸爸「马云」马爸爸同音。作为国产git代码托管平台,外面的代码基本上更多满足国人的需要和市场化的场景须要。 至于二者的区别就不赘诉,毕竟在坐的都是技术大佬,明天要说的是在gitee.com上搜寻「小程序商城」,排名第一个的这个来客推电商,到底是个什么来头。 来客推电商 粗劣电商,来客, [ 微信 + 支付宝 + 百度 + 头条 ] 小程序 + APP + 公众号 + PC + H5,重视界面美感与用户体验,打造独特电商零碎生态圈,不可多得的二开神器。 【PHP商城零碎 分销商城 多用户商城 Saas O2O商城 B2B2C S2B2C 小程序直播】 在gitee.com上的是他们的开源代码,天然性能有所局限,那么他们的商业版本到底怎么样呢?间接去官网的演示版本深刻理解了一个上午。总结如下: ♦代码齐全开源 不少企业老板或者对程序不理解的就会问了:都免费了怎么还是开源呢?那么首先要纠正一个问题,代码开源不等于代码收费,代码自身就是程序员的工作成绩,适当的商业免费是能了解的,而开源的意思是这个代码交付到你手中,你能够自有配置、批改,这交付的源码批改不波及到商业版权纠纷,不波及到代码的加密。艰深而言,这就是代码开源 ♦我的项目相当稳固 所有技术大佬的宿愿都是心愿本人的程序没有bug,然而这只是一个商业程序,没有bug是不存在的,而来客推这个代码依据客服的介绍和工商信息看,他们代码应该是开发了1年左右,而商业化应该也有快2年的工夫,这部分的积淀还是指的大家释怀的,当然了,与行业前辈相比来客推还是个小学生,所以他们的定价算得上比拟切实。毕竟行业外面交付源码的这样的体量动辄10万,少的也是5万-8万。 ♦价格还算切实 ...

August 7, 2020 · 1 min · jiezi

关于uni-app:enable-ide-service-yn-27d-27c

我在hbuilderx里运行编译uni-app的微信小程序版,报:enable ide service (y/n) [27d [27c 解决办法: 在微信开发者工具里点击设置》平安设置,开启服务端口

July 23, 2020 · 1 min · jiezi

uniapp开发小程序适配苹果端采坑总结

不得不说,任何一个开发者遇到苹果手机都会或多或少须要做适配,在应用uni-app开发小程序时,我就发现不少须要兼容的中央,明天做个小结 1.因为页面大多数内容都是动静获取,当页面高度不给固定值时,让其随内容的填充自适应的时候,iPhoneX Max手机在页面底部会呈现白版,安卓手机不会有此景象. 解决办法: //通过获取零碎信息拿到屏幕宽高比, const SCREEN_WIDTH = 750 const RATE = wx.getSystemInfoSync().screenHeight / wx.getSystemInfoSync().screenWidth data(){ ScreenTotalH: SCREEN_WIDTH * RATE, //拿到实在手机高度 } //展现内容高度 <view class="main" :style="{height:ScreenTotalH+'rpx'}"> //这样后苹果大屏手机内容底部不会白板2.获取到工夫字符串"2020-07-12 09:00:30" ,当我截取后取时和分为单位,如果时为"00"时,页面<text>{{dian}}点</text>,显示为'0'而不是我要的'00',这个问题非常奇葩,尽管不是大的影响,加个三目判断:<text>{{dian=='00'?'00':dian}}点</text>,就ok.3.有时候小程序须要显示APP分享过去的H5页面,或者小程序自身须要显示H5页面时,须要配置https的域名,不然会无奈失常显示,安卓没有此问题.补充:(H5页面个别通过<web-view :src="src"></web-view>来展现,SRC外面的页面都是后盾配置好的)目前这是我遇到的苹果端适配问题以及解决办法,还有其余对于小程序苹果端的适配问题,大家网上去搜寻一大把,解决办法大佬们都写了,我再此就不反复他人的成绩了.

July 12, 2020 · 1 min · jiezi

uniapp的app原始标题栏中自定义iconfont图标不显示的解决方案

从iconfont上下载字体到本地用上图的\e601直接配置在uni-app的pages.json中这样并不起作用 解决方案需要在斜杠后面加u才有用图标就出来了。 结语如果帮到你了,点个赞吧,哈哈哈哈

June 30, 2020 · 1 min · jiezi

前端面试每日-31-第437天

今天的知识点 (2020.06.26) —— 第437天 (我也要出题)[html] 如何给页面添加追加右键菜单(原右键菜单功能保持不变)[css] 为什么float会导致父元素塌陷?[js] 微信小程序实现轨迹回放,微信原生小程序,基于uniapp的小程序?[软技能] TCP为什么是有状态的?《论语》,曾子曰:“吾日三省吾身”(我每天多次反省自己)。前端面试每日3+1题,以面试题来驱动学习,每天进步一点!让努力成为一种习惯,让奋斗成为一种享受!相信 坚持 的力量!!!欢迎在 Issues 和朋友们一同讨论学习! 项目地址:前端面试每日3+1【推荐】欢迎跟 jsliang 一起折腾前端,系统整理前端知识,目前正在折腾 LeetCode,打算打通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢迎大家前来讨论,如果觉得对你的学习有一定的帮助,欢迎点个Star, 同时欢迎微信扫码关注 前端剑解 公众号,并加入 “前端学习每日3+1” 微信群相互交流(点击公众号的菜单:进群交流)。 学习不打烊,充电加油只为遇到更好的自己,365天无节假日,每天早上5点纯手工发布面试题(死磕自己,愉悦大家)。希望大家在这浮夸的前端圈里,保持冷静,坚持每天花20分钟来学习与思考。在这千变万化,类库层出不穷的前端,建议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢迎大家到Issues交流,鼓励PR,感谢Star,大家有啥好的建议可以加我微信一起交流讨论!希望大家每日去学习与思考,这才达到来这里的目的!!!(不要为了谁而来,要为自己而来!)交流讨论欢迎大家前来讨论,如果觉得对你的学习有一定的帮助,欢迎点个[Star]

June 26, 2020 · 1 min · jiezi

uniapp之unishowToastimage路径问题

uni-app的API中,showToast的icon值只有success,loading,none三种显示,失败没有图标。如果失败时需要显示图标,就要用到自定义图标 image 了 uni.showToast({ title: '扫码失败', image:'/static/lost.png', ////要写根路径,不要写相对路径 duration: 3000, })结果如下: 注意:在components下的组件,图片路径用 /static/lost.png 这样的根路径形式, 不要用 …/static 或者 …/…/static 的形式。 在有些平台不报错,但找不到路径,不显示图片。

June 10, 2020 · 1 min · jiezi

uniapp里面实现分类栏目定位和滚动

需求首页多个分类栏目,分两排展示,菜单页实现一排首页分类栏目的展示要求:首页的多个分类栏目无论点击哪一个,到菜单页一排显示的时候该栏目定位到指定位置 首页代码为了项目结果清晰,我将首页的分类栏目写成组件并引入到首页,首页会通过props传给组件datas <template> <view class="category" > //X是当前元素的标志,在菜单页我是需要拿到这个X,并与菜单页元素的X比对,如果比对一直,就可以滚动到指定位置 <view v-for="(o,x) in datas" class="itemcategory" @tap="tosdCategoryList(o.id,o.contentName,x)" :key="x" :id="'ele' + x"> <image :src="o.assemblyImg" class="assemblyimg"></image> <text class="contentname" :style="{color:o.wordColor?o.wordColor:'contentname'}" >{{o.contentName}}</text> </view> </view></template><script> export default{ name:"sdCategory", props: { datas: { type: Array }, }, data() { return { info: [], assemblyContentId: "", } }, computed: { }, onLoad() { }, onShow() { }, methods:{ tosdCategoryList(assemblyContentId ,goodsName,x){ let categoryList1=(JSON.stringify(this.datas)) uni.navigateTo({ url:"/pages/sdCategoryGoodsList/sdCategoryGoodsList?assemblyContentId="+assemblyContentId+"&goodsName="+goodsName+"&categoryList="+categoryList1+"&x="+x, }) } } }</script>菜单页代码在这里面我是采坑了的,vue组件或者页面都是有生命周期的,如果需要元素加载完了再展示或者匹配,在vue里面请使用mounted钩子,在uni-app里面使用onReady <scroll-view class="first-scroll" scroll-with-animation scroll-x @scroll="scrollMove" :scroll-left="scrollLeft" :scroll-into-view="intoindex"> <view :class="item.id==assemblyContentId?'first-box1':'first-box'" v-for="(item,x) in info" :key="x" @tap="gotoGetCategoryList(item.id,x)" :id="'ele' + x"> <view class="info"> <view :class="item.id==assemblyContentId?'name1':'name'">{{item.contentName}}</view> </view> </view></scroll-view><script> export default { data() { return { isExtension:'', token: '', info: [], smShopInfo: {}, assemblyContentId: "", x:0, goodsInfoList: [], isShow:false, statusBar:'', statusTop:'', isTop:false, currentSwiper: 0, tabbarIndex: 0, scrollLeft: '', pageHeight: 200, moveParams: { scrollLeft: 0, // scroll-view滚动的距离,默认为0,因为没有触发滚动 subLeft: '', //点击元素距离屏幕左边的距离 subHalfWidth: '', //点击元素的宽度一半 screenHalfWidth: '' //屏幕宽度的一半 }, } }, onReady() { // 获取屏幕宽度,为了让横排的栏目每次点击的时候固定到指定位置 this.getScreenWidth(); this.getCategoryList(this.assemblyContentId,this.x) }, //之前组件传过来的东西 onLoad(option, res) { this.assemblyContentId = option.assemblyContentId this.info = JSON.parse(option.categoryList) this.x=Number(option.x) }, methods: { //获取屏幕宽度 getScreenWidth() { var that = this; uni.getSystemInfo({ success(res) { console.log(res); let moveParams = that.moveParams; moveParams.screenHalfWidth = res.screenWidth / 2; that.pageHeight = res.windowHeight - 50; } }); }, getRect(ele) { //获取点击元素的信息,ele为传入的id console.log(ele); var that = this; const query = uni.createSelectorQuery().in(that); console.log(query) query.select(ele).boundingClientRect((rect)=> { let moveParams = that.moveParams; console.log(rect) //为当前需要的元素信息 console.log(rect.left) console.log(rect.width) moveParams.subLeft =rect.left; moveParams.subHalfWidth =rect.width / 2; that.moveTo(); }).exec(); }, //scroll事件集合: scrollMove(e) { let moveParams = this.moveParams; moveParams.scrollLeft = e.detail.scrollLeft; this.moveParams = moveParams; }, //移动到指定位置 moveTo() { let subLeft = this.moveParams.subLeft; let screenHalfWidth = this.moveParams.screenHalfWidth; let subHalfWidth = this.moveParams.subHalfWidth; let scrollLeft = this.moveParams.scrollLeft; let distance = subLeft - screenHalfWidth + subHalfWidth; scrollLeft = scrollLeft + distance; this.scrollLeft = scrollLeft; }, //获取列表 getCategoryList(id,x) { console.log(id); console.log(x); this.tabbarIndex = x; let ele = 'ele' + x; console.log(ele); this.getRect('#' + ele); this.currentSwiper = x; let params = { shopId: uni.getStorageSync('smShopInfo').id, assemblyContentId: this.assemblyContentId } this.$http.get(this.$api.categoryList, { data: params }).then(res => { if (res.data.code == 200) { if (!!res.data.data) { this.goodsInfoList = res.data.data.list console.log(res.data.data.list); this.isShow = false }else{ this.goodsInfoList=[]; this.isShow = true } } else { uni.showToast({ title: res.data.msg, duration: 2000, icon: 'none' }); } }) }, //点击后渲染列表 点击的横排也是可以滚动到指定位置 gotoGetCategoryList(id,x) { console.log(id); console.log(x); this.tabbarIndex = x; let ele = 'ele' + x; console.log(ele); this.getRect('#' + ele); // this.list = this.orderList[tbIndex]; this.currentSwiper = x; let params = { shopId: uni.getStorageSync('smShopInfo').id, assemblyContentId: id } this.$http.get(this.$api.categoryList, { data: params }).then(res => { if (res.data.code == 200) { uni.showLoading({ title: '加载中', duration: 500, icon: 'none' }); if (!!res.data.data) { // console.log(res.data.data); this.goodsInfoList = res.data.data.list console.log(res.data.data.list); this.isShow = false }else{ this.goodsInfoList=[]; this.isShow = true } this.assemblyContentId = id } else { uni.showToast({ title: res.data.msg, duration: 2000, icon: 'none' }); } }) }, } }</script>

June 6, 2020 · 3 min · jiezi

uniapp使用腾讯地图选点插件

1:找到manifest.json2:找到源码识图3:加上即可。 const key = ''; //使用在腾讯位置服务申请的key const referer = ''; //调用插件的app的名称 const location = JSON.stringify({ latitude: 39.89631551, longitude: 116.323459711 }); const category = '生活服务,娱乐休闲'; wx.navigateTo({ url: 'plugin://chooseLocation/index?key=' + key + '&referer=' + referer + '&location=' + location + '&category=' + category });以上为部分文档代码,自己了解!

June 2, 2020 · 1 min · jiezi

uniapp-H5页面-ios系统软键盘弹出造成点击事件失效

问题描述:苹果系统,软键盘弹出,键盘再收起时,原虚拟键盘位点击事件无效。 排查过程:只有iphonex、iphone6,ihpone7等部分机型会出现该问题; 原因:在IOS下,点击页面中的input时,弹出软键盘时,如果input比较靠下,整个页面会上移,document.body.scrollOffset会由0变成大于0。 软键盘消失后,页面会下移。但是document.body.scrollOffset并不会变成0,所以这时候触控不准; 解决方法:监听input失去焦点时,使页面回正

June 1, 2020 · 1 min · jiezi

uniapp里面computed的妙用

前言:目前小程序市场里面,有两大技术框架比较流行,一个是Taro,一个uni-app,在这边写项目的时候用uni-app比较多,今天就主要讲讲在日常开发小程序使用uni-app的一些经验,其实写uni-app就是在写vue,因为uni-app就结合了vue的语法做了一些处理和封装,生命周期,组件钩子都是跟正常挨罚vue差不多的 需求:封装一个菜单组件,通过首页加载,并使用首页接口返回的某个数据,通过该数据中的字段调用另一个接口,达到渲染菜单组件渲染的目的 首页代码:需求涉及到父子组件的传值,典型的父组件传值给子组件 <!-- 自定义菜单组件 s --><view v-if="item.assemblyType == 6&&item.xcxStatus == 0"> <sd-foot-category :datas="item.items"></sd-foot-category></view><!-- 自定义菜单组件 e -->首页注册组件 import sdFootCategory from "./sdCategoryFootGoodsList/sdFootCategory.vue"; //底部菜单列表组件components: { sdFootCategory },菜单组件代码:通过拿到父组件的传递的props,使用props里面的某个值完成组件渲染,并达到首次加载组件渲染全部数据,待组件内自由切换按钮后再加载其他栏目数据,需求实现的关键点:使用computed. <template> <view class="main" > <view class="main-box"> <view class="footcategory"> <scroll-view class="first-scroll" scroll-x="true"> <view v-for="(o,x) in datas" :key="x" @tap="gotoGetCategoryList(o.id,o.menuLabel)" class="first-box1"> <view class="box"> <text :class="o.id==assemblyContentId?'content-name1':'content-name'">{{o.contentName}}</text> <text :class="o.id==assemblyContentId?'content-title1':'content-title'">{{o.contentTitle}}</text> </view> </view> </scroll-view> </view> <!-- 商品列表 s --> <view class="goodslist"> <view class="goodslist-box" v-for="(goods,y) in goodsInfoList" :key="y" @tap="toDetail(goods)"> <view class="img"> <image :src="goods.sdGoodsVo.image" mode="aspectFill"></image> </view> <view class="info"> <view class="name">{{goods.sdGoodsVo.name}}</view> <view class="sellingPoint">{{goods.sdGoodsVo.sellingPoint?goods.sdGoodsVo.sellingPoint:''}}</view> <view class="flex-direction-row align-items-end"> <view class="price"><text>¥</text>{{goods.sdGoodsVo.salePirce}}</view> <view class="memberPirce"><text>¥</text>{{goods.sdGoodsVo.memberPirce}}</view> <image class="plusImg" src="../../../static/image/goodsdetail/plus.png"></image> </view> </view> </view> <view v-if="isShow" class="nodata-box"> <image src="../../static/image/nodata.png" class="nodata"></image> <view class="nodata-text">暂无商品</view> </view> </view> <!-- 商品列表 e --> </view> </view></template><script> export default { name: "sdFootCategory", //props校验 props: { datas: { type: Array } }, data() { return { goodsinfo: [], smShopInfo: {}, assemblyContentId: this.datas[0].id, goodsInfoList: [], isShow: false } }, //使用computed就能达到首次渲染全部数据的目的,而且当组件内通过按钮加载其他栏目数据时候,computed依赖的goodsInfoList也会发生改变 computed: { //获取列表 getCategoryList(e) { let params = { shopId: uni.getStorageSync('smShopInfo').id, assemblyContentId: this.datas[0].id } this.$http.get(this.$api.customizeList, { data: params }).then(res => { if (res.data.code == 200) { if (!!res.data.data) { this.goodsInfoList = res.data.data.list // console.log(res.data.data.list); console.log(this.isTop); this.isShow = false } else { this.goodsInfoList = []; this.isShow = true } } else { uni.showToast({ title: res.data.msg, duration: 2000, icon: 'none' }); } }) }, }, onLoad(option) { console.log(datas) }, onShow() { console.log(this.datas) this.getCategoryList() }, methods: { //点击后 显示不同的商品 gotoGetCategoryList(id, menuLabel) { let params = { shopId: uni.getStorageSync('smShopInfo').id, assemblyContentId: id } this.$http.get(this.$api.customizeList, { data: params }).then(res => { if (res.data.code == 200) { uni.showToast({ title: '加载中', duration: 1000, icon: 'none' }); if (!!res.data.data) { this.goodsInfoList=res.data.data.list this.isShow = false } else { this.goodsInfoList = []; this.isShow = true } this.assemblyContentId = id } else { uni.showToast({ title: res.data.msg, duration: 2000, icon: 'none' }); } }) }</script>

May 31, 2020 · 2 min · jiezi

uniapp微信小程序登录并使用vuex存储登录态

微信小程序注册登录思路(这是根据自身的项目的思路,不一定每个项目都适用) 1.制作授权登录框,引导用户点击按钮2.uni.login获取code3.把code传给后端接口,后端返回如下数据 openid: "ogtVM5RWdfadfasdfadfadV5s"status: 1// 状态码:status==0(该用户未注册,需调用注册接口) status==1(该用户已注册)4.判断用户是否注册,并调用用户信息接口(1)若已注册则提示登录成功,并调用后台给的获取用户信息的接口,并把数据保存到vuex(2)若未注册则调用注册接口,注册成功之后调获取用户信息接口,并把数据保存到vuex 制作授权登录框我把它写到一个组件里,在需要调用的页面注册该组件authorization.vue组件 <template> <view class="pop"> <view class="pop-main"> <i class="iconfont cancel" @click="cancel">&#xe614;</i> <view class="pop-title">需要您的授权</view> <view class="pop-text"> <view>为了提供更好的服务</view> <view>请在稍后的提示框中点击允许</view> </view> <image class="pop-imgsize" src="../static/images/aut.png" mode=""></image> <!-- 微信小程序的引导按钮,可以获取到用户信息 getuserinfo函数调用请求下面会讲到--> <button type="primary" class="reserve-btn" open-type="getUserInfo" @getuserinfo="getuserinfo">我知道了</button> </view> </view></template><script> import app from '../common/config.js' export default { data() { return { }; }, methods: { getuserinfo(res) { // 调用封装在app的_getuserinfo函数,_getuserinfo函数执行用户获取code,传code给后台,调用注册接口 app._getuserinfo(res) }, cancel() { this.$emit('cancelChild',false) } } }</script><style scoped>.pop { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,.3); z-index: 9999; display: flex; justify-content: center; align-items: center;}.pop-main { width: 690upx; height: 800upx; box-sizing: border-box; background-color: #FFFFFF; border-radius: 20upx; position: relative; display: flex; flex-direction: column; align-items: center; font-size: 14px; padding: 64upx 0upx 40upx 0upx;}/* 删除按钮 */.cancel { position: absolute; top: 20upx; right: 20upx; font-size: 20px;}.pop-title { padding-bottom: 40upx; width: 100%; border-bottom: 1px solid #BFBFBF; font-size: 16px; letter-spacing: 2px; text-align: center;}.pop-imgsize { width: 484upx; height: 406upx;}.pop-text { width: 75%; text-align: center; font-size: 15px; margin: 30upx 0upx; letter-spacing: 1px;}button { background-color: #08BF00; color: #FFFFFF; text-align: center; height: 88upx; line-height: 88upx; font-size: 14px; border-radius: 50upx; width: 78%;}</style>在个人中心页注册该组件 ...

November 2, 2019 · 3 min · jiezi

解析并截取小程序二维码上的参数转载

小程序分享二维码思路:a分享二维码给b,二维码上带有a的标识ppidb接收a的二维码打开页面,将接收到的ppid传递给后台,后台就可以知道b是通过a的二维码打开的页面 1.在后台设置识别二维码进入的页面,这里用index页面。2.在index页面是接收二维码里面的参数,解析并截取获取。二维码的参数格式:scene=ppid:12 export default { data() { return { ppid: "", } }, onLoad(option) { // 解析二维码里面的参数获得ppid this.ppid = this.scene_decode(decodeURIComponent(option.scene)).ppid //封装的scene_decode() 方法 if(this.ppid) { //我这里是把ppid存进vuex,然后在b注册时,把ppid传给后台 this.saveppid(this.ppid)// ppid 存进vuex } }, methods: { // 截取ppid的方法 scene_decode(scene) { var _str = scene + ""; var _str_list = _str.split(","); var res = {}; for (var i in _str_list) { var _tmp_str = _str_list[i]; var _tmp_str_list = _tmp_str.split(":"); if (_tmp_str_list.length > 0&&_tmp_str_list[0]) { res[_tmp_str_list[0]] = _tmp_str_list[1] || null; } } return res; } }}vuex里面存ppid的方法 ...

November 2, 2019 · 2 min · jiezi

uniapp-上传图片预览图片

<view class="setting-item"> <text class="item-title" @click="preview">头像</text> <view class="item-right" @click="changeImg"> <!-- userinfo.headimgurl是用户登陆的头像也就是未更改时的头像 changeimg是用户更改后的头像 --> <image class="headimgsize" :src="userinfo.headimgurl || changeimg" mode=""></image> <i class="iconfont">&#xe625;</i> </view></view>data() { return { changeimg: '', // 更改后的头像 }},// 获取vuex的数据computed: mapState({ userinfo: state => state.userinfo}),methods: { changeImg() { uni.chooseImage({ success: (chooseImageRes) => { const tempFilePaths = chooseImageRes.tempFilePaths; this.changeimg = tempFilePaths[0] uni.uploadFile({ url: app.apiUrl+'small/index/indexdata', //仅为示例,非真实的接口地址 filePath: tempFilePaths[0], name: 'headimgurl', formData: { openid: uni.getStorageSync('openid') }, success: (res) => { console.log(JSON.parse(res.data)) var res = JSON.parse(res.data) if (res.status) { app.getUserData() //这里调用用户信息接口更新数据存进vuex uni.showToast({ title:res.msg, icon:'none', duration:2000 }) }else { uni.showToast({ title:res.msg, icon:'none', duration:2000 }) } } }); } }); },}预览图片:我把点击事件放在“头像”,点击头像可预览图片,实际应用中是不会这么设计的哈 ...

November 2, 2019 · 1 min · jiezi

uniapp开发一个小视频应用三

一、前情回顾uni-app开发一个小视频应用(一) uni-app开发一个小视频应用(二) 二、创建城市页面首页导航栏上有一个城市选择页面,点击会切换到城市页面,切换到城市页面的过程中并没有路由的跳转,而只是tab的切换,所以需要将城市页面设置为tabBar页面,即将城市页面添加到tabBar的list数组中。// components/city/city.vue <template> <view class="city"> <!--城市页面和首页是共用一个导航的tabBar的--> <index-header></index-header> <tab-bar></tab-bar> </view></template><style scoped> .city { <!--城市页面全屏显示,并且背景为黑色--> width: 100%; height: 100%; background: #000000; }</style>三、创建位置组件城市页面中需要显示当前所在城市定位信息以及城市切换按钮,即分为左右两部分,这里有一个问题,就是将位置组件加到城市页面中后,由于头部导航采用固定定位脱离文档流了,而位置组件需要放到头部导航栏的下发,所以需要给位置组件设置一个margin-top,但是由于其父元素即城市页面没有设置边框,会有外边距溢出的问题,即位置组件设置的外边距会转移到城市页面上,导致整个城市页面会有一个margin-top,要解决这个问题有多种方式,主要就是对父元素(城市页面)进行设置: 第一种就是给父元素加一个边框,这种会改变父元素布局,显然不合适,第二种是给父元素添加over-flow:hidden;对溢出部分进行隐藏,第三种是通过css为类在父元素中添加一个table元素,如:// components/location.vue <template> <view class="location"> <view class="iconfont icon-dingwei location-left"> &nbsp;自动定位: 上海 </view> <view class="location-right"> 切换 <text class="iconfont icon-dayuhao dayuhao"></text> </view> </view></template><style> .location { width: 100%; height: 40px; color: #aaaaaa; margin-top: 60px; overflow: hidden; display: flex; } .location-left { text-align: center; margin-left: 20px; height: 40px; line-height: 40px; font-size: 12px; } .location-right { flex: 1; text-align: right; padding-right: 20px; height: 40px; line-height: 40px; font-size: 12px; } .dayuhao { font-size: 12px; }</style>// pages/city/city.vue ...

October 5, 2019 · 2 min · jiezi

uniapp开发一个小视频应用二

一、前情回顾uni-app开发一个小视频应用(一) 上篇文章,我们已经实现了首页的头部导航栏组件、底部的tabBar导航栏组件、中间的视频列表组件以及视频列表组件中的视频播放组件,传入视频列表渲染后已经可以上下滑动进行视频切换和播放,接下来我们将完成首页的剩余部分,左侧信息栏组件、右侧图标栏组件,以及完善视频切换动画、播放控制等功能。二、创建左侧信息栏组件左侧的信息栏组件,主要分三块: 作者名、视频标题名、音乐名。这个左侧信息栏信息是和当前播放视频相关联的,所以应该在循环视频列表的时候,将左侧信息栏组件一起渲染出来,所以左侧信息栏组件应该加到<swiper-item>中。// components/list-left.vue <template> <view class="list-left"> <view class="author"> @祝晓晗 </view> <view class="title"> 妈呀,遇到老同学了,缘分呐! @老丈人说车 @抖音小助手 </view> <view class="music-box"> <!--该music-box主要是为了在music内容滚动的时候在超出music-box范围后能够隐藏超出部分--> <view class="music"> @祝晓晗创作的原声 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @祝晓晗创作的原声 </view> </view> </view></template><style scoped> .list-left{ width: 70%; height: 120px; color: white; } .author { height: 35px; line-height: 35px; font-size: 17px; } .title { width: 100%; line-height: 25px; font-size: 12px; word-wrap: break-word; color: #FFFAF0; } .music-box { overflow: hidden; <!--滚动的时候超出部分隐藏--> width: 70%; } .music { width: 200%; height: 35px; line-height: 35px; font-size: 12px; animation: scroll-x 5s linear 0.2s infinite; <!--应用动画--> } @keyframes scroll-x{ <!--添加文字水平滚动动画--> 0% { transform: translate3d(80%, 0, 0); <!--80%位置出现,然后向左边滚动--> } 100% { transform: translate3d(-80%, 0, 0); <!--动画结束后到达-80%位置--> } }</style>// components/video-list.vue ...

October 1, 2019 · 4 min · jiezi