年华似丶流水 發表於 2021-9-3 17:50:00

uni-app 小程序从零开始的开发流程

<h2 class="md-end-block md-heading">前言</h2>
<p class="md-end-block md-p"><span class="md-plain">本文基于 HBuilderX 3.1.22 + 微信开发者工具 1.05.2106300为主要内容进行说明。<br></span></p>
<p class="md-end-block md-p"><span><em>文档版本:1.0.2</em></span></p>
<p class="md-end-block md-p md-focus"><span class="md-expand"><em>更新时间:2021-09-04 16:42;&nbsp;<em>2021-10-22 13:46;</em></em></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">一、准备</span></h2>
<p class="md-end-block md-p"><span class="md-plain"> <span class="md-tab"> <span><code>uni-app</code><span class="md-plain"> 是一个使用 <span class=" md-link"><span class="md-plain">Vue.js</span><span class="md-plain"> 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/QQ/快手/钉钉/淘宝)、快应用等多个平台。 </span></span></span></span></span></span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">1.1 软件安装</span></h3>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">创建uni-app有两种,一个是通过 HBuilderX 可视化界面,另一个是通过vue-cli命令行。本文档以HbuilderX为创建说明,以微信开发者工具进行运行项目和代码说明。</span></span></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">HbuilderX 下载地址:<span class="md-link">https://www.dcloud.io/hbuilderx.html</span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">HbuilderX 文档地址:<span class="md-link">https://hx.dcloud.net.cn/Tutorial/startup</span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">微信开发者工具下载地址:<span class="md-link">https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html</span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">HbuilderX安装结束后,一般需要下载开发项目需要的插件,选择<span><strong>工具--&gt;插件安装</strong><span class="md-plain">--&gt;安装或去市场插件查找下载,然后放到目录下的uni_modules文件夹(安装时候自动生成),如scss/sass编译,App真机运行等。</span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">微信开发者工具安装结束后,在工具栏上选择 <span><strong>设置--&gt;通用设置--&gt;安全--&gt;打开服务端口</strong><span class="md-plain">。</span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">其次,在微信开发者平台(<span class="md-link">https://open.weixin.qq.com/<span class="md-plain">)注册开发者账号,找到自己的开发ID,AppId,并记录好,为项目从HbuilderX运行到微信开发者工具做准备。</span></span></span></span></p>
<p class="md-end-block md-p">然后,在微信公众平台(https://mp.weixin.qq.com/)注册对应的账号,比如本次注册的是小程序,则微信开发者APPID如下图中找到:</p>
<p class="md-end-block md-p"><img src="https://img2020.cnblogs.com/blog/1338464/202110/1338464-20211022133401969-1151715600.png"></p>
<p id="1634880844826">&nbsp;<span class="md-tab"><span class="md-plain"><span class="md-link"><span class="md-plain">接着配置微信开发者工具的AppId,在微信开发者工具界面点击右上角<strong>详情-&gt;基本信息-&gt;AppId</strong><span class="md-plain">进行配置,如下图:</span></span></span></span></span></p>
<p><span class="md-tab"><span class="md-plain"><span class="md-link"><span class="md-plain"><span class="md-plain"><img src="https://img2020.cnblogs.com/blog/1338464/202110/1338464-20211022133617360-1602211702.jpg"></span></span></span></span></span></p>
<p><span class="md-tab"><span class="md-plain"><span class="md-link"><span class="md-plain"><span class="md-plain">开发环境下配置:点击右上角<strong>详情-&gt;本地设置-&gt;打钩"不校验合法域名....",如下图:</strong></span></span></span></span></span></p>
<p><span class="md-tab"><span class="md-plain"><span class="md-link"><span class="md-plain"><span class="md-plain"><strong><img src="https://img2020.cnblogs.com/blog/1338464/202110/1338464-20211022133709590-1415289297.jpg"></strong></span></span></span></span></span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">1.2 vue入门</span></h3>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">由于uni-app是以vue为基础的小程序开发,所以使用uni-app之前需要对vue有一定的了解。</span></span></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">vue 文档地址:<span class="md-link">https://vuejs.bootcss.com/guide/</span></span></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">二、基于HbuilderX 的uni-app项目搭建</span></h2>
<h3 class="md-end-block md-heading"><span class="md-plain">2.1 创建项目</span></h3>
<p class="md-end-block md-p"><span class="md-plain">1.在点击工具栏里的<span><strong>文件 -&gt; 新建 -&gt; 项目</strong><span class="md-plain">:</span></span></span></p>
<p class="md-end-block md-p"><img src="https://img2020.cnblogs.com/blog/1338464/202109/1338464-20210903173444781-633118041.png"></p>
<p class="md-end-block md-p"><span class="md-plain">2.选择<span><code>uni-app</code><span class="md-plain">类型,输入工程名,选择模板,点击创建,即可成功创建。</span></span></span></p>
<p class="md-end-block md-p"><img src="https://img2020.cnblogs.com/blog/1338464/202109/1338464-20210903173455177-1575878714.png"></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">uni-app自带的模板有 Hello uni-app ,是官方的组件和API示例。还有一个重要模板是 uni ui项目模板,日常开发可以参考该模板,毕竟这个模板已内置大量常用组件。</span></span></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">然后在HBuilder X内工具栏点击 <span><strong>运行</strong><span class="md-plain">—&gt;<span><strong>运行到小程序模拟器</strong><span class="md-plain"> --&gt;<span><strong>微信开发者工具</strong><span class="md-plain">,便能初步看到运行成效。</span></span></span></span></span></span></span></span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">2.2 目录补充搭建</span></h3>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">本次创建使用默认版本,创建后的目录如下:</span></span></p>
<p class="md-end-block md-p"><img src="https://img2020.cnblogs.com/blog/1338464/202109/1338464-20210903173507361-448013673.png"></p>
<p class="md-end-block md-p"><span class="md-plain">1 根据需要给项目搭建相应的目录结构。尚未下载依赖和市场插件之前,创建需要的文件夹和文件:</span></p>
<p class="md-end-block md-p"><img src="https://img2020.cnblogs.com/blog/1338464/202109/1338464-20210903173519133-1574410192.png"></p>
<p class="md-end-block md-p"><span class="md-plain">2 如果要下载vue,vuex等依赖,在之前需要先安装node.js,并且安装好node的包管理器(npm,cnpm,yarn等,一个即可,本文档以npm为例)</span></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">node相关地址:<span class="md-link">http://nodejs.cn/</span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">安装教程:<span class="md-link">https://www.runoob.com/nodejs/nodejs-install-setup.html</span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab"> <span><strong>A</strong><span class="md-plain">. 初始化package.json文件</span></span></span></p>
<p class="md-end-block md-p"><img src="https://img2020.cnblogs.com/blog/1338464/202109/1338464-20210903173537181-784420698.png"></p>
<p class="md-end-block md-p"><span class="md-tab"> <span><strong>B</strong><span class="md-plain">.使用代码,其中注意最好加上--save</span></span></span></p>
<div class="cnblogs_code">
<pre>  npm install vue --<span style="color: rgba(0, 0, 0, 1)">save<br>  npm install vuex --save
  </span>npm install uview-ui --save</pre>
</div>
<p>下载vue和uview依赖。其中,vue是开发uni-app必要的依赖,uview则是uni-app生态的一个优秀的UI框架,本文档以uview作为前端UI开发框架为基础进行开发搭建。执行下载后,项目会自动把依赖放进node_modules文件夹内,可在node_modules文件夹进行查看。然后下载开发项目需要的市场插件,市场插件默认自行创建插件所在文件夹uni_modules,并存放插件于此。</p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">vue相关地址:<span class="md-link">https://vuejs.bootcss.com/guide/</span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain md-expand">vuex相关地址:<span class="md-link md-expand">https://vuex.vuejs.org/zh/installation.html</span></span></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">uview相关地址:<span class="md-link">https://www.uviewui.com/components/intro.html</span></span></span></p>
<p class="md-end-block md-p"><img src="https://img2020.cnblogs.com/blog/1338464/202109/1338464-20210903173551328-560580420.png"></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">最后,创建页面和对应页面的api文件(本文档仅以登录页面、主页面和登录api文件为例),这样一个基本的结构接搭建好了,最终结构目录大体如下:</span></span></p>
<p class="md-end-block md-p"><img src="https://img2020.cnblogs.com/blog/1338464/202109/1338464-20210903173605859-680961387.png"></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">其中.hbuilderx,unpackage文件夹是自动生成,不必自主创建。node_modules,uni_modules文件夹里的文件最好不必去改动。</span></span></p>
<p class="md-end-block md-p"><span class="md-tab"> <span><strong>C</strong><span class="md-plain">.目录结构说明如下:</span></span></span></p>
<table class="md-table">
<thead>
<tr class="md-end-block"><th><span class="td-span"><span>层级<span class="md-plain">1</span></span></span></th><th><span class="td-span"><span class="md-plain">层级2</span></span></th><th><span class="td-span"><span class="md-plain">层级3</span></span></th><th><span class="td-span"><span>描述</span></span></th></tr>
</thead>
<tbody>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">api</span></span></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">各个模块接口文件夹</span></span></td>
</tr>
<tr class="md-end-block">
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">login.js</span></span></td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">登录模块接口文件</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">common</span></span></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">公共模块,包含公共基础css等</span></span></td>
</tr>
<tr class="md-end-block">
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">base.css</span></span></td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">公共基础css</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">components</span></span></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">符合vue组件规范的uni-app组件目录</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">node_modules</span></span></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">nodejs相关依赖包文件目录</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">pages</span></span></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">业务页面文件存放的目录</span></span></td>
</tr>
<tr class="md-end-block">
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">index</span></span></td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">index文件夹</span></span></td>
</tr>
<tr class="md-end-block">
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">index.vue</span></span></td>
<td><span class="td-span"><span class="md-plain">主页面</span></span></td>
</tr>
<tr class="md-end-block">
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">login</span></span></td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">login文件夹</span></span></td>
</tr>
<tr class="md-end-block">
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">index.vue</span></span></td>
<td><span class="td-span"><span class="md-plain">登录主页面</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">static</span></span></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">存放应用引用的本地静态资源(如图片、视频等)的目录,注意:静态资源只能存放于此,不要放css文件</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">store</span></span></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">vuex目录,也是存放公共属性方法的地方</span></span></td>
</tr>
<tr class="md-end-block">
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">index.js</span></span></td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">vuex的主文件</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">uni_modules</span></span></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">插件市场下载的第三方UI组件目录,存放<span class=" md-link"><span class="md-plain">uni_module</span><span class="md-plain">规范的插件。</span></span></span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">unpackage</span></span></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">打包目录,这里有各个平台的打包文件。</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">utils</span></span></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">全局公共方法目录</span></span></td>
</tr>
<tr class="md-end-block">
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">common.js</span></span></td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">封装的公共可复用的方法属性文件(针对当前项目)</span></span></td>
</tr>
<tr class="md-end-block">
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">request.js</span></span></td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">封装的公共请求方法文件</span></span></td>
</tr>
<tr class="md-end-block">
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">utils.js</span></span></td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">封装的公共可复用的方法属性文件(针对所有项目)</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">App.vue</span></span></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">应用配置文件,用来配置App全局样式以及监听应用生命周期</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">main.js</span></span></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">Vue初始化入口文件</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">manifest.json</span></span></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">配置应用名称、appid、logo、版本等打包信息的文件</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">package.json</span></span></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">项目配置信息文件,依赖模块的定义</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">package-lock.json</span></span></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>
<p><span class="td-span"><span class="md-plain">1.锁定包的版本,确保再次下载时不会因为包版本不同而产生问题</span></span></p>
<p><span class="td-span"><span class="md-plain"><span class="md-br md-tag"> <span class="md-plain">2.加快下载速度,因为该文件中已经记录了项目所依赖第三方包的树状结构和包的下载地址,重新安装时只需下载即可,不需要做额外的工作</span></span></span></span></p>
</td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">pages.json</span></span></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">配置页面路由、导航条、选项卡等页面类信息的文件</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">uni.scss</span></span></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">自带的公共的css修饰文件</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">README.md</span></span></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><span class="td-span"><span class="md-plain">文档说明,可包含目录文件名称对比,注意事项,框架使用,技术架构,Git或SVN地址,账号密码等</span></span></td>
</tr>
</tbody>
</table>
<p class="md-end-block md-p"><span class="md-plain"> <span class="md-tab"> <span class="md-plain">由于在pages创建了登录页面,所以需要到pages.json去配置相关路径。</span></span></span></p>
<h4 class="md-end-block md-heading"><span class="md-plain">pages.json</span></h4>
<div class="cnblogs_code">
<pre>    "pages"<span style="color: rgba(0, 0, 0, 1)">: [
      {
            </span>"path": "pages/login/index"<span style="color: rgba(0, 0, 0, 1)">,
            </span>"style"<span style="color: rgba(0, 0, 0, 1)">: {
                </span>"navigationBarTitleText": "登录"<span style="color: rgba(0, 0, 0, 1)">
            }
      },
      {
            </span>"path": "pages/index/index"<span style="color: rgba(0, 0, 0, 1)">,
            </span>"style"<span style="color: rgba(0, 0, 0, 1)">: {
                </span>"navigationBarTitleText": "首页"<span style="color: rgba(0, 0, 0, 1)">
            }
      }
    ]</span></pre>
</div>
<p>&lt;!--注意:--&gt;</p>
<ul class="ul-list" data-mark="-">
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">编译到任意平台时,static 目录下的文件均会被完整打包进去,且不会编译。</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">非 static 目录下的文件(vue、js、css 等)只有被引用到才会被打包编译进去。static 目录下的 js 文件不会被编译,如果里面有 es6 的代码,不经过转换直接运行,在手机设备上会报错。</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">css、less/scss 等资源不要放在 static 目录下,建议这些公用的资源放在自建的 common 目录下。</span></p>
</li>
</ul>
<h3 class="md-end-block md-heading"><span class="md-plain">2.3 搭建目录文件代码</span></h3>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">根据需要,我们写一个简单的登录,使用登录功能来阐述各个目录文件之间的联系。</span></span></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">首先,我们先把已创建的相关文件进行挂载到全局,即在main.js或者App.vue写相关代码:</span></span></p>
<h4><span class="md-plain">main.js</span></h4>
<p class="md-end-block md-p"><img src="https://img2020.cnblogs.com/blog/1338464/202109/1338464-20210903173942477-1617537019.png"></p>
<h4 class="md-end-block md-heading"><span class="md-plain">App.vue</span></h4>
<p class="md-end-block md-p"><img src="https://img2020.cnblogs.com/blog/1338464/202109/1338464-20210903173953567-810041919.png"></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">然后在被引入的文件写必要的内容信息:</span></span></p>
<h4 class="md-end-block md-heading"><span class="md-plain">base.css</span></h4>
<div class="cnblogs_code">
<pre>  .clearfix:before{content:" "<span style="color: rgba(0, 0, 0, 1)">;display:table}
  .clearfix:after{content:</span>" "<span style="color: rgba(0, 0, 0, 1)">;display:table;clear:both}
  .fl{</span><span style="color: rgba(0, 0, 255, 1)">float</span><span style="color: rgba(0, 0, 0, 1)">:left}
  .fr{</span><span style="color: rgba(0, 0, 255, 1)">float</span>:right}</pre>
</div>
<h4 class="md-end-block md-heading"><span class="md-plain">request.js</span></h4>
<div class="cnblogs_code">
<pre>export <span style="color: rgba(0, 0, 255, 1)">default</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> request({
    url,
    method </span>= "GET"<span style="color: rgba(0, 0, 0, 1)">,
    params </span>=<span style="color: rgba(0, 0, 0, 1)"> {},
    header,
    loadding </span>= <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
    loaddingText </span>= "加载中..."<span style="color: rgba(0, 0, 0, 1)">
}) {
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span> Promise((resolve, reject) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {

      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (loadding) {
            uni.showLoading({
                title: loaddingText
            })
      }
      setTimeout(() </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            uni.request({
                url,
                method,
                data: params,
                header,
                success: (res) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (res) {
                        resolve(res.data)
                  } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                        resolve(res)
                  }
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (loadding) {
                        uni.hideLoading()
                  }
                },
                fail: (res) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                  reject(res)
                }
            })
      }, </span>1000<span style="color: rgba(0, 0, 0, 1)">)
    }).</span><span style="color: rgba(0, 0, 255, 1)">catch</span>(err =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 这里既可以捕获throw的异常也可以捕获reject的异常</span>
      console.log(":"<span style="color: rgba(0, 0, 0, 1)">, err)
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (loadding) {
            uni.hideLoading()
      }<br>     return Promise.reject(err)
    })
}</span></pre>
</div>
<h4 class="md-end-block md-heading"><span class="md-plain">common.js</span></h4>
<div class="cnblogs_code">
<pre>export <span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
    BASE_URL:</span>""<span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">然后我们开始写登录页面。登录页面需要写用户名、密码、登录按钮三个组件,则需要使用uview创建。使用uview创建组件之前的几个确保:</span></span></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">确保1 <span><code>HBuilder X</code><span class="md-plain"> 是安装了 <span><code>scss/sass</code><span class="md-plain"> 编译插件 </span></span></span></span></span></span></p>
