uniapp项目实践总结(十四)封装存储和路由方法

news2024/12/26 22:08:53

导语:在日常 APP 开发过程中,经常要用到数据的存储、获取和删除等操作以及页面导航之间的跳转,为此,封装了一个两个简单的方法来统一调用。

目录

  • 原理分析
  • 方法实现
  • 实战演练
  • 案例展示

原理分析

主要是以下 API。

  • uni.setStorage:保存数据到本地缓存中;
  • uni.getStorage:获取保存的缓存数据;
  • uni.removeStorage:移除保存的数据缓存;
  • uni.clearStorage:清空保存的缓存数据;
  • uni.navigate{type}:跳转页面;

以下方法存于根目录下的scripts文件夹下的utils.js文件中。

方法实现

接下来一一说明如何实现数据缓存操作和路由跳转的封装。

数据缓存

这里是使用一个方法,通过传入不同的类型和参数来实现。

参数如下:

  • type: 类型,包括设置,获取,删除,清空;
  • isSync: 是否异步;
  • key: 键名;
  • val: 值;
// 存储数据
async function storeage(options) {
  try {
    let defultOptions = {
      type: options.type,
      isSync: options.isSync || false,
      key: options.key,
      data: options.val,
    };
    let params = { ...options, ...defultOptions };
    console.log("数据缓存参数:", params);
    let { type, isSync, key, data } = params;
    let result = null,
      types = {
        set: uni[`setStorage${isSync ? "Sync" : ""}`],
        get: uni[`getStorage${isSync ? "Sync" : ""}`],
        del: uni[`removeStorage${isSync ? "Sync" : ""}`],
        clear: uni[`clearStorage${isSync ? "Sync" : ""}`],
      };
    if (type == "set") {
      if (isSync) {
        result = await types[type](key, data);
      } else {
        result = await types[type]({
          key,
          data,
        });
      }
    }
    if (["get", "del"].includes(type)) {
      let param = isSync ? key : { key };
      result = await types[type](param);
    }
    if (type == "clear") {
      result = await types[type]();
    }
    return {
      code: 1,
      data: result,
    };
  } catch (e) {
    return {
      code: 2,
      data: e,
    };
  }
}

路由操作

这里是把常用的路由方法装进一个方法里面了,方便调用。

参数如下:

  • type: 路由类型;
  • url: 路由地址
  • key: 键名;
  • delta: 返回级数;
// 页面跳转
async function navigate(options) {
  let res = null,
    defultOptions = {
      type: options.type || "to",
      url: options.url || "",
      delta: options.delta || 1,
    },
    params = { ...options, ...defultOptions };
  if (!params.type) return;
  if (params.type != "back" && !params.url) return;
  let { type, url, delta } = params;
  console.log("页面跳转参数:", params);
  if (type == "to") {
    res = await uni.navigateTo({
      url,
    });
  }
  if (type == "back") {
    res = await uni.navigateBack({
      delta,
    });
  }
  if (type == "redir") {
    res = await uni.redirectTo({
      url,
    });
  }
  if (type == "tab") {
    res = await uni.switchTab({
      url,
    });
  }
  if (type == "lanuch") {
    res = await uni.reLaunch({
      url,
    });
  }
  return res;
}

实战演练

模板内容

  • 缓存数据操作
<button class="eg-btn" @click="storeSet('set')">设置数据</button>
<button class="eg-btn" @click="storeSet('get')">获取数据</button>
<button class="eg-btn" @click="storeSet('remove')">删除数据</button>
<button class="eg-btn" @click="storeSet('clear')">清空数据</button>
<view class="eg-res"> 数据:{{ data }} </view>
  • 路由操作
<button class="eg-btn" @click="goPage('to', '/pages/test/stand')">去模板</button>
<button class="eg-btn" @click="goPage('back', '', 1)">返回上一页</button>
<button class="eg-btn" @click="goPage('redir', '/pages/index/swiper')">去重定向</button>
<button class="eg-btn" @click="goPage('tab', '/pages/user/index')">去我的</button>
<button class="eg-btn" @click="goPage('lanuch', '/pages/index/list')">去列表</button>

脚本方法

  • 定义数据
// 缓存数据
let data = ref("");
  • 数据操作

这里为了方便都整合到一起调用了。

