微信小程序开发学习4(视图与逻辑)

1、学习目标

  1. 能够知道如何实现页面之间的导航跳转
  2. 能够知道如何实现下拉刷新效果
  3. 能够知道如何实现上拉加载更多效果
  4. 能够知道小程序中常用的生命周期函数

2、页面导航

页面导航指的是页面之间的相互跳转,浏览器中实现页面导航的方式又如下两种:

  1. a连接
  2. location.href

2.1、小程序中实现页面导航的两种方式

2.1.1、声明式导航

  • 在页面上声明一个<navigator>导航组件
  • 通过点击<navigator>组件实现页面导航

2.1.2、导航到tabBar页面

tabBar页面指的是被配置为tabBar的页面。

在使用:组件跳转到指定的tabBar页面时,需要指定url属性和open-type属性,其中:

  • Ul表示要跳转的页面的地址,必须以/开头
  • open-type表示跳转的方式,必须为switchTab
<!--index.wxml-->
<navigator url="/pages/message/message" open-type="switchTab">导航到消息页面</navigator>

2.1.3、导航到非tabBar页面

非tabBar页面指的是没有被配置为tabBar的页面。

在使用:组件跳转到普通的非tabBar页面时,则需要指定url属性和open-type属性,其中:

  • ul表示要跳转的页面的地址,必须以/开头

  • open-type表示跳转的方式,必须为navigate

<navigator url="/pages/info/info" open-type="navigate">导航到info页面</navigator>

注意:为了简便,在导航到非tabBar页面时,open-type="navigate"属性可以省略。

2.1.4、后退导航

如果需要导航到上一页面或多级页面,则需要指定open-type属性和delta属性,其中:

  • open-type的值必须是navigateBack,表示要进行后退导航
  • delta的值必须是数字,表示要后退的层级
<navigator open-type="navigateBack" delta="1">后退</navigator>

注意:为了简便,如果只是后退到上一页面,则可以省略deltas属性,只因其默认值就是1

2.2、编程式导航

  • 调用小程序的导航API,实现页面的跳转

2.2.1、导航到tabBar页面

调用wx.switchTab(Object object)方法,可以跳转到tabBar页面,其中Object参数对象的属性列表如下

属性 类型 是否必选 说明
url string 需要跳转的tabBar也页面的路径,路径后不能带参数
success function 接口调用成功的回调函数
faik function 接口调用失败的回调函数
complete function 接口调用结束的回调函数(调用成功、失败都会执行)

实例代码

<button bindtap="gotoMessage" type="primary">链式编程跳转到消息页面</button>

编程式导航

// 链式编程导航跳转到消息页面gotoMessage(){wx.switchTab({url: '/pages/message/message'})}

2.2.2、导航到非tabBar页面

调用wx.switchTo(Object object)方法,可以跳转到非tabBar页面,其中Object参数对象的属性列表如上

// 链式编程导航跳转到info页面gotoInfo(){wx.switchTo({url: '/pages/info/info'})}

2.2.3、后退导航

调用wx.anvigateBack(Object object)方法,可以返回上一页面或多级页面,其中Obj

调用wx.navigateBack(Object object)方法,可以放回上一页面或多级页面,参数如下:

属性 类型 默认值 是否必选 说明
delta number 1 返回页面数,如果delta大于现有的页面数,则返回首页
success function 接口调用成功的回调
fail function 接口调用失败的函数
complete function 接口调用结束的回调函数(回调成功、失败都会执行)

实例代码

<navigator bindtap="gotoBack">链式编程后退</navigator>
// 后退页面
gotoBack(){wx.navigateBack({delta: 1,})
}

2.2、导航传参

2.2.1、声明式导航传参

navigator组件的url属性用来指定将要跳转到的页面的路径。同时,路径的后面还可以携带参数:

  1. 参数与路径之间使用?分隔
  2. 参数键与参数值使用=相连
  3. 不同参数用&分割
<navigator url="/pages/info/info?name=zhangsan&age=21">携带参数跳转到info页面</navigator>

开发者工具如何查看页面参数?点击左下脚选项切换为页面参数即可

2.2.2、编程式导航传参

gotoInfo(){wx.navigateTo({url: '/pages/info/info?name=zhangsan&age=12',})
}