<p class="md-end-block md-p"><img src="https://img2020.cnblogs.com/blog/1338464/202109/1338464-20210903174300698-1257547902.png"></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">确保2 在根目录下 <span><code>uni.scss</code><span class="md-plain"> 文件中引入 <span><code>uview-ui/theme.scss</code></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre>@import 'uview-ui/theme.scss';</pre>
</div>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">确保3 在根目录下 <span><code>App.vue</code><span class="md-plain"> 文件中的style代码块添加 <span><code>lang="scss"</code><span class="md-plain">属性 和 引入 <span><code>uview-ui/index.scss</code></span></span></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">style </span><span style="color: rgba(255, 0, 0, 1)">lang</span><span style="color: rgba(0, 0, 255, 1)">="scss"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(128, 0, 0, 1)">
    @import "uview-ui/index.scss";
</span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">确保4 在根目录下<span><code>main.js</code><span class="md-plain">文件中 引入并使用uView的JS库,注意这两行要放在<span><code>import Vue</code><span class="md-plain">之后。 </span></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">import uView from "uview-ui";
Vue.use(uView);</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">如果是不想书写引入文件代码,即我们每当引入一个UI组件,就需要添加</span></span></p>
<div class="cnblogs_code">
<pre>import xxx from "uView-ui/components/u-xxx/u-xxx.vue";</pre>
</div>
<p class="md-end-block md-p"><span class="md-plain">等相关代码。则需要确保5 在根目录下pages.json文件中 ,配置easycom组件模式</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> pages.json</span>
<span style="color: rgba(0, 0, 0, 1)">{
    </span>"easycom"<span style="color: rgba(0, 0, 0, 1)">: {
      </span>"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"<span style="color: rgba(0, 0, 0, 1)">
    },
   
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 此为本身已有的内容</span>
    "pages"<span style="color: rgba(0, 0, 0, 1)">: [
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> ......</span>
<span style="color: rgba(0, 0, 0, 1)">    ]
}</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">接着我们在pages/login/index.vue,即登录页面中,引入uview组件和书写登录代码:</span></span></p>
<h4 class="md-end-block md-heading"><span class="md-plain">pages/login/index.vue</span></h4>
<div class="cnblogs_code">
<pre>&lt;template&gt;
    &lt;view class="content"&gt;
      &lt;view class="inp"&gt;
            &lt;u-input v-model="username" type="text" :border="true" placeholder="请输入用户名" /&gt;
      &lt;/view&gt;
      &lt;view class="inp"&gt;
            &lt;u-input v-model="password" type="password" :border="true" placeholder="请输入密码" /&gt;
      &lt;/view&gt;
      &lt;view class="inp"&gt;
            &lt;u-button type="primary" shape="circle" style="margin-top: 40rpx;" @click="onLogin"&gt;登录&lt;/u-button&gt;
      &lt;/view&gt;
    &lt;/view&gt;