async function storeSet(type) {
  let id = proxy.$apis.utils.uuid(),
    key = "1693991490699-10vrs3hoiv6";
  if (type == "set") {
    let res = await proxy.$apis.utils.storeage({
      type: "set",
      isSync: true,
      key: id,
      val: `id-${id}`,
    });
    console.log(`数据${type}操作结果:`, res);
  }
  if (type == "get") {
    let res = await proxy.$apis.utils.storeage({
      type: "get",
      isSync: true,
      key,
    });
    if (res.code == 1) {
      data.value = res.data;
    }
    console.log(`数据${type}操作结果:`, res);
  }
  if (type == "remove") {
    let res = await proxy.$apis.utils.storeage({
      type: "del",
      isSync: true,
      key,
    });
    console.log(`数据${type}操作结果:`, res);
  }
  if (type == "clear") {
    let res = await proxy.$apis.utils.storeage({
      type: "clear",
      isSync: true,
    });
    console.log(`数据${type}操作结果:`, res);
  }
}
  • 路由方法

这里为了方便都整合到一起调用了。

async function goPage(type, url, delta) {
  let data = await proxy.$apis.utils.navigate({
    type,
    url,
    delta,
  });
  console.log("页面跳转结果:", data);
}

案例展示

  • 数据缓存
    在这里插入图片描述

  • 页面路由
    在这里插入图片描述

最后

以上就是封装存储和路由方法的主要内容,有不足之处,请多多指正。

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

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

相关文章

xcode iOS 在app文件中开启访问 Document Directory

xcode iOS 在app文件中开启访问 Document Directory 在 Plist 中设置 LSSupportsOpeningDocumentsInPlace为 YES 且UIFileSharingEnabled为 YES &#xff08;这个不添加好像也可以&#xff09; 可以从系统的Files应用中访问应用的 Documents 目录 电脑 助手也可以访问 开…

视频号挂公众号链接最新教程方法,赶紧来看

玩视频号的朋友&#xff0c;尤其是靠挂公众号引流的朋友&#xff0c;肯定心里非常清楚&#xff0c;就在八月初&#xff0c;视频号放大招了&#xff0c;可以说这个大招是完全把公众号的路给堵死了&#xff0c;视频号出了什么新规呢&#xff0c;大家来看看。 第一个规则是&#…

无涯教程-JavaScript - IMTAN函数

描述 IMTAN函数以x yi或x yj文本格式返回复数的切线。复数的切线由以下公式计算- tan(z)正弦(z)/cos(z) 语法 IMTAN (inumber)争论 Argument描述Required/OptionalInumberA complex number for which you want the tangent.Required Notes Excel中的复数仅存储为文本。…

最新keil安装出现的无数问题记录及解决办法

报错问题现象如下&#xff1a; *** Target Target 1 uses ARM-Compiler Default Compiler Version 5 which is not available. 安装最新keil 5 出现无数个问题。 我使用GD32去跑&#xff0c;或者STM32去跑&#xff0c;都是这个问题。 一、我先解决了GD32的问题&#xff1a;…

阻塞队列学习总结

ArrayBlockingQueue&#xff1a;一个由数组结构组成的有界阻塞队列。 LinkedBlockingQueue&#xff1a;一个由链表结构组成的有界阻塞队列。 PriorityBlockingQueue&#xff1a;一个支持优先级排序的无界阻塞队列。 DelayQueue&#xff1a;一个使用优先级队列实现的延迟无界…

分库分表实战

数据分片与分片算法 分库分表的第一性原理&#xff0c;那就是&#xff1a;存储容量和性能容量。只有对核心业务表才会精心进行分库分表的设计。 首先我们了解一下数据分片是什么意思&#xff1f; 本质上的分库分表不就是数据分片吗&#xff1f;定义就是&#xff1a;按照某个…

BBR 带宽估计的延后累加

一个关于时延统计分布的小测试&#xff0c;用 netem delay jitter distribution pareto 模拟&#xff0c;得到下面的结果&#xff1a; netem 的 jitter 并不是真 jitter&#xff0c;只是通过延时阻滞部分报文模拟 jitter&#xff0c;对保序流而言&#xff0c;就表现为乱序&am…

搭建自己的OCR服务,第一步:选择合适的开源OCR项目

一、OCR是什么&#xff1f; 光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;是指对文本资料的图像文件进行分析识别处理&#xff0c;获取文字及版面信息的过程。 亦即将图像中的文字进行识别&#xff0c;并以文本的形式返回。 二、OCR的基本流程 1…

