【7 微信小程序学习 - 小程序的系统API调用,网络请求封装】

1 网络请求 – 原生

在这里插入图片描述

请求数据,保存数据

1 原生请求

Page({
  data: {
    allCities: {},
    houselist: [],
    currentPage: 1
  },
  async onLoad() {
    // 1.网络请求基本使用
    wx.request({
      url: "http://codercba.com:1888/api/city/all",
      success: (res) => {
      //保存数据
        const data = res.data.data
        this.setData({ allCities: data })
      },
      fail: (err) => {
        console.log("err:", err);
      }
    })

    wx.request({
      url: 'http://codercba.com:1888/api/home/houselist',
      //post和get都通过data传递参数
      data: {
        page: 1
      },
      success: (res) => {
        const data = res.data.data
        this.setData({ houselist: data })
      }
    })
}
//数据使用
<view class="house-list">
  <block wx:for="{{houselist}}" wx:key="{{item.data.houseId}}">
    <view class="item">
      <image src="{{item.data.image.url}}"></image>
      <view class="title">{{item.data.houseName}}</view>
    </view>
  </block>
</view>


2 函数封装,以Promise返回数据

// 封装成函数,单独写一个js文件,导出
export function hyRequest(options) {
//返回一个Promise
  return new Promise((resolve, reject) => {
    wx.request({ 
      ...options, 
      success: (res) => {
        resolve(res.data)
      },
      fail: reject
    })
  })
}
//使用
//导入封装好的js文件
import { hyRequest } from "../../service/index"
Page({
  data: {
    allCities: {},
    houselist: [],
    currentPage: 1
  },
  async onLoad() {
    

    // 2.使用封装的函数,无参数
    hyRequest({ 
      url: "http://codercba.com:1888/api/city/all" 
    }).then(res => {
      this.setData({ allCities: res.data })
    })
	// 有参数
    hyRequest({
      url: "http://codercba.com:1888/api/home/houselist",
      data: {
        page: 1
      }
    }).then(res => {
      this.setData({ houselist: res.data })
    })

3 Promise的语法糖封装await/async(推荐)

需要封装为单独的函数,不然不是异步的

//封装
async getCityData() {
    const cityRes = await hyRequest({ 
      url: "http://codercba.com:1888/api/city/all" 
    })
    this.setData({ allCities: cityRes.data })
  },
  async getHouselistData() {
    const houseRes = await hyRequest({
      url: "http://codercba.com:1888/api/home/houselist",
      data: { page: this.data.currentPage }
    })
    //数组追加数组数据,(加载更多)
    const finalHouseList = [...this.data.houselist, ...houseRes.data]
    this.setData({ houselist: finalHouseList })
    // 思考: 为什么这里不需要setData?
    this.data.currentPage++
  },
  //使用
  Page({
  data: {
    allCities: {},
    houselist: [],
    currentPage: 1
  },
  async onLoad() {

    this.getCityData()
    this.getHouselistData()

2 网络请求-封装为类

(推荐,可配置不同基础URL的多个实例)

//封装为单独的js文件
// 封装成类 -> 实例
class HYRequest {
  constructor(baseURL) {
    this.baseURL = baseURL
  }
  request(options) {
    const { url } = options
    return new Promise((resolve, reject) => {
      wx.request({
        ...options,
        url: this.baseURL + url,
        success: (res) => {
          resolve(res.data)
        },
        fail: (err) => {
          console.log("err:", err);
        }
      })
    })
  }
  get(options) {
    return this.request({ ...options, method: "get" })
  }
  post(options) {
    return this.request({ ...options, method: "post" })
  }
}
//导出不同基础URL的类实例
export const hyReqInstance = new HYRequest("http://codercba.com:1888/api")
export const hyLoginReqInstance = new HYRequest("http://123.207.32.32:3000")

//使用
import { hyRequest, hyReqInstance } from "../../service/index"

Page({
  data: {
    allCities: {},
    houselist: [],
    currentPage: 1
  },
  async onLoad() {

    //使用类的实例发送请求
    hyReqInstance.get({
      url: "/city/all"
    }).then(res => {
    //保存数据
       this.setData({ allCities: res.data })
    })
  },

3 提示弹窗

在这里插入图片描述


Page({
  // 1.仅提示
  onShowToast() {
    wx.showToast({
      title: '购买失败!',
      icon: "error",
      duration: 5000,
      mask: true,
      success: (res) => {
        console.log("res:", res);
      },
      fail: (err) => {
        console.log("err:", err);
      }
    })

    // wx.showLoading({
    //   title: "加载中ing"
    // })
  },
  //是否选择
  onShowModal() {
    wx.showModal({
      title: "确定购买吗?",
      content: "确定购买的话, 请确定您的微信有钱!",
      confirmColor: "#f00",
      cancelColor: "#0f0",
      success: (res) => {
        if (res.cancel) {
          console.log("用户点击取消");
        } else if (res.confirm) {
          console.log("用户点击了确定");
        }
      }
    })
  },
  //多个选择
  onShowAction() {
    wx.showActionSheet({
      itemList: ["衣服", "裤子", "鞋子"],
      success: (res) => {
        console.log(res.tapIndex);
      },
      fail: (err) => {
        console.log("err:", err);
      }
    })
  },

4 分享功能

在这里插入图片描述

// 2.分享功能,不写也能分享,有默认的内容
  onShareAppMessage() {
    return {
      title: "旅途的内容",
      path: "/pages/favor/favor",
      imageUrl: "/assets/nhlt.jpg"
    }
  },

5 获取设备信息

// 1.获取手机的基本信息
    wx.getSystemInfo({
      success: (res) => {
        console.log(res);
      }
    })

6 获取位置信息

//需要先在app.json中获取授权
"permission": {
    "scope.userLocation": {
      "desc": "需要获取您的位置信息"
    }
  },
//获取用户位置信息
    wx.getLocation({
      success: (res) => {
        console.log("res:", res);
      }
    })



7 Storage存储

在这里插入图片描述

8 界面跳转的方式

携带数据跳转其他页面

在这里插入图片描述
在这里插入图片描述

页面返回 - navigateBack

在这里插入图片描述

9 反向页面跳转 - 数据传递

方式一:获取上一个界面的实例,直接修改数据


onBackTap() {
    // 1.返回上级页面
    wx.navigateBack()

    // 获取到当前页面栈的所有页面
    const pages = getCurrentPages()
    //获取上一级页面
    const prePage = pages[pages.length-2]

    // 通过setData给上一个页面设置数据(message是上一个页面定义的数据)
    prePage.setData({ message: "呵呵呵" })

方式二,渠道传递

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Sure! 微信小程序中,可以使用 `wx.request` 方法来进行网络请求,但是如果在多个页面中都需要进行网络请求时,每一个页面都使用 `wx.request` 方法来写请求代码就会显得重复冗余,不便于维护。因此,我们可以将网络请求的代码封装成一个公共的方法,让多个页面都可以调用,提高代码复用性和可维护性。 下面是一个简单的网络请求封装代码的示例: ```javascript // api.js const API_BASE_URL = 'https://api.example.com' const request = (url, method, data) => { return new Promise((resolve, reject) => { wx.request({ url: `${API_BASE_URL}/${url}`, method: method, data: data, header: { 'content-type': 'application/json', // 根据实际情况设置请求头 }, success: (res) => { if (res.statusCode === 200) { resolve(res.data) // 请求成功,返回数据 } else { reject(res) // 请求失败,返回错误信息 } }, fail: (err) => { reject(err) // 网络请求失败,返回错误信息 }, }) }) } module.exports = { request, } ``` 上述代码定义了一个 `request` 方法,该方法接收三个参数:请求的 `url`、请求的 `method`、请求的 `data`。在方法中,我们使用 `wx.request` 方法来发送网络请求,并通过 `Promise` 对象来处理请求结果。请求成功时,会调用 `resolve` 方法来返回请求结果,请求失败时,会调用 `reject` 方法来返回错误信息。最后,将 `request` 方法通过 `module.exports` 导出,供其他文件调用。 在调用网络请求时,我们只需要在需要的页面中引入 `api.js` 文件,然后调用 `request` 方法即可: ```javascript // index.js const api = require('../../utils/api.js') Page({ data: { // ... }, onLoad: function () { api.request('users', 'GET') .then((res) => { console.log(res) // 输出请求结果 }) .catch((err) => { console.log(err) // 输出错误信息 }) }, }) ``` 上述代码中,在页面的 `onLoad` 生命周期中,我们调用了 `api.js` 中的 `request` 方法,并传入请求的 `url` 和 `method`。请求成功时,输出请求结果;请求失败时,输出错误信息。 这样,我们就完成了一个简单的网络请求封装代码,可以方便地在多个页面中进行调用。当然,实际开发中,我们还需要考虑请求参数的校验、请求头的设置、请求结果的处理等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力修福报

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值