WeChat小程序开发(五、前端总结)
<div style="margin: 3%; font-size: 1.2em; font-family: "幼圆"; text-decoration: none"><p>关于前端的知识,如果讲的稍微细一点,即使是总结性的分享也会有不少的知识点,况且我的实战经验不多,在微信小程序方面作为有一点基础的初学者也学了一周的时间,我打算下一周开始进行后端开发的学习,八月开始进行项目实战。所以这个随笔也是一周的总结的知识分享,如果有不正确不合理的地方,希望大家指出。</p>
<p> </p>
<p>对于一款微信小程序,必然涉及前端和后端部分,前端设计界面效果和一定的逻辑应用,后端则是有关数据库管理,对前端的接口函数等处理。微信对后端的开发提供了简易版的云开发,只需要掌握JavaScript就可以实现后端的一些功能,但是微信的云开发局限性很大,不适合稍微大一点,自由度广一点的程序。</p>
<p> </p>
<p>新建一个新的小程序,根据目录上的文件可以分为全局配置文件(app.js,app.json,app.wxss,project.config.json等)和页面配置文件(pages文件夹下的文件)</p>
<p> </p>
<p>这里主要有四类型的文件,分别是json,js,wxml,和wxss文件。</p>
<p>json文件管理的主要是窗口的一些熟悉,而app.json里还包括tarbar导航条,页面目录的管理。这里注意,<strong>不在app.json注册过页面目录的页面无法进行调用</strong>。并且这里的<strong>不同页面的目录顺序默认决定进入小程序后进入页面的顺序</strong>。</p>
<p> </p>
<p>wxss文件是全局的页面样式渲染文件,但是当页面的局部样式文件中有属性值相互冲突,则<strong>局部样式文件里的属性值优先</strong>。</p>
<p> </p>
<p>对于一张页面,有它的渲染文件和逻辑文件,wxml和wxss组合主要实现页面的组件实现,总体布局和渲染效果,而js文件则处理逻辑方面。</p>
<p> </p>
<p>我们刚启动一个小程序,最开始执行的是在app.js文件里的 <span class="cnblogs_code">App()</span> 函数(小程序的注册),App函数的基本结构如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">App({
onLaunch: </span><span style="color: rgba(0, 0, 255, 1)">function</span><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)"> wx.login({
})
</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)"> wx.getSetting({
})
},
globalData: {
}
})</span></pre>
</div>
<p> </p>
<p>这里有个关键的原生函数: <span class="cnblogs_code">onLaunch()</span> 。第一次打开小程序(之前小程序并不在后台),则执行onLauch()函数,这里一般会有一些获取用户授权并调用API接口连接后端获取openid等操作。</p>
<p>其他的具体在设计生命周期时具体再讲。</p>
<p>App()中也有全局变量globalData,在其他页面中调用全局变量可在js上使用 <span class="cnblogs_code">const app=getApp()</span> 来实现。</p>
<p> </p>
<p>当调用具体页面地址时,我们在逻辑层首先进入的是Page()函数,Page()的基本结构如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">Page({
</span><span style="color: rgba(0, 128, 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)">
data: {
},
</span><span style="color: rgba(0, 128, 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)">
onLoad: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (options) {
},
</span><span style="color: rgba(0, 128, 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)">
onReady: </span><span style="color: rgba(0, 0, 255, 1)">function</span><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, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
onShow: </span><span style="color: rgba(0, 0, 255, 1)">function</span><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, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
onHide: </span><span style="color: rgba(0, 0, 255, 1)">function</span><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, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
onUnload: </span><span style="color: rgba(0, 0, 255, 1)">function</span><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, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
onPullDownRefresh: </span><span style="color: rgba(0, 0, 255, 1)">function</span><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, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
onReachBottom: </span><span style="color: rgba(0, 0, 255, 1)">function</span><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, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
onShareAppMessage: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> () {
}
})</span></pre>
</div>
<p> </p>
<p> </p>
<p>接下来讲一下小程序的生命周期函数。首先关于小程序的每一张page的数据结构是按照栈的方式存储,即只能在栈顶进行相应的增加和删除操作。而对应有相应的生命周期函数:</p>
<p> <span class="cnblogs_code">onLaunch()</span> 当第一次进入app/第一次进入一张page时会执行的函数。</p>
<p> <span class="cnblogs_code">onShow()</span> 当小程序从后台转到前台时执行。</p>
<p> <span class="cnblogs_code">onHide()</span> 当页面从前台转到后台时执行。</p>
<p> <span class="cnblogs_code">onError()</span> 当出现错误时执行</p>
<p>等等还有很多生命周期函数。</p>
<p> </p>
<p>进入一张页面执行该页的onLaunch()时:入栈</p>
<p>页面重定向:出栈</p>
<p>页面返回:出栈</p>
<p>tarbar切换:页面全部出栈,只有新的(入栈的)tab页面</p>
<p>重新加载:页面全部出栈,只有新的页面。</p>
<p> </p>
<p>接下来先分析js文件中的几个常用的函数:</p>
<p> </p>
<p>有关页面调用:</p>
<p> <span class="cnblogs_code">wx.navigateTo()</span> 跳转到某一页面(入栈操作),但这页面不可以是tabbar页面</p>
<p> <span class="cnblogs_code">wx.redirectTo()</span> 关闭当前页面到另一页面(先出栈再入栈),同样不可是tabbar页面</p>
<p> <span class="cnblogs_code">wx.switchTab()</span> 跳转到tabbar页面,且只能跳转到tabbar页面</p>
<p> <span class="cnblogs_code">wx.relaunch()</span> 可以跳转到任意页面。</p>
<p> </p>
<p>具体代码可参考:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"> wx.navigateTo({
url: </span>'url'<span style="color: rgba(0, 0, 0, 1)">,
})</span></pre>
</div>
<p> </p>
<p>注:在wxml文件中也可以使用组件navigate来进行页面的跳转。</p>
<p> </p>
<p> <span class="cnblogs_code"><span style="color: rgba(0, 0, 255, 1)">this</span>.setData()</span> 更新Data中具体某数据的值。</p>
<p> <span class="cnblogs_code">console.log()</span> 将某值或某变量呈现在console控制台中,利于实时观察和调试。</p>
<p> </p>
<p>设计后端的常用API:</p>
<p> <span class="cnblogs_code">wx.request()</span> 向后端提出请求,对后端的具体接口地址(url),传入相关请求(data),成功则获得相应数据(一般存进res中)并返回success,失败则返回fail。</p>
<p>具体代码参考:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"> wx.request({
url: </span>'url'<span style="color: rgba(0, 0, 0, 1)">,
data:{
},
success(res){
},
fail(){
}
})</span></pre>
</div>
<p> </p>
<p> <span class="cnblogs_code">wx.uploadFile()</span> 上传文件</p>
<p> <span class="cnblogs_code">wx.downloadFile()</span> 下载文件</p>
<p> </p>
<p> <span class="cnblogs_code">wx.setStrogaeSync(‘key’,'value’)</span> 将数据value存入缓存中,关键字为key。</p>
<p> <span class="cnblogs_code">wx.getStrogaeSync(‘key’)</span> 获得key对应的value。</p>
<p> </p>
<p>现在分析wxml文件的相关组件和对应属性。</p>
<p> </p>
<p>如果要在wxml中实现逻辑判断来决定是否呈现某个组件则用到属性: <span class="cnblogs_code">wx:<span style="color: rgba(0, 0, 255, 1)">if</span>=“{{<span style="color: rgba(0, 0, 255, 1)">true</span>/false}}”</span> ,这里,双括号中的变量值是在js文件中data里定义过的变量值,也可以是一个表达式,只要结构是true,则执行这个组件,要不然,则不呈现这个组件。</p>
<p> </p>
<p>具体的代码参考如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">wx:for</span><span style="color: rgba(0, 0, 255, 1)">="{{arrayx}}"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">wx:if</span><span style="color: rgba(0, 0, 255, 1)">="{{arrayx>5}}"</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">
3
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">wx:elif</span><span style="color: rgba(0, 0, 255, 1)">="{{arrayx>3&&arrayx<=5}}"</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">
2
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">wx:else</span><span style="color: rgba(0, 0, 255, 1)">="{{arrayx>0&&arrayx<=3}}"</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">
1
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
这里还运用了for循环控制。
<p> </p>
<p>还有其他控制属性比如for循环等,这里就不加累述,都是比较轻松易懂的代码。</p>
<p> </p>
<p>关于wxml里的具体知识都是比较基础的容易掌握的知识,但是却比较多样,所以我就不加累述了,具体可在网上搜索或查看b站或mooc上的一些教程视频。</p>
<p> </p>
<p>我的前端学习暂告一段落,并不是说我已经精通前端或没必要再学,我之后将在实践开发中更好的掌握前端相关知识,只是我发现无法先完成小程序的前端再实现小程序的后端,它们应该是并发执行的,所以我得快速了解后端的知识并且学习,而今天的学习随笔本来是想做有关后端初学的知识分享的,但是我查了几个小时的资料也有点徘徊不定,感觉后端是一个比前端艰难很多的道路。欸~加油吧。</p>
<p> 本次随笔是基于MOOC平台西安交通大学的微信小程序开发这门课程进行的总结。</p>
</div><br><br>
来源:https://www.cnblogs.com/SixteenTime/p/13340420.html
頁:
[1]