Science子刊 | 将CAR-T细胞疗法与造血干细胞移植相结合 或许 能治疗所有血液癌症...

来源&#xff1a;BRUNO DELESSARD/CHALLENGES-REA/REDUX 新的CAR-T细胞疗法有望能治疗几乎所有血液癌症。目前&#xff0c;该疗法已被批准用于五种亚型的血液癌症。宾夕法尼亚大学帕尔曼医学院的科学家们在预临床试验中展示了这种方法的潜在效能。 2023年8月31日&#xff0c;发…

动态路由的主流算法

路由器就是一台网络设备&#xff0c;它有多张网卡。当一个入口的网络包送到路由器时&#xff0c;它会根据一个本地的转发信息库&#xff0c;来决定如何正确地转发流量。这个转发信息库通常被称为路由表。 一张路由表中会有多条路由规则。每一条规则至少包含这三项信息。 目的…

vscode 调试 ROS2

1、在下列目录同层级找到.vscode文件夹 . ├── build ├── install ├── log └── src 2、 安装ros插件 3、创建tasks.json文件&#xff0c;添加下列内容 //代替命令行进行编译 {"version": "2.0.0","tasks": [{"label": &…

一窥未来:PyQt5引领下一代Python GUI开发

PyQt5 是一个用于创建图形用户界面&#xff08;GUI&#xff09;的强大工具包&#xff0c;它基于 Qt 库&#xff0c;为 Python 提供了丰富的 GUI 开发能力。无论是初学者还是有经验的开发者&#xff0c;都可以通过本文深入了解如何使用 PyQt5 来构建各种各样的界面应用程序。本文…

CUDA说明和安装[window]

文章目录 1、查看版本信息查看GPU查看cuda版本其他方法 2区分 了解cudaCUDA ToolkitNVCCcuDNN 3/ 安装过程4/版本的问题CUDA Toolkit和 显卡驱动 的版本对应CUDA / CUDA Toolkit和cuDNN的版本对应 5/关于CUDA和Cudnn**5.1 CUDA的命名规则****5.2 如何查看自己所安装的CUDA的版本…

力扣接雨水(解析)

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] …

lv4 嵌入式开发-2 Linux文件IO

1 文件的打开 1.1 标准I/O - 打开文件 下列函数可用于打开一个标准I/O流&#xff1a; FILE *fopen (const char *path, const char *mode);成功时返回流指针&#xff1b;出错时返回NULL标准I/O – fopen – mode参数 示例 #include <stdio.h> int main(int argc, ch…

微信支付-Native支付(网页二维码扫码微信支付)简单示例

目录 概述 界面展示 & 前端代码&#xff08;Vue&#xff09; 后端实现&#xff08;SpringBoot&#xff09; Maven依赖 下单接口&#xff08;主要功能代码&#xff09; 支付成功回调接口 测试&#xff08;后端线上环境&#xff09; 概述 本篇博文主要演示和说明网页扫…

SpringSecurity学习

1.认证 密码校验用户 密码加密存储 Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter {Beanpublic PasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}} 我们没有这个配置&#xff0c;默认明文存储, {id}password;实现…

html 学习 之 文本标签

下面是一些常见的HTML文本标签&#xff08;&#xff0c;&#xff0c;&#xff0c;&#xff0c;和&#xff09;以及它们的作用&#xff1a; 标签 (Emphasis - 强调): 作用&#xff1a;用于在文本中表示强调或重要性。 示例&#xff1a; <p>这是一段文本&#xff0c;&l…

python将dataframe按需绘制折线图、柱状图、双坐标图

目录 绘制TI折线图绘制 import matplotlib.pyplot as plt# 设置中文显示 plt.rcParams[font.sans-serif] [SimHei] # 指定默认字体 plt.rcParams[axes.unicode_minus] False # 解决负号显示问题绘制TI折线图 def draw_TI(df_TI_night, output_TI_png, sector_id, terrain, …

代码随想录算法训练营第五十九天| 503.下一个更大元素II,42. 接雨水

代码随想录算法训练营第五十九天| 503.下一个更大元素II&#xff0c;42. 接雨水 503.下一个更大元素II42. 接雨水暴力解法双指针优化单调栈解法 503.下一个更大元素II 题目链接 视频讲解 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &a…