2.2.3、在onLoad中接收导航参数

通过声明式导航传参编程式导航传参所携带的参数,可以直接在onLoad事件中获取到

/*** 生命周期函数--监听页面加载*/
onLoad(options) {console.log(options);this.setData({query: options});
}

由于在该地方回有作用域影响其他地方如果想要访问是访问不了的,我们可以将参数提交到data里面供其他方法也可以使用到

3、页面事件

3.1、下拉属性

下拉刷新是移动端的专有名词,指的是通过手指在屏幕上的下拉滑动操作,从而重新加载页面数据的行为。

3.1.1、启用下拉刷新

  1. 全局开启下拉刷新【不推荐,不是所有页面都需要】

    app.json的window节点中,将enablePullDownRefresh设置为true

  2. 局部开启下拉刷新

    页面.json的window节点中,将enablePullDownRefresh设置为true

3.1.2、配置下拉刷新窗口的样式

在全局或页面的,json配置文件中,通过backgroundColorbackgroundTextStyle来配置下拉刷新窗口的样式,其中:

  1. backgroundColor用来配置下拉刷新窗口的背景颜色,仅支持16进制的颜色值
  2. backgroundTextStyle用来配置下拉刷新loading的样式,仅支持dark和light

3.1.3、监听下拉刷新事件

该事件不需要调用,在下拉刷新时回生效

<view>count的值是{{count}}</view>
<button bindtap="gotoInt" type="primary">点击按钮自增+1</button>

下拉刷新的时候就会将count回0

/*** 点击按钮自增+1*/
gotoInt(){this.setData({count: this.data.count+1});
},/*** 页面相关事件处理函数--监听用户下拉动作*/
onPullDownRefresh() {console.log("下拉窗口成功")this.setData({count: 0});
}

3.1.4、停止下拉刷新的效果

当处理完下拉刷新后,下拉刷新的loanding效果回一致显示,不会主动消失,所以需要手动隐藏下拉刷新的loading效果,此时,调用wx.stopPullDownRefresh()可以停止当前页面的下拉刷新

/*** 页面相关事件处理函数--监听用户下拉动作*/
onPullDownRefresh() {console.log("下拉窗口成功")this.setData({count: 0});// 当数据重置成功后,调用此函数,关闭下拉刷新的效果wx.stopPullDownRefresh();
}

3.2、上拉触底事件

上拉触底事件是移动端的专属名称,通过手指在屏幕上拉滑动操作,从而加载更多数据的行为

3.2.1、监听页面的上拉触底事件

页面.js文件中,通过onReachBootom()函数即可监听当前页面的上拉触底事件

/**
* 上拉触底监听事件
*/
onReachBottom(){console.log("触发了上拉触底事件");
}

3.2.2、配置上拉触底的距离

上拉触底距离指的是触发上拉触底事件时,滚动条距离页面底部的距离

可以在全局或页面的,json配置文件中,通过onReachBottomDistance属性来配置上拉触底的距离。

小程序默认的触底距离是50x,在实际开发中,可以根据自己的需求修改这个默认值。