&lt;/template&gt;

&lt;script&gt;<span style="color: rgba(0, 0, 0, 1)">
    import {
      login
    } from </span>'@/api/login.js'<span style="color: rgba(0, 0, 0, 1)">
    export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
      data() {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
                username: </span>''<span style="color: rgba(0, 0, 0, 1)">,
                password: </span>''<span style="color: rgba(0, 0, 0, 1)">
            }
      },
      onLoad() {

      },
      methods: {
            onLogin() {
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> #ifdef MP-WEIXIN</span>
<span style="color: rgba(0, 0, 0, 1)">                uni.login({
                  success: res0 </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                        login({
                            params: {
                              username: </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.username,
                              password: </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.password,
                              code: res0.code
                            },
                            loadding: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
                            loaddingText: </span>"登录中..."<span style="color: rgba(0, 0, 0, 1)">
                        }).then(res </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.$store.state.userinfo =<span style="color: rgba(0, 0, 0, 1)"> res
                            </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (res) {
                              uni.reLaunch({
                                    url: </span>"../index/index"<span style="color: rgba(0, 0, 0, 1)">
                              })
                            } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                              uni.showToast({
                                    title: </span>"登录失败"<span style="color: rgba(0, 0, 0, 1)">,
                                    duration: </span>1000<span style="color: rgba(0, 0, 0, 1)">,
                                    icon: </span>"none"<span style="color: rgba(0, 0, 0, 1)">
                              })
                            }
                        })
                  },
                  fail: err </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                        console.log(</span>"fail:"<span style="color: rgba(0, 0, 0, 1)">, err)
                  }
                })
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> #endif</span>
                <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> #ifdefH5</span>
