3.小程序方法的封装

详情

js 复制代码
// 在使用 toast 方法时,可以传入参数,也可以不传入参数
// 如果需要传入参数,要传入对象作为参数
// const toast = (options = {}) => {}

/**
 * @description 消息提示框
 * @param { Object } options 参数和 wx.showToast 参数保持一致
 */
const toast = ({ title = '数据加载中...', icon = 'none', duration = 2000, mask = true } = {}) => {
  // 如果用户传入了对象作为参数
  // 在形参位置通过解构的方式获取用户传入的参数,同时设置默认值

  wx.showToast({
    title,
    icon,
    duration,
    mask
  })
}

/**
 * @description 模态对话框
 * @param { Object } options 参数和 wx.showModal 参数保持一致
 */
const modal = (options = {}) => {
  // 在调用 modal 方法时,可以传递参数,也可以不传递参数
  // 如果不传递参数,默认值就是空对象
  // 如果传递参数,参数需要时一个对象,对象中的属性需要和 wx.showModal 参数保持一致

  // 在方法内部需要通过 Promise 返回用户的操作
  // 如果用户点击了确定,需要通过 resolve 返回 true
  // 如果用户点击了取消,需要通过 resolve 返回 false
  return new Promise((resolve) => {
    // 默认的参数
    const defaultOpt = {
      title: '提示',
      content: '您确定执行该操作吗?',
      confirmColor: '#f3514f'
    }

    // 通过 Object.assign 方法将参数进行合并
    // 需要使用传入的参数覆盖默认的参数
    // 为了不影响默认的参数,需要将合并以后的参数赋值给一个空对象
    const opts = Object.assign({}, defaultOpt, options)

    wx.showModal({
      // 将合并以后的参数通过展开运算符赋值给 wx.showModal 对象
      ...opts,
      complete({ confirm, cancel }) {
        confirm && resolve(true)
        cancel && resolve(false)
      }
    })
  })
}

// 如果有很多 .js 文件,都需要调用 toast 方法
// 每次使用都需要导入 toast,然后进行调用,太麻烦
// 可以将 toast 方法挂载到 wx 全局对象身上
// 如果想挂载到 wx 全局对象上这种写法生效,需要让当前文件执行一次
wx.toast = toast
wx.modal = modal

// 如果其他 .js 文件,需要使用 toast 方法
// 需要先导入 toast ,然后进行调用才可以
export { toast, modal }

解析

这段代码是一个 wx.showToast 的二次封装函数,目的是更方便地调用微信小程序的提示框。

我给你按 Java 开发的思路拆解一下(你有后端背景,这样理解更快)。


一、整体作用

js 复制代码
const toast = ({ title = '数据加载中...', icon = 'none', duration = 2000, mask = true } = {}) => {

👉 定义了一个函数 toast

👉 用来调用 wx.showToast() 显示消息提示框

👉 并且提供了默认参数


二、核心知识点

这里有两个重要知识点:

① 参数对象解构 + 默认值

js 复制代码
({ title = '数据加载中...', icon = 'none', duration = 2000, mask = true } = {})

这段是 ES6 的 对象解构赋值 + 默认值写法

等价于下面的传统写法:

js 复制代码
const toast = (options) => {
  const title = options.title || '数据加载中...'
  const icon = options.icon || 'none'
  const duration = options.duration || 2000
  const mask = options.mask || true
}

但是原代码写法更优雅。


= {} 的作用(非常重要)

js 复制代码
({ ... } = {})

这个 = {} 是给整个参数一个默认值。

为什么需要?

因为如果你这样调用:

js 复制代码
toast()

如果没有 = {},就会报错:

复制代码
Cannot destructure property 'title' of undefined

所以:

js 复制代码
= {}

的作用是:

如果用户没有传参数,默认用空对象 {},避免报错。


三、函数体

js 复制代码
wx.showToast({
  title,
  icon,
  duration,
  mask
})

这是 ES6 的 对象属性简写

等价于:

js 复制代码
wx.showToast({
  title: title,
  icon: icon,
  duration: duration,
  mask: mask
})

因为变量名和 key 一样,所以可以省略。


四、完整逻辑流程

举例:

情况1:什么都不传

js 复制代码
toast()

实际调用:

js 复制代码
wx.showToast({
  title: '数据加载中...',
  icon: 'none',
  duration: 2000,
  mask: true
})

情况2:只改 title

js 复制代码
toast({ title: '保存成功' })

实际调用:

js 复制代码
wx.showToast({
  title: '保存成功',
  icon: 'none',
  duration: 2000,
  mask: true
})

情况3:全部自定义

js 复制代码
toast({
  title: '成功',
  icon: 'success',
  duration: 3000,
  mask: false
})

五、和 Java 对比理解

这段代码本质上相当于 Java 里的:

java 复制代码
public void toast(String title, String icon, Integer duration, Boolean mask) {
    if (title == null) title = "数据加载中...";
    if (icon == null) icon = "none";
    if (duration == null) duration = 2000;
    if (mask == null) mask = true;
}

只不过 JS 支持:

  • 参数默认值
  • 对象解构
  • 属性简写

所以代码更简洁。


六、总结一句话

这段代码是:

对微信小程序 wx.showToast 的一个封装函数,

使用 ES6 对象解构 + 默认值,让调用更简洁、安全、优雅。


结构

很好,这个问题问得非常关键 👍
"解构"是 ES6 里非常重要的语法特性。


一句话解释

解构(Destructuring)=
把数组或对象里面的值,拆出来,直接赋值给变量。

就像把一个盒子拆开,把里面的东西分别拿出来。


一、对象解构(你刚才代码里的那种)

普通写法

js 复制代码
const obj = {
  name: 'Tom',
  age: 18
}

const name = obj.name
const age = obj.age

解构写法

js 复制代码
const { name, age } = obj

等价于:

js 复制代码
const name = obj.name
const age = obj.age

这就叫:

对象解构

意思是:

👉 把对象里的字段拆出来

👉 直接赋值给同名变量


二、数组解构

普通写法

js 复制代码
const arr = [10, 20]

const a = arr[0]
const b = arr[1]

解构写法

js 复制代码
const [a, b] = arr

等价。


三、为什么叫"解构"?

英文是:

Destructuring

意思是:

  • structure = 结构
  • de-structure = 拆解结构

也就是:

把结构拆开


四、解构 + 默认值

js 复制代码
const { name = '匿名', age = 0 } = {}

意思是:

如果对象里没有这个字段

就用默认值


五、函数参数里的解构(你刚才那个)

js 复制代码
const toast = ({ title = '默认标题' } = {}) => {
}

意思是:

  1. 参数必须是一个对象
  2. 从对象里拿出 title
  3. 如果没有 title,用默认值
  4. 如果没传参数,用空对象 {}

六、用 Java 思维理解

JS 解构 ≈ Java 里手动取字段:

java 复制代码
String name = obj.getName();
int age = obj.getAge();

JS 只是帮你省略了:

js 复制代码
const { name, age } = obj

七、最常见的三种解构场景

1️⃣ API 返回数据

js 复制代码
const res = {
  code: 200,
  data: { id: 1 }
}

const { code, data } = res

2️⃣ 函数参数

js 复制代码
function user({ name, age }) {
}

3️⃣ 交换变量(数组解构)

js 复制代码
let a = 1
let b = 2

[a, b] = [b, a]

八、总结一句话

解构就是:

把对象或数组里的值,拆出来,直接赋值给变量。


如果你愿意,我可以给你做一张:

👉 「JS 解构完整知识脑图」

👉 或者做一个 "前端 ES6 必会语法速通表"

你现在已经开始进入前端核心语法区了 👌

相关推荐
程序员小寒8 小时前
前端性能优化之白屏、卡顿指标和网络环境采集篇
前端·javascript·网络·性能优化
次顶级10 小时前
表单多文件上传和其他参数处理
前端·javascript·html
小一梦11 小时前
宝塔面板单域名部署多个 Vue 项目:从路径冲突到完美共存
服务器·javascript·vue.js
柳杉12 小时前
两款惊艳的 WebGL 开源项目推荐
前端·javascript·数据可视化
jingxindeyi12 小时前
react实现狼吃羊游戏
javascript·react.js·游戏
小金鱼Y13 小时前
别再乱拷贝了!JS 浅拷贝 vs 深拷贝全解析
前端·javascript
m0_6948455714 小时前
Oh My Zsh 使用指南:Zsh 终端配置与插件管理教程
服务器·前端·小程序·开源·github
英俊潇洒美少年14 小时前
React19 useActionState的注意事项
前端·javascript·react.js
发现一只大呆瓜14 小时前
性能优化:CDN 缓存加速与调度原理
前端·javascript·面试