3.2.3、案例

  1. 定义获取随机颜色的方法
    /*** 页面的初始数据*/
    data: {// 存放随机颜色的列表colorList:[]
    },
    /*** 获取随机颜色的方法*/
    getColors(){wx.request({url: 'https://applet-base-api-t.itheima.net/api/color', method:'GET',success:({data:res}) => {console.log(res);this.setData({colorList:[...this.data.colorList,...res.data]})}})
    }
    
  2. 在页面加载时获取初始化数据
    /*** 生命周期函数--监听页面加载*/
    onLoad(options) {this.getColors();
    }
    
  3. 渲染ui结构并美化页面效果
    <view wx:for="{{colorList}}" wx:key="index" class="num-item" style="background-color: rgba({{item}});">{{item}}</view>
    

    美化样式

    /* pages/contact/contact.wxss */
    .num-item{border: 1rpx solid #efefef;border-radius: 8px;line-height: 200rpx;margin: 15rpx;text-align: center;text-shadow: 0rpx 0rpx 5rpx #fff;box-shadow: 1rpx 1rpx 6rpx #aaa;
    }
    

  4. 在上拉触底时调用获取随机颜色的方法
    /*** 页面上拉触底事件的处理函数*/
    onReachBottom() {this.getColors();
    }
    
  5. 添加loading提示效果【修改请求方法中添加】

    需要查看微信小程序开发者手册:wx.showLoading(Object object) | 微信开放文档 (qq.com)

    /*** 获取随机颜色的方法*/
    getColors(){// 展示loading效果wx.showLoading({title: '数据加载中',})wx.request({url: 'https://applet-base-api-t.itheima.net/api/color', method:'GET',success:({data:res}) => {console.log(res);this.setData({colorList:[...this.data.colorList,...res.data]})},complete:()=>{// 关闭loading隐藏效果wx.hideLoading();}})
    }
    
  6. 对上拉触底进行节流处理
    • 在data中定义isloading节流阀
      data: {// 存放随机颜色的列表colorList:[],// 节流处理状态falg:false
      }
      

      1、false表示当前没有进行任何数据请求

      2、true表示当前正在进行数据请求

    • 在getColors()方法中修改isloading节流阀的值

      修改请求方法添加节流阀

      /*** 获取随机颜色的方法*/
      getColors(){this.setData({falg:true});// 展示loading效果wx.showLoading({title: '数据加载中',})wx.request({url: 'https://applet-base-api-t.itheima.net/api/color', method:'GET',success:({data:res}) => {console.log(res);this.setData({colorList:[...this.data.colorList,...res.data]})},complete:()=>{// 关闭loading隐藏效果wx.hideLoading();this.setData({falg:false});}})
      }
      

      1、在刚调用getColors时将节流阀设置为true

      2、在网络请求的complete回调函数中,将节流阀设置为false

    • 在onReachBottom中判断节流阀的值,从而对数据请求进行节流操作
      /*** 生命周期函数--监听页面加载*/
      onLoad(options) {if(this.data.falg) returnthis.getColors();
      }
      

      1、如果节流阀的值为true,则阻止当前请求。反之正常请求

3.2.4、自定义编译模式

编译之后能直接看到我们想看到的页面

1、添加编译模式

2、设置编译页面

现在编译就可以看到我们想看到的页面了

4、生命周期

4.1、什么是生命周期

生命周期是指一个对象从创建–>运行–>销毁的整个阶段,强调的是一个时间段

小程序的生命周期概括如下阶段:

  1. 小程序启动,表示生命周期开始
  2. 小程序关闭,表示生命周期结束
  3. 小程序在运行的过程就是生命周期

4.2、生命周期分类

  1. 应用生命周期

    特指小程序从启动——》运行——》销毁的过程

  2. 页面生命周期

    特指小程序中,每一个页面的加载——》渲染——》效果过程

4.3、什么是生命周期函数

生命周期函数:是由小程序框架提供的内置函数,回伴随着整个生命周期,自动按次序执行

作用:允许程序员在特定的时间点,执行某些特定的操作,例如:在页面加载的时候,可以在onLoad生命周期函数中初始化页面数据

注意:生命周期强调的是时间段,生命周期函数强调的是时间点

4.4、生命周期函数的分类

  1. 应用的生命周期函数

    特指小程序从启动——》运行——》销毁期间依次调用的哪些函数

  2. 页面的生命周期函数

    特指小程序中,每一个页面从加载——》渲染——》销毁期间依次调用的哪些函数

5.5、应用生命周期函数

小程序的应用生命周期函数需要在app.json中进行声明,示例代码如下:

App({/*** 当小程序初始化完成时,会触发onLaunch(全局只触发一次*/onLaunch(){},/*** 当小程序启动或从后台进入前台显示会触发onShow*/onShow(){},/*** 当小程序从前台进入后台,会触发onHide*/onHide(){}
});

5.6、页面的生命周期函数

小程序的页面生命周期函数需要在页面的.js文件中进行声明,代码如下

