微信小程序从入门到进阶(二)

数据请求

wx.request发起网络请求,请求的方式主要分为两种:

  1. get 请求

  2. post 请求

// get请求
// html
<view><button type="primary" bindtap="onGetClick">发起 get 请求</button>
</view>
// js
// index.js
// 获取应用实例
onGetClick () {wx.request({url: 'https://api.imooc-blog.lgdsunday.club/api/test/getList',method: 'GET',success: (res) => {console.log(res);}})
}// post请求
// html <button type="primary" bindtap="onPostClick">发起 post 请求</button>// jsonPostClick () {wx.request({url: 'https://api.imooc-blog.lgdsunday.club/api/test/postData',method: 'POST',data: {msg: '愿大家心想事成,万事如意'},success: (res) => {console.log(res);}})}
  1. 只能请求 HTTPS 类型的接口
  2. 必须将接口的域名添加到信任列表中

解决方案:

  1. 生产环境:将想要请求的域名协议【更改为 HTTPS】并【添加到域名信任列表】
  2. 开发环境:通过勾选
  3. 跨域问题: 跨域问题主要针对浏览器而言,而小程序宿主环境为【微信小程序客户端】,所以小程序中不存在【跨域问题】
  4. ajax请求:ajax 依赖于 XMLHttpRequest 对象,而小程序宿主环境为【微信小程序客户端】,所以小程序中的【网络请求】不是ajax 请求
// 使用promise封装wx.request请求
pA () {return new Promise((resolve, reject) => {console.log('执行 A 接口的逻辑');wx.request({url: 'https://api.imooc-blog.lgdsunday.club/api/test/A',success: (res) => {resolve(res)},fail: (err) => {reject(err)}})})}// 使用async和await简化promise操作
async onPromiseGetClick () {const resA = await this.pA()console.log(resA.data.data.msg);const resB = await this.pB()console.log(resB.data.data.msg);const resC = await this.pC()console.log(resC.data.data.msg);const resD = await this.pD()console.log(resD.data.data.msg);}

生命周期

一件事件由创建到销毁的全过程

页面的生命周期

/ pages/list/list.js
Page({.../*** 生命周期函数--监听页面加载*/onLoad: function (options) {console.log('onLoad');},/*** 生命周期函数--监听页面初次渲染完成*/onReady: function () {console.log('onReady');},/*** 生命周期函数--监听页面显示*/onShow: function () {console.log('onShow');},/*** 生命周期函数--监听页面隐藏*/onHide: function () {console.log('onHide');},/*** 生命周期函数--监听页面卸载*/onUnload: function () {console.log('onUnload');},...
})

onLoad:最先被调用,可以用来接收别的页面传递过来的数据

onReady:页面初次渲染完成后调用,可以在这里从服务端获取数据

组件生命周期

组件的生命周期应该被定义在lifetimes中,而方法必须要放入到methods中

  1. created : 组件实例刚刚被创建好。此时还不能调用setData
  2. attached:组件完全初始化完毕、进入页面节点树后。绝大多数初始化工作可以在这个时机进行
  3. detached:在组件离开页面节点树后