<span style="color: rgba(0, 0, 0, 1)">                uni.reLaunch({
                  url: </span>"../index/index"<span style="color: rgba(0, 0, 0, 1)">
                })
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> #endif</span>
<span style="color: rgba(0, 0, 0, 1)">            }
      }
    }
</span>&lt;/script&gt;

&lt;style scoped lang="scss"&gt;<span style="color: rgba(0, 0, 0, 1)">
    .content {
      padding: 20px;

      .inp {
            margin: 10px;
      }
    }
</span>&lt;/style&gt;</pre>
</div>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">以上代码为先进行获取用户登录凭证code,然后才正式登录。因为开发者需要在开发者服务器后台,使用 code 换取 openid 和 session_key 等信息。然后使用得到的code,和用户名密码一起作为参数进行真正的登录请求。其中,样式最好内聚在组件内,组件内部使用的样式,尽量在<span><code>style</code><span class="md-plain">中添加<span><code>scoped</code><span class="md-plain">,编译时会增加组件<span><code>hash</code><span class="md-plain">前缀来防止样式污染。</span></span></span></span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-tab"> <span><strong><span><em>login页面</em></span></strong><span class="md-plain"> 有请求数据,则需要写login.js请求接口:</span></span></span></p>
<h4 class="md-end-block md-heading"><span class="md-plain">login.js</span></h4>
<div class="cnblogs_code">
<pre>import common from '@/utils/common.js'<span style="color: rgba(0, 0, 0, 1)">
import request from </span>'@/utils/request.js'