// pages/logs/logs.js
Page({/*** 页面的初始数据*/data: {},/*** 生命周期函数--监听页面加载只调用一起 */onLoad(options) {},/*** 生命周期函数--监听页面初次渲染完成*/onReady() {},/*** 生命周期函数--监听页面显示*/onShow() {},/*** 生命周期函数--监听页面隐藏*/onHide() {},/*** 生命周期函数--监听页面卸载*/onUnload() {},/*** 页面相关事件处理函数--监听用户下拉动作*/onPullDownRefresh() {},/*** 页面上拉触底事件的处理函数*/onReachBottom() {},/*** 用户点击右上角分享*/onShareAppMessage() {}
})

5、WXS脚本

wes是小程序独有的一套脚本语言,结合wxml,可以构建出页面的结构

应用场景:

wxml中无法调用在页面.js中定义的函数,但是wxml中口调用wxs中定义的函数,因此,小程序中wxs的典型应用场景就是过滤器

5.1、wxs和javaScript的关系

虽然WXs的语法类似于JavaScript,但是wxs和JavaScript是完全不同的两种语言:

  1. WXS有自己的数据类型

    number数值类型、string字符串类型、boolean布尔类型、object对象类型、function函数类型、array数组类型、date日期类型、regexp正则

  2. WXS不支持类似于ES6及以上的语法形式

    不支持:let、const、解构赋值、展开运算符、箭头函数、对象属性简写、etc.

    支持:var定义变量、普通function函数等类似于ES5的语法

  3. wxs遵循CommonJS规范

    module对象

    require()函数

    module.exports对象

5.2、wxs脚本基础语法

5.2.1、内嵌wxs脚本

wxs代码可以编写在wxml文件中的标签内,就像Javascript代码可以编写在html文件中的<script>标签内一样。

WXl文件中的每个<WXs></Wxs>标签,必须提供module属性,用来指定当前Wxs的模块名称,方便在wxml中访问模块的成员

<view>{{m1.toUpper(username)}}</view>
<wxs module="m1">// 小写转换成大写module.exports.toUpper = function(str){console.log("方法执行:"+str.toUpperCase())return srt.toUpperCase()}
</wxs>

5.2.2、定义外联的wxs脚本

wxs代码还可以编写在以.wxs为后缀的文件内,就像JavaScript代码一样编写一个外部文件

// 定义方法
function toLower(str){return str.toLowerCase()
}// 对外共享成员
module.exports = {toLower:toLower
}

5.2.3、使用外联的wxs文件

在wxml中引入外联的wxs脚本时,必须使用wxs标签添加module和src属性,其中:

  • module用来指定模块的名称
  • src用来指定要引入的脚本的路径,且必须是相对路径
<view>{{m2.toLower(country)}}</view>
// 引入外联
<wxs module="m2" src="../../utils/tools.wxs"></wxs>

5.2.4、wxs的特点

1、与JavaScript不同

为了降低wxs(WeiXin Script)的学习成本,wxs语言在设计时借大量鉴了JavaScript的语法。但是本质上,wxs和javaScript是完全不同的两种语言!

2、不能作为组件事件的回调

wxs典型的应用场景就是过滤器,经常配合Mustache语法进行使用

<view>{{m2.toLower(country)}}</view>

不能作为组件的事件回调函数

<button bindtap="m2.toLower" type="primary">点击按钮自增+1</button>

3、隔离性

隔离性指的是wxs的运行环境和其他JavaScript代码是隔离的。体现在如下两方面:

  1. WxS不能调用js中定义的函数
  2. WXs不能调用小程序提供的API

4、性能

  • 在iOS设备上,小程序内的WXS会比JavaScript代码快2~20倍

  • 在android设备上,二者的运行效率无差异

