微信小程序常用组件(模态框、promise封装request)

本人编程新手,最近再做一个微信小程序项目,用到了这两个组件,也是在网上找了自己修改的,发出来希望能帮助更多人!

目录

模态框组件

promise封装request


模态框组件

wxml:

<!-- 为实现过渡效果,舍弃wx:if,使用透明度属性,未被启用时z-index为-1,避免影响页面其他元素 -->
<view class="mask" style="opacity:{{isShowModal?'1':'0'}}; z-index: {{isShowModal?'9999':'-1'}};" bindtap="clickMask"></view>
<view class="modal-wrapper" style="opacity:{{isShowModal?'1':'0'}}; z-index: {{isShowModal?'10000':'-1'}};">
  <view class="modal-content">
    <view class="main-content">
      <view class="title">{{title}}</view>
      <!-- 模态框中的内容 -->
      <slot></slot>
    </view>
    <view class="modal-btn-wrapper">
      <button wx:if="{{isShowCancel}}" class="cancel-btn" bindtap="handleCancel">取消</button>
      <button class="confirm-btn" bindtap="handleConfirm">确认</button>
    </view>
  </view>
</view>

scss:

.mask {
  position: fixed;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  background-color: rgba(0, 0, 0, 0.4);
  transition: all 0.3s ease;
}

.modal-wrapper {
  position: absolute;
  width: 100%;
  top: 20%;
  left: 10%;
  transition: all 0.3s ease;
  .modal-content {
    width: 80%;
    background-color: #fff;
    border-radius: 20rpx;
    padding: 20rpx;
    box-sizing: border-box;
    text-align: center;

    .main-content {
      .title {
        margin-bottom: 40rpx;
      }
    }

    .modal-btn-wrapper {
      display: flex;
      justify-content: space-between;
      margin-top: 30rpx;

      .cancel-btn,
      .confirm-btn {
        width: 175rpx;
        text-align: center;
        font-size: 35rpx;
        line-height: 80rpx;
        border-radius: 12rpx;
        color: var(--themeColor);
        border: 2rpx solid var(--themeColor);
      }

      .confirm-btn {
        background-color: var(--themeColor);
        color: #fff;
      }
    }
  }
}

js:

Component({
  properties: {
    // 是否显示modal
    isShowModal: {
      type: Boolean,
      value: false,
      observer: function (newVal, oldVal, changedPath) {
        this.setData({
          isShowModal: newVal
        })
      }
    },
    // 自定义标题
    title: {
      type: String,
      value: '',
      observer: function (newVal, oldVal, changedPath) {
        this.setData({
          title: newVal
        })
      }
    },
    // 是否显示取消按钮(默认显示)
    isShowCancel: {
      type: Boolean,
      value: true,
      observer: function (newVal, oldVal, changedPath) {
        this.setData({
          isShowCancel: newVal
        })
      }
    },
  },

  /**
   * 组件的初始数据
   */
  data: {
    isShowModal: false,
    title: '',
    isShowCancel: true,
  },

  /**
   * 组件的方法列表
   */
  methods: {
    // 点击遮罩层关掉modal
    clickMask() {
      this.setData({
        isShowModal: false
      })
    },

    handleCancel: function () {
      this.triggerEvent("handleCancel")
      this.setData({
        isShowModal: false
      })
    },

    handleConfirm: function () {
      this.triggerEvent("handleConfirm")
      this.setData({
        isShowModal: false
      })
    }
  }
})

看着别的小程序过渡动画都蛮精美,自己也尝试做了一个,用display: none;是不行的,得使用透明度opacity。为防止遮挡页面其他元素,未启用时z-index设置为了-1,可根据需求修改。

在页面中调用的话,json文件这样写:

{
  "usingComponents": {
    "showModal":"/components/showModal/showModal"
  }
}

使用举例:

<showModal title="一个提示性标题"
isShowMadal="{{判断是否显示模态框(true | flase)}}"
isShowCancel="{{判断是否显示取消按钮(true | flase)}}"
bind:handleCancel="一个页面函数,在点击取消按钮后被触发"
bind:handleConfirm="一个页面函数,在点击确认按钮后被触发">
  <!-- 中间写在模态框中的内容 -->
</showModal>

注意,页面函数用函数名字符串即可

promise封装request

  /**
 *  使用Promise 对wx.request进行封装
 * @param {url,method,data} params 
 */

const request = (params = {methods, url, data,header}) => {
  return new Promise(function (resolve, reject) {
    wx.request({
      url: params.url,
      method: params.method,
      header: params.header,
      data: params.data,
      timeout: 5000,
      success(res) {
        if (res.statusCode == 200) {
          if (res.data.code == 200 || res.data.code === 0) {
            resolve(res);
          } else {
            reject(res.data);
          }
        } else {
          wx.showToast({
            title: '提示',
            content: '网络请求超时!',
          })
          reject();
        }

      },
      fail(err) {
        reject(err)
      }
    })
  })
}

module.exports = {
  request
}

附带了一个请求超时,在then中调用。

调用该组件的话,在页面js的开头这样写就好了:

const { request } = require('../../utils/request');

具体使用的话,也给个例子:

request({
          url: url, // 后端定义的接口
          method: 'GET', // 接口的调用方法
          data: {}, // 接口需要的参数
          header: {}, // 接口需要的头
        }).then(res => {
          // 处理成功调用时返回的参数res
        }).catch(err => {
          // 处理调用失败时返回的参数err
        })

一层层"then"下去就好了,比起异步请求方便得多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微信小程序开发中,可以封装request函数来简化网络请求的代码。这样,在发起网络请求时就不需要重复写wx.request({method:xxx})这些代码,只需要调用封装好的getRequest、postRequest等方法即可。\[1\] 以下是一个封装request函数的示例代码: ```javascript // request.js function request(url, data = {}, method = "GET") { return new Promise(function(resolve, reject) { wx.request({ url: url, data: data, method: method, header: { 'Content-Type': 'application/json', 'X-Litemall-Token': wx.getStorageSync('token') }, success: function(res) { if (res.statusCode == 200) { if (res.data.errno == 501) { // 清除登录相关内容 try { wx.removeStorageSync('userInfo'); wx.removeStorageSync('token'); } catch (e) { // 处理异常 } // 切换到登录页面 wx.navigateTo({ url: '/pages/auth/login/login' }); } else { resolve(res.data); } } else { reject(res.errMsg); } }, fail: function(err) { reject(err); } }); }); } ``` 在页面中调用封装好的request函数时,可以按照以下方式进行: ```javascript // 页面中调用request函数 util.request(api.GoodsList, { data1: "", data2: "" }) .then(function(res) { // 请求成功接收到的res console.log(res); }); ``` 通过封装request函数,可以提高代码的复用性和可维护性,使网络请求的代码更加简洁和易读。\[2\]\[3\] #### 引用[.reference_title] - *1* [【微信小程序原生】 封装request](https://blog.csdn.net/AAAXiaoApple/article/details/124715966)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [微信小程序封装request](https://blog.csdn.net/weixin_43857786/article/details/116291951)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值