/*** 组件的初始数据*/data: {// 数据源listData: [],// 选中项active: -1},/*** 生命周期函数*/lifetimes: {attached() {this.loadTabsData()}},/*** 组件的方法列表(组件中的方法必须定义到 methods 中)*/methods: {/*** 获取数据的方法*/loadTabsData() {wx.request({url: 'https://api.imooc-blog.lgdsunday.club/api/hot/tabs',success: (res) => {this.setData({listData: res.data.data.list,active: 0})}})}}
<scroll-view class="tabs-box" scroll-x><view wx:for="{{ listData }}" wx:key="index" class="tab {{ active === index ? 'active' : '' }}">{{item.label}}</view>
</scroll-view>
.tabs-box {/* 指定宽度 + 不换行 */width: 750rpx;white-space: nowrap;border-bottom: 1px solid #cccccc;
}.tab {/* 指定 display */display: inline-block;padding: 12px 22px;
}.active {color: #f94d2a;
}

数据列表分页展示

列表中数据过多时,一次性加载所有的数据会导致请求过慢,所以前端就会分页来加载数据

分页加载分为上拉加载和下拉刷新

    /*** 页面上拉触底事件的处理函数*/onReachBottom: async function () {console.log('onReachBottom');// 修改 pagethis.setData({page: this.data.page + 1})// 如果当前数据量已经 === 总数据量,则表示数据已经加载完成了,给用户一个提示,同时不在发送数据请求if (this.data.listData.length === this.data.total) {return;}// 获取最新数据const data = await this.getList()// 将最新的数据补充到现有数据的后面this.setData({listData: [...this.data.listData, ...data.list]})},

下拉刷新

想要在小程序中实现下拉刷新不同于上拉加载,需要首先开启下拉刷新

// 页面.json
{"backgroundColor": "#cccccc","enablePullDownRefresh": true
}/*** 页面相关事件处理函数--监听用户下拉动作*/onPullDownRefresh: async function () {console.log('onPullDownRefresh');// 重置页数this.setData({page: 1})// 获取最新数据const data = await this.getList()// 将最新的数据补充到现有数据的后面this.setData({listData: data.list})//  关闭下拉刷新的动作(在真机中,下拉刷新动作不会自动关闭)wx.stopPullDownRefresh()},

页面跳转

  1. 声明式导航

    1. 跳转到 tabbar 页面
    2. 跳转到 非tabbar 页面
    3. 后退页面
  2. 编程式导航

    1. 跳转到 tabbar 页面
    2. 跳转到 非tabbar 页面
    3. 后退页面

声明式导航

小程序中提供了一个 跳转页面的组件navigator

<!-- 跳转到 非 tabbar 页面 -->
<block wx:for="{{ listData }}" wx:key="index"><view class="list-item"><!-- 注意:url 的表达式必须为 / 开头的页面路径 --><navigator url="/pages/detail/detail">{{ index }} -- {{ item.title }}</navigator></view></block>----<!-- 跳转到 tabbar 页面 -->
<!-- 注意:跳转到 tabbar 页面,必须要指定 open-type="switchTab"-->
<navigator open-type="switchTab" url="/pages/index/index">跳转到首页</navigator>-----<!-- 后退页面 -->
<!-- 注意:后退页面必须指定 open-type="navigateBack" -->
<navigator open-type="navigateBack">后退</navigator>

编程式导航

// wx.switchTab:跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
<!-- 编程式导航跳转到首页 -->
<button type="primary" bindtap="onSwitchToHome">利用 switchTab 跳转到首页</button>
onSwitchToHome () {wx.switchTab({url: '/pages/index/index',})
}// wx.navigateTo:保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面
<!-- 编程式导航跳转到详情页面 -->
<button type="primary" bindtap="onNavigateToDetail">利用 navigateTo 进入详情页</button>
onNavigateToDetail () {wx.navigateTo({url: '/pages/detail/detail',})
}// wx.navigateBack:关闭当前页面,返回上一页面或多级页面
<!-- 编程式导航后退页面 -->
<button type="primary" bindtap="onNavigateBack">利用 navigateBack 后退页面</button>onNavigateBack () {wx.navigateBack({delta: 1,})
}

导航传参

遵循get请求标准,以?分割url和参数,以=连接参数的key和value,以&来拼接参数

// 声明式导航传递参数
<navigator url="/pages/detail/detail?index={{index}}&title={{item.title}}">{{ index }} -- {{ item.title }}</navigator>
// 编程式导航传递参数
<button type="primary" bindtap="onNavigateToDetail" data-index="{{index}}" data-title="{{item.title}}">利用 navigateTo 进入详情页</button>
onNavigateToDetail (e) {const { index, title } = e.target.datasetwx.navigateTo({url: `/pages/detail/detail?index=${index}&title=${title}`,})
}
// 在 detail 中接收数据,并展示
<view class="msg">index:{{index}} -- title:{{title}}</view>
onLoad: function (options) {const {index, title} = options;this.setData({index,title})
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/644758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个简单的ETCD GUI工具

使用ETCD没有好用的GUI工具&#xff0c;随手用c#写了一个&#xff0c; 做得好玩的一个ETCD GUI工具&#xff0c;后面加上CLI 工具&#xff0c;类似于 redis Cli工具一样&#xff0c;简化在 Linux下面的操作&#xff0c;不知道有没有必要&#xff0c; git 地址如下&#xff0c;…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏1(附项目源码)

本篇最终效果演示 文章目录 本篇最终效果演示系列目录前言环境素材绘制地形 实现人物移动指示显示物品名称源码完结 系列目录 【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏1&#xff08;附项目源码&#xff09; 【制作100个unity游戏之23】实现类似七日杀、森…

面向对象、封装、继承、多态、JavaBean

二、面向对象 什么是对象 什么是对象&#xff1f;之前我们讲过&#xff0c;对象就是计算机中的虚拟物体。例如 System.out&#xff0c;System.in 等等。然而&#xff0c;要开发自己的应用程序&#xff0c;只有这些现成的对象还远远不够。需要我们自己来创建新的对象。 1. 抽…

鸿蒙开发 状态管理

最近学习鸿蒙开发。 状态管理&#xff1a; State -> Prop 单向传递&#xff1b; stateprop: State -> Prop 单向传递 State -> Link 双向传递&#xff1b;

数据的存储结构

1.类别 顺序存储、链式存储、散列存储、索引存储 2.顺序存储与链式存储的区别 顺序存储链式存储优点 可以实现随机存取每个元素占用最少的空间 充分利用所有存储单元&#xff0c;不会出现碎片现象。缺点 只能使用整块的存储单元&#xff0c;会产出较多的碎片。 需要额外的存…

面试题-【消息队列】

消息队列 问题1 如何进行消息队列的技术选型优点解耦 &#xff08;pub/sub模型&#xff09;异步&#xff08;异步接口性能优化&#xff09;削峰 使用消息队列的缺点几种消息队列的特性 问题2 引入消息队列之后该如何保证其高可用性RabbitMQ的高可用kafka高可用 问题3 在消息队列…

HCIP-BGP实验4

搭建实验拓扑图 要求 1.全网可达 2.isp只能配置IP地址 实验开始 配置IP地址及环回 r1,r2,r9,r10配ipv4地址(以r1为例) [Huawei]sysname r1 [r1]interface g0/0/0 [r1-GigabitEthernet0/0/0]ip address 12.1.1.1 24 [r1-GigabitEthernet0/0/0]q [r1]interface LoopBack 0…

Java实现考研专业课程管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…

Cesium实现动态水面效果

目录 1.使用Primitive实现动态水面效果 2.版本问题 1.使用Primitive实现动态水面效果 let points [[87.07131373100303, 29.40857655725876],[87.33503858397042, 29.41843499494008],[87.33072496578943, 29.193059292424955],[87.05098771260403, 29.20286249623694],];l…

kali安装LAMP和DVWA

LANMP简介 LANMP是指一组通常用来搭建动态网站或者服务器的开源软件&#xff0c;本身都是各自独立的程序&#xff0c;但是因为常被放在一起使用&#xff0c;拥有了越来越高的兼容度&#xff0c;共同组成了一个强大的Web应用程序平台。 L:指Linux&#xff0c;一类Unix计算机操作…

【代码随想录13】102. 二叉树的层序遍历 226. 翻转二叉树 101. 对称二叉树

目录 102. 二叉树的层序遍历题目描述做题思路参考代码 226. 翻转二叉树题目描述做题思路参考代码 101. 对称二叉树题目描述做题思路参考代码 102. 二叉树的层序遍历 题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff…

【前端可视化】postcss-px-to-viewport 适配怎么限制最大宽度?使用 postcss-mobile-forever

需求原因 自己用 nuxt3 写官网发现用 postcss-px-to-viewport 这个插件虽然能够实现基于 vw 的响应式&#xff0c;但是无法做到限制宽度&#xff0c;比如设计稿 1920p&#xff0c;我只想让最大缩放比例为 1920p&#xff0c;不能超过&#xff0c;就无法实现了。 方案参考 纯 c…

webassembly003 whisper.cpp的python绑定实现+Cython+Setuptools

python绑定项目 官方未提供python的封装绑定&#xff0c;直接调用执行文件 https://github.com/stlukey/whispercpp.py提供了源码和Cpython结合的绑定 https://github.com/zhujun1980/whispercpp_py提供了ctype方式的绑定&#xff0c;需要先make libwhisper.so Pybind11 bi…

spring Cloud Stream 实战应用深度讲解

springCloudStream 简介 Spring Cloud Stream是一个框架&#xff0c;用于构建与共享消息传递系统连接的高度可扩展的事件驱动微服务。 该框架提供了一个灵活的编程模型&#xff0c;该模型建立在已经建立和熟悉的 Spring 习惯用语和最佳实践之上&#xff0c;包括对持久发布/订…

算法基础学习|双指针算法

双指针算法 代码模板 for (int i 0, j 0; i < n; i ){while (j < i && check(i, j)) j ;// 具体问题的逻辑 } 常见问题分类&#xff1a;(1) 对于一个序列&#xff0c;用两个指针维护一段区间(2) 对于两个序列&#xff0c;维护某种次序&#xff0c;比如归并…

Transformer and Pretrain Language Models3-1

content transformer attention mechanism transformer structure​​​​​​​ pretrained language models language modeling pre-trained langue models(PLMs&#xff09; fine-tuning approaches PLMs after BERT applications of masked LM frontiers of PLMs …

RocketMQ的一万字全面总结,带你快速入门消息队列

前言 近日偶然聊起消息队列&#xff0c;发现知识模糊又破碎&#xff0c;遂广泛查询资料&#xff0c;做了这么一篇非常浅显的总结&#xff0c;聊以充作入门参考资料吧。 下面几个问题&#xff0c;如果不能回答地很好&#xff0c;可以试着在文中找寻一下答案。&#xff08;答案…

时间序列大模型:TimeGPT

论文&#xff1a;https://arxiv.org/pdf/2310.03589.pdf TimeGPT&#xff0c;这是第一个用于时间序列的基础模型&#xff0c;能够为训练期间未见过的多样化数据集生成准确的预测。 大规模时间序列模型通过利用当代深度学习进步的能力&#xff0c;使精确预测和减少不确定性成为…

VSCode 更换默认的 terminal(终端)

Win10 中 VSCode 默认的 terminal 为 PowerShell, 想要更换为 Git bash。 1. 按快捷键&#xff1a;Ctrl Shift P 2. 搜索&#xff1a;“erminal: Select Default Profile” 3. 你会看到可选的终端列表&#xff0c;然后选择 Git Bash

3.Eureka注册中心

3.Eureka注册中心 假如我们的服务提供者user-service部署了多个实例&#xff0c;如图&#xff1a; 大家思考几个问题&#xff1a; order-service在发起远程调用的时候&#xff0c;该如何得知user-service实例的ip地址和端口&#xff1f;有多个user-service实例地址&#xff0…