微信小程序开发学习4(视图与逻辑)相关推荐

  1. 微信小程序开发学习5(自定义组件)

    微信小程序开发学习5(自定义组件) 1.学习目标 能够知道如何自定义小程序组件 能够知道小程序组件中behaviors的作用 能够知道如何安装和配置vant-weapp组件库 能够知道如何使用MobX ...

  2. web前端-微信小程序开发学习

    web前端-微信小程序开发学习 1. 小程序的概述 2. 小程序的项目结构 2.1 小程序项目结构分析 2.2 WXML模版 2.3 小程序的宿主环境 3. 组件 3.1 视图容器类组件 3.2 常用 ...

  3. bilibili微信小程序开发学习总结

    bilibili微信小程序开发学习总结 用来半天学习了微信小程序模仿做了个B站小程序,其实如果有编程基础特别熟悉Vue语法与web的话那小程序基本就是随便玩玩,整体写法与vue一致,页面搭建与web也 ...

  4. 微信小程序开发学习1(小程序的入门知识)

    微信小程序开发学习1(小程序的入门知识) 1.制定学习目标: 能够知道如何创建小程序项目 能够清楚小程序项目的基本组成结构 能够知道小程序页面的几个组成部分 能够知道小程序中常见的组件如何使用 能够知 ...

  5. 微信小程序开发学习6(基础加强之使用npm包和全局数据共享及分包【Tab底栏案例改进】)

    微信小程序开发学习6(基础加强之使用npm包和全局数据共享及分包) 1.使用npm包 小程序对npm包的支持 目前,小程序中已经支持使用p安装第三方包,从而来提高小程序的开发效率.但是,在小程序中使用 ...

  6. 微信小程序开发学习2(模板与配置)

    微信小程序开发学习2(模板与配置) 1.学习目标 能够使用WXML模板语法渲染页面结构 能够使用WXSS样式美化页面结构 能够使用app,json对小程序进行全局性配置 能够使用page.json对小 ...

  7. 【微信小程序开发学习篇】

    微信小程序开发学习篇 概述 相关信息 笔记制作时间:2022-9-25 参考视频:黑马视频 参考文档:微信小程序官方开发文档 文章目录 微信小程序开发学习篇 概述 相关信息 小程序基础 1.数据绑定与 ...

  8. 微信小程序开发学习笔记一

    微信小程序学习笔记(一) 环境使用及创建项目 文件目录设置 JS文件 环境使用及创建项目 环境使用:微信开发者工具 一个微信号只能开发一个微信小程序. 在微信小程序开发手册下载最新版本,学习不要bet ...

  9. 微信小程序绘制二维码(附微信小程序开发学习手册)

    一.前言 在日常的小程序项目中,会经常遇到需要动态绘制二维码的需求.使用场景很多,例如绘制在海报上,例如制作票务码.核销码等等. 这篇文章是应一位好友的需求而写的,也希望能够给有需要的同学一些帮助. ...

最新文章

  1. 颤抖吧,打工人!深信服推出员工离职倾向、工作摸鱼监测系统!
  2. ios 设备方向判断
  3. lvs直接路由模式简单部署
  4. windows 下rabbitmq 安装---转载
  5. 在html页面中使用模板继承,HTML静态模板的继承
  6. 3-7 DNA序列(DNA Consensus String, ACM/ICPC Seoul 2006, UVa1368)
  7. 公司-ofo:ofo
  8. linux自动补全快捷键,linux常用快捷键
  9. PSP金手指大全1215个CMF金手指合集
  10. KMS激活报错0x8007000D
  11. 七大江河水系--黄河(一)
  12. 复现Reducing Complexity of HEVC: A Deep Learning Approach,复现帧内模式,HCPM
  13. Java 服务接入 OpenTracing(1)--从 Tracing 到 OpenTracing
  14. 2022-2028年全球与中国氨(NH3)气体传感器行业发展趋势及投资战略分析
  15. LeetCode刷题第8天字符串系列之《378字符串中的第一个唯一字符》
  16. 【全】在 Docker 的Solr容器中安装 IK 中文分词器
  17. 展讯平台 mimi教程
  18. 一文详解8种异常检测算法(附Python代码)
  19. 威威猫系列故事——篮球梦
  20. java中next()和nextline()用法区别(详细说明)

热门文章

  1. TensorFlow机器翻译之moses切词(附:ActivePerl安装)
  2. Moses安装全记录
  3. MFC Ribbon模式下 菜单promt鼠标滑过时候的提示是需要在属性的promt前面加上\n
  4. 老程序员告诉你人工智能工程师与Python工程师有什么区别?
  5. 【规划】Motion Planning Approaches 路径规划方法汇总
  6. 2022年全球与中国游泳池救生椅市场现状
  7. 如何有效提高APP排名和下载量(上)
  8. 将你的现实生活照片变成卡通头像
  9. python常见ubr前缀的使用与作用
  10. word格式刷刷完格式后公式上凸了怎么办?