<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 登录</span>
export async <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> login(payload) {
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> await request({
      url: common.BASE_URL </span>+ "http://rap2api.taobao.org/app/mock/229799/http://login"<span style="color: rgba(0, 0, 0, 1)">,
      method: </span>"POST"<span style="color: rgba(0, 0, 0, 1)">,
      params: payload.params,
      loadding: payload.loadding,
      loaddingText: payload.loaddingText
    })
}</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-tab"><span><strong><span><em>login页面</em></span></strong><span class="md-plain"> 有使用 <span><em>this.$store.state</em><span class="md-plain">,则需要对store/index.js写代码:</span></span></span></span></span></p>
<h4 class="md-end-block md-heading"><span class="md-plain">store/index.js</span></h4>
<div class="cnblogs_code">
<pre>import Vue from 'vue'<span style="color: rgba(0, 0, 0, 1)">;
import Vuex from </span>"vuex"<span style="color: rgba(0, 0, 0, 1)">;
Vue.use(Vuex);

export </span><span style="color: rgba(0, 0, 255, 1)">default</span> <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Vuex.Store({
    state: {
      userinfo: </span>""<span style="color: rgba(0, 0, 0, 1)">
    },
    actions: {

    },
    mutations: {

    },
    getters: {

    }
})</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">到此,直接点击工具栏上的<span><strong>运行--&gt;运行到小程序模拟器--&gt;微信开发者工具</strong><span class="md-plain">,结果如下图所示:</span></span></span></span></p>
<p class="md-end-block md-p"><img src="https://img2020.cnblogs.com/blog/1338464/202109/1338464-20210903174528042-180659992.png"></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">然后如果要进行调试,则需要打开调试器,点击调试器界面的source选项,找到对应的代码文件,进行断点调试,比如:</span></span></p>
<p class="md-end-block md-p"><img src="https://img2020.cnblogs.com/blog/1338464/202109/1338464-20210903174548427-1337926548.png"></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">或者直接使用H5模式运行到浏览器,在移除相关会影响代码调试的微信开发者工具方法或属性后,在网页上打开控制台进行调试代码。需要注意的是,部分样式在H5和微信小程序中显示有区别,尽量以小程序显示为主。</span></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">三、打包发行</span></h2>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">使用hbuilderx进行打包发行小程序,点击工具栏的<span><strong>发行 --&gt; 小程序-微信</strong><span class="md-plain">,然后它会自主打开微信开发者工具界面,这时候我们点击右上角的<span><strong>上传按钮,填写版本号、描述相关信息 - 确定</strong><span class="md-plain">即可。</span></span></span></span></span></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">四、注意事项</span></h2>
<h3 class="md-end-block md-heading"><span>事项1</span></h3>
<div class="cnblogs_code">
<pre>@import "uview-ui/index.scss";</pre>
</div>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">如果引入在除了App.vue之外的文件,而App.vue本身没有引入,可能会引起样式不全修饰等问题,比如登录的密码输入框,当输入密码时候显示清空按钮,此时会让密码框下移。</span></span></p>
<h3 class="md-end-block md-heading"><span>事项2</span></h3>
<p class="md-end-block md-p"><span class="md-plain">打包微信小程序只有包小于2MB才能上传。</span></p><br><br>
来源:https://www.cnblogs.com/Chansea/p/15224176.html
頁: [1]
查看完整版本: uni-app 小程序从零开始的开发流程