Skip to content

工具函数

uni-toolkit 提供了一系列实用的工具函数,帮助开发者简化常见任务的处理,包括权限管理、页面路由处理等。

目录

概述

uni-toolkit 提供了一系列实用的工具函数,帮助开发者简化常见任务的处理,包括权限管理、页面路由处理等。这些工具函数可以直接在项目中使用,无需额外配置。

主要工具函数

工具函数功能描述适用场景
checkSelfPermission检查应用权限状态需要检查权限的场景
shouldShowRequestPermissionRationale判断是否显示权限说明权限请求前判断
permissionAuth权限认证工具权限认证流程
checkPermissions检查小程序权限状态小程序权限检查
requestPermissions请求小程序权限小程序权限申请
checkAndRequestLocationAuth检查并请求位置权限位置功能权限申请
checkAndRequestImageAuth检查并请求图片选择权限图片选择功能权限申请
showAuthTip显示权限提示对话框权限提示场景
showManualAuth引导用户手动授权权限被拒绝后引导
authTips权限提示文本权限提示文案
cloneDeep深拷贝对象对象深拷贝场景
getCurrentPageRoute获取当前页面路由路由信息获取
isPageLevelComponent判断是否为页面级组件组件类型判断

使用方式

javascript
// 按需导入工具函数
import { checkSelfPermission } from "uni-toolkit/tools";

// 检查权限状态
const hasPermission = checkSelfPermission("location");
console.log("是否有位置权限:", hasPermission);

按模块导入

使用 import { xxx } from "uni-toolkit/tools" 的方式可以只导入特定模块,减少包体积:

javascript
// 按需导入工具函数
import { checkSelfPermission, cloneDeep } from "uni-toolkit/tools";

每个工具函数都有详细的文档和使用示例,您可以通过上方的链接查看具体信息。

说明

该函数用于检查并请求小程序平台的图片选择权限。它是 requestPermissions 函数的封装,专门用于处理图片选择相关的权限。根据 sourceType 参数,它会检查并请求相机权限和/或相册权限。

sourceType 参数说明:

  • 'album' - 相册权限,用于从相册选择图片
  • 'camera' - 相机权限,用于拍照获取图片

该函数会根据不同小程序平台采用相应的权限检查和请求策略,并在必要时向用户显示权限说明。对于微信小程序,选择图片不需要相册权限,函数会自动处理这种特殊情况。

checkAndRequestLocationAuth

功能描述

检查并请求小程序位置权限,支持所有小程序平台。

参数

返回值

Promise<boolean> - 是否获得授权

使用示例

typescript
import { checkAndRequestLocationAuth } from "uni-toolkit/tools";

async function getLocation() {
  try {
    const hasPermission = await checkAndRequestLocationAuth();
    if (hasPermission) {
      // 已获得位置权限,可以获取位置信息
      uni.getLocation({
        type: "gcj02",
        success: (res) => {
          console.log("当前位置:", res.latitude, res.longitude);
        }
      });
    } else {
      console.log("用户未授予位置权限");
    }
  } catch (error) {
    console.error("获取位置权限失败:", error);
  }
}

说明

该函数用于检查并请求小程序平台的位置权限。它是 requestPermissions 函数的封装,专门用于处理位置相关的权限。该函数会根据不同小程序平台采用相应的权限检查和请求策略,并在必要时向用户显示权限说明。

checkAndRequestImageAuth

功能描述

检查并请求小程序图片选择权限,支持所有小程序平台。

参数

参数名类型必填默认值说明
sourceTypestring[]["album", "camera"]图片来源类型数组

sourceType 参数说明:

  • 'album' - 相册权限,用于从相册选择图片
  • 'camera' - 相机权限,用于拍照获取图片

返回值

Promise<boolean> - 是否获得授权

使用示例

typescript
import { checkAndRequestImageAuth } from "uni-toolkit/tools";

async function chooseImage() {
  try {
    // 检查并请求图片选择权限(包括相册和相机)
    const hasPermission = await checkAndRequestImageAuth(["album", "camera"]);
    if (hasPermission) {
      // 已获得图片选择权限,可以选择图片
      uni.chooseImage({
        count: 1,
        sourceType: ["album", "camera"],
        success: (res) => {
          console.log("选择的图片:", res.tempFilePaths);
        }
      });
    } else {
      console.log("用户未授予图片选择权限");
    }
  } catch (error) {
    console.error("获取图片选择权限失败:", error);
  }
}

// 只请求相机权限
async function takePhoto() {
  const hasPermission = await checkAndRequestImageAuth(["camera"]);
  if (hasPermission) {
    uni.chooseImage({
      count: 1,
      sourceType: ["camera"],
      success: (res) => {
        console.log("拍照结果:", res.tempFilePaths);
      }
    });
  }
}

说明

该函数用于检查并请求小程序平台的图片选择权限。它是 requestPermissions 函数的封装,专门用于处理图片选择相关的权限。根据 sourceType 参数,它会检查并请求相机权限和/或相册权限。

该函数会根据不同小程序平台采用相应的权限检查和请求策略,并在必要时向用户显示权限说明。对于微信小程序,选择图片不需要相册权限,函数会自动处理这种特殊情况。

checkPermissions

功能描述

检查小程序权限状态(不触发权限请求),支持同时检查多个权限。

参数

参数名类型必填说明
permissionTypesstring[]权限类型数组

权限类型说明:

  • 'location' - 位置权限
  • 'camera' - 相机权限
  • 'album' - 相册权限

返回值

Promise<{[key: string]: boolean}> - 返回各权限的授权状态

使用示例

typescript
import { checkPermissions } from "uni-toolkit/tools";

async function checkAllPermissions() {
  try {
    // 同时检查多个权限
    const permissions = await checkPermissions(["location", "camera", "album"]);

    console.log("位置权限:", permissions.location); // true 或 false
    console.log("相机权限:", permissions.camera); // true 或 false
    console.log("相册权限:", permissions.album); // true 或 false

    // 根据权限状态执行不同操作
    if (permissions.location) {
      // 有位置权限,获取位置信息
      getLocation();
    } else {
      // 没有位置权限,提示用户
      showLocationPermissionTip();
    }
  } catch (error) {
    console.error("检查权限失败:", error);
  }
}

说明

该函数用于检查小程序平台的权限状态,不会触发权限请求弹窗。它可以同时检查多个权限,并返回一个包含各权限状态的键值对对象。

对于微信小程序,选择图片不需要相册权限,函数会自动处理这种特殊情况,直接返回 true。

requestPermissions

功能描述

请求小程序权限,支持同时请求多个权限。

参数

参数名类型必填说明
permissionTypesstring[]权限类型数组

权限类型说明:

  • 'location' - 位置权限
  • 'camera' - 相机权限
  • 'album' - 相册权限

返回值

Promise<boolean> - 是否所有权限都已获得授权

使用示例

typescript
import { requestPermissions } from "uni-toolkit/tools";

async function requestAllPermissions() {
  try {
    // 同时请求多个权限
    const granted = await requestPermissions(["location", "camera"]);

    if (granted) {
      console.log("所有权限都已获得授权");
      // 执行需要这些权限的操作
    } else {
      console.log("部分或全部权限未获得授权");
      // 提示用户权限不足
    }
  } catch (error) {
    console.error("请求权限失败:", error);
  }
}

说明

该函数用于请求小程序平台的权限。它会先检查权限状态,对于未授权的权限,会显示权限请求弹窗。如果用户之前拒绝过权限,函数会显示提示信息,并引导用户到设置页面手动开启权限。

对于微信小程序,选择图片不需要相册权限,函数会自动处理这种特殊情况。

checkSelfPermission

功能描述

检查应用是否拥有指定权限,主要用于Android平台。

参数

参数名类型必填说明
permissionstring权限名称,例如 'android.permission.ACCESS_FINE_LOCATION'

返回值

Promise<boolean> - 是否拥有指定权限

使用示例

typescript
import { checkSelfPermission } from "uni-toolkit";

async function checkLocationPermission() {
  try {
    const hasPermission = await checkSelfPermission("android.permission.ACCESS_FINE_LOCATION");
    if (hasPermission) {
      console.log("应用已获得位置权限");
      // 执行需要位置权限的操作
    } else {
      console.log("应用未获得位置权限");
      // 请求权限或提供替代方案
    }
  } catch (error) {
    console.error("检查权限时出错:", error);
  }
}

增强功能

该函数封装了Android平台的权限检查逻辑,使用了原生API进行权限状态的检查。它返回一个Promise,解析为一个布尔值,表示应用是否拥有指定的权限。

shouldShowRequestPermissionRationale

功能描述

判断是否应该向用户显示权限请求的解释说明,主要用于Android平台。

参数

参数名类型必填说明
permissionstring权限名称,例如 'android.permission.ACCESS_FINE_LOCATION'

返回值

Promise<boolean> - 是否应该显示权限请求的解释说明

使用示例

typescript
import { shouldShowRequestPermissionRationale } from "uni-toolkit";

async function checkPermissionRationale() {
  const shouldShow = await shouldShowRequestPermissionRationale("android.permission.ACCESS_FINE_LOCATION");
  if (shouldShow) {
    // 向用户显示权限请求的解释说明
    uni.showModal({
      title: "需要位置权限",
      content: "我们需要位置权限来提供基于位置的服务",
      success: (res) => {
        if (res.confirm) {
          // 用户确认后请求权限
          requestLocationPermission();
        }
      }
    });
  } else {
    // 直接请求权限
    requestLocationPermission();
  }
}

function requestLocationPermission() {
  // 请求位置权限的代码
}

增强功能

该函数封装了Android平台的权限解释逻辑,用于判断是否应该向用户显示权限请求的解释说明。当用户之前拒绝过权限请求,但没有选择"不再询问"时,返回true,表示应该向用户解释为什么需要该权限。

用户引导与提示

showAuthTip

功能描述

显示权限提示对话框,引导用户授予权限。

参数

参数名类型必填说明
titlestring对话框标题
contentstring对话框内容

返回值

Promise<boolean> - 用户是否点击了确认按钮

使用示例

typescript
import { showAuthTip } from "uni-toolkit";

async function requestLocationPermission() {
  const confirmed = await showAuthTip(
    "需要位置权限",
    "为了提供基于位置的服务,我们需要获取您的位置信息"
  );

  if (confirmed) {
    // 用户点击了确认按钮,继续请求权限
    console.log("用户同意授权,继续请求权限");
    // 执行权限请求逻辑
  } else {
    // 用户点击了取消按钮
    console.log("用户拒绝授权");
  }
}

增强功能

该函数封装了显示权限提示对话框的逻辑,使用uni.showModal实现跨平台的对话框展示。它返回一个Promise,解析为一个布尔值,表示用户是否点击了确认按钮。

showManualAuth

功能描述

引导用户手动授权,通常在自动授权失败后使用。

参数

参数名类型必填说明
platformMiniProgramPlatform小程序平台类型
authTypeAuthType权限类型

返回值

Promise<void> - 无返回值

使用示例

typescript
import { showManualAuth } from "uni-toolkit";

async function requestLocationPermission() {
  try {
    // 尝试自动请求位置权限
    const hasPermission = await checkAndRequestLocationAuth("mp-weixin");

    if (!hasPermission) {
      // 自动授权失败,引导用户手动授权
      await showManualAuth("mp-weixin", "location");
      console.log("已引导用户手动授权");
    }
  } catch (error) {
    console.error("权限请求出错:", error);
  }
}

增强功能

该函数封装了引导用户手动授权的逻辑,会根据不同平台和权限类型,显示相应的引导提示,并在用户确认后跳转到系统设置页面。

通用工具

cloneDeep

功能描述

深拷贝对象,创建一个与原对象结构和值相同但完全独立的新对象。

参数

参数名类型必填说明
objany源对象

返回值

any - 深拷贝后的对象

使用示例

typescript
import { cloneDeep } from "uni-toolkit";

const originalObj = {
  name: "张三",
  age: 25,
  address: {
    city: "北京",
    district: "朝阳区"
  },
  hobbies: ["读书", "游泳"]
};

// 创建深拷贝
const clonedObj = cloneDeep(originalObj);

// 修改克隆对象不会影响原对象
clonedObj.name = "李四";
clonedObj.address.city = "上海";
clonedObj.hobbies.push("旅行");

console.log(originalObj.name); // 输出: "张三"
console.log(originalObj.address.city); // 输出: "北京"
console.log(originalObj.hobbies); // 输出: ["读书", "游泳"]

增强功能

该函数实现了对象的深拷贝,可以正确处理嵌套对象、数组、日期对象等复杂数据结构,避免了使用JSON.parse(JSON.stringify())方法可能带来的问题(如无法处理循环引用、函数、undefined等)。

getCurrentPageRoute

功能描述

获取当前页面的路由信息。

参数

返回值

string - 当前页面的路由路径

使用示例

typescript
import { getCurrentPageRoute } from "uni-toolkit";

// 获取当前页面路由
const currentRoute = getCurrentPageRoute();
console.log("当前页面路由:", currentRoute); // 例如: "/pages/index/index"

// 根据路由执行不同逻辑
if (currentRoute === "/pages/index/index") {
  console.log("当前在首页");
} else if (currentRoute === "/pages/user/profile") {
  console.log("当前在用户资料页");
}

增强功能

该函数封装了获取当前页面路由的逻辑,适用于所有uni-app支持的平台。它可以帮助开发者根据当前页面路径执行不同的业务逻辑。

isPageLevelComponent

功能描述

判断当前组件是否为页面级组件。

参数

返回值

boolean - 是否为页面级组件

使用示例

typescript
import { isPageLevelComponent } from "uni-toolkit";

// 在组件内部判断是否为页面级组件
const isPage = isPageLevelComponent();
if (isPage) {
  console.log("当前组件是页面级组件");
  // 执行页面级组件特有的逻辑
} else {
  console.log("当前组件是普通组件");
  // 执行普通组件的逻辑
}

增强功能

该函数通过检查当前组件实例的特性来判断它是否为页面级组件。在uni-app中,页面级组件和普通组件有不同的生命周期和特性,使用此函数可以帮助开发者编写适应不同组件类型的代码。

类型定义与常量

MiniProgramPlatform

功能: 小程序平台类型

类型定义

typescript
type MiniProgramPlatform = "mp-alipay" | "mp-weixin" | "mp-baidu" | "mp-qq" | "mp-toutiao" | "mp-kuaishou" | "mp-jd" | "app" | "h5";

使用示例

typescript
import { MiniProgramPlatform } from "uni-toolkit";

const platform: MiniProgramPlatform = "mp-weixin";
console.log(platform); // "mp-weixin"

说明

该类型定义了所有支持的小程序平台类型。在需要针对不同平台进行特殊处理时,可以使用这个类型来确保平台参数的正确性。

AuthType

功能: 权限类型枚举

使用示例

typescript
import { AuthType } from "uni-toolkit";

// 使用权限类型枚举
const authType: AuthType = AuthType.LOCATION;

说明

该枚举定义了各种权限类型,用于统一权限管理。通过使用枚举,可以避免在代码中直接使用字符串,提高代码的可维护性和可读性。

authTips

功能: 权限提示信息集合

使用示例

javascript
import { authTips } from "uni-toolkit";

// 使用权限提示信息
const locationTip = authTips.LOCATION;
console.log(locationTip.title); // "位置权限"
console.log(locationTip.content); // "需要位置权限以提供更好的服务"

说明

该对象包含了各种权限的提示信息,包括标题和内容。在需要显示权限提示时,可以直接使用这些预定义的提示信息,保持应用中权限提示的一致性。

平台支持

所有工具函数都支持以下平台:

平台支持情况备注
APP-PLUS✅ 支持原生APP环境
MP✅ 支持小程序环境
H5✅ 支持浏览器环境

注意事项

  • 权限相关工具函数在不同平台上的行为可能有所不同,请参考具体文档
  • 深拷贝工具对于大型对象可能会有性能影响

基于 MIT 许可发布