位置: IT常识 - 正文

换了vue3+alova后,老板被我整笑了(vue项目更新后还是老代码)

编辑:rootadmin
换了vue3+alova后,老板被我整笑了 老板又来了BT的需求😳

推荐整理分享换了vue3+alova后,老板被我整笑了(vue项目更新后还是老代码),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue环境切换,vue项目更新后还是老代码,vue环境切换,vue3 vite,vue项目更新后还是老代码,vue3的变化,vue项目更新后还是老代码,vue3 vite,内容如对您有帮助,希望把文章链接给更多的朋友!

我们公司最近开发一款todo管理产品,vue3+axios,事情是这样的。

老板:我们的产品测试版我试用了,整体实现的不错,不过……

我:😨😨😨

老板:体验上有待优化一下,比如……todo列表页翻页的时候能不能瞬间展示数据?添加和编辑todo的时候可不可以不要等待了?

我(心想):❓❓❓这是要跳过和服务器交互阶段?把我给整不会了!

老板:小伙子,看好你哦,明天可以出一版我看看吗? 我:我…我试试!

我突然机灵一闪

针对翻页瞬间展示数据的问题,我们是不是可以先请求当前页数据,然后做一个缓存来预加载下一页数据,说干就干,代码大概是这样的:

// todo列表组件const currentPage = ref(1);const pageCache = {};const loading = ref(false);// 如果有缓存则返回缓存,没有则请求数据并缓存const getPageData = async page => { let pageData = pageCache[page]; if (!pageData) { loading.value = true; pageData = await axios.get('...', { params: { page: page, pageSize: 10, } }); loading.value = false; pageCache[page] = pageData; } return pageData;};// 进入时请求当前页数据,同时预加载下一页数据const todoList = ref([]);const loadNextPage = async () => { const pageData = await getPageData(currentPage.value); todoList.value.push(pageData); currentPage.value++; getPageData(currentPage.value);};onMounted(loadNextPage);window.addEventListener(() => { if (/* 判断滑动到最底部... */) { loadNextPage(); }});

针对添加和编辑todo也不等待的问题,把更新事件传过来,然后我直接乐观更新

// 编辑todo组件const addTodo = newTodoData => { axios.post('...', newTodoData).then().then(newId => { // 响应后将原todo项替换为带id的项 this.$emit('replaceTodo', { search: newTodoData, replacement: { id: newId, ...newTodoData, } }); }); // 先立即添加到todoList this.$emit('addTodo', newTodoData); alert('提交成功');}

好像一切都那么完美,老板该要夸我了。

我真的emo了😓

老板:小伙子,干的不错,只是…

我:😲😲😲

老板:我刚才网络不太好,显示提交成功了,但好像又没有真正成功,不太稳啊。。。

我:好的老板,我再回去看看😔😔😔

老板:对了,如果能在没有网络的情况下也能使用就更好了。

我:好的老板!😀😀😀(心里:What???🤬🤬🤬)

这咋整!!!?

经过一番激烈的讨论,砸头锤脑版的洗礼,我们终于得出了一个方案,我们准备:

让没有请求成功的请求信息先保存到本地,然后再间隔一定时间离线状态下直接将请求信息保存到本地,然后在联网的情况下再提交

😎😎😎完美!!!

// 代码有点长,自行脑补...SB老板又来了

老板:哈哈,好像比之前是好多了,能不能把积分功能、皮肤功能、订单功能都用上你的缓存方案。

我:🤢🤢🤢

老板:哦对了,后续我们还要搞pad版…

💀💀💀好吧,没辙了,终究还是没有逃过封装这一步。

我们决定封装成一个库

前端组长:哦,辛苦你啦,这事就交给你负责吧。既然要做成一个js库,那我们就得好好考虑一下这些问题了。

要如何抽象才能覆盖更多场景?能不能让前端新手也能很快上手?请求相关的状态多且繁杂,能不能也统一管理起来?公司后续可能会有react项目,能不能一起兼容?写出来的库不能太大

我:好的组长,这对我也是一次挑战,我现申请两个月时间好好设计一下可以吗?🤨🤨🤨

换了vue3+alova后,老板被我整笑了(vue项目更新后还是老代码)

前端组长:好的,去干吧小伙子!!!😚😚😚

不过这真的很煎熬,很有挑战,要支持那么多条件。经过了一段时间的挠头思考,我得到的结果是:头上越来越凉了😶😶😶,不过,还是要继续!!!

我想出了一个请求场景管理的概念

经过我茶不思饭不想的加紧奋斗,我终于交出了一稿,我想出了一个 请求场景管理 的概念。什么是请求场景管理呢?大概是这样的。

我们在进行一次请求时总是会遇到这些问题:

什么时候发出请求;是否要展示请求状态;是否要封装成请求函数以便重复调用;要如何加工响应数据;是否要对高频使用的响应数据做缓存;如何进行跨页面操作数据;离线了还能提交数据吗;…

而fetch或axios往往更专注于如何与服务端交互,但对于上面的问题我们总是需要自己处理,这些有利于应用性能和稳定性的功能,总会让程序员们编写出低维护性的代码。请求场景管理就是从准备请求到响应数据加工完毕的所有环节进行抽象,从而覆盖以前端为视角的,整个CS交互生命周期的模型。

CS交互:泛指所有客户端类型和服务端的数据交互

来,直接上模型图。

alova诞生了

按着请求场景管理的逻辑,我们完成了这个js库,名叫alova,它就像一个请求库的武装盔甲,帮助我们使用请求库发起请求,同时以响应式状态的形式来管理请求相关的数据,我们对它的定位是对axios等请求库的一种补充,而非替代品。

哈哈,这些我都做到啦!!!🤣🤣🤣

✅抽象覆盖更多场景✅axios相似的api,前端新手也能很快上手✅静默提交、离线提交✅将请求相关的各种状态都统一管理起来了✅兼容公司当前的vue项目,同时也兼容公司后续的react项目✅压缩后3+kb

当然功能还远不止于此!!!还有这些:

✅请求的非异步模式✅响应数据缓存✅数据预拉取…

alova库传送门在此!!!,求你不要不识抬举,点个start吧🤣🤣🤣

然后我们的todo列表展示就可以改成这样了。 先创建一个alova实例,是不是很像创建一个axios实例

// api/index.jsexport const alovaInstance = createAlova({ baseURL: 'https://api.alovajs.org', // vue项目传入VueHook,react项目传入ReactHook statesHook: VueHook, // 传一个请求适配器,GlobalFetch是我们提供的fetch api适配器 // 你想用axios也可以自定义一个适配器 requestAdapter: GlobalFetch(), // 是不是有熟悉的味道 beforeRequest(config) { config.headers.token = 'tokenxxx'; }, async responsed(response) { const json = await response.json(); if (json.code !== 200) { throw new Error(json.message); } return json.data; },});

定义请求函数。

// api/todo.js// 创建请求对象export const getTodoList = page => alovaInstance.Get('...', { params: { page, pageSize: 10, }, localCache: 50000,});

最后在组件中发起请求。

// TodoList.vueconst currentPage = ref(1);const todoList = ref([]);// 创建预加载器const { fetch } = useFetcher();const { loading, data: pageData, error, onSuccess, // 监听currentPage变化就去触发请求} = useWatcher(() => getTodoList(currentPage.value), [currentPage], { immediate: true});onSuccess(rawPageData => { todoList.value.push(rawPageData); // 请求成功后预加载下一页数据,并缓存 fetch(getTodoList(currentPage.value + 1));});window.addEventListener(() => { if (/* 判断滑动到最底部... */) { // 页码改变,自动发起请求,然后命中缓存并立即调用onSuccess currentPage.value ++; }});

不用等待网络的todo项创建是这样的,开启了silent模式后,离线状态下照样可以正常完成哦。

创建todo的请求函数定义

// api/todo.js// 创建请求对象export const createTodo = newTodo => alovaInstance.Post('...', newTodo);

点击创建按钮后进行静默提交。

const newTodo = reactive({ title: '', time: '',});const { send: requestCreateTodo onSuccess} = useRequest(() => createTodo(newTodo), { // 设置不立即发出请求,而是改用send函数调用发起,即手动模式 immediate: false, // 设置为静默提交模式 silent: true,});// 静默提交时,成功回调将会被立即执行onSuccess(() => { // 在这里手动更新新的todo项到todoList里 updateState(getTodoList(), todoList => { return [ ...todoList, { // 看到这了没?🤩🤩🤩,这是延迟更新数据的写法 '+id': resData => resData.id, ...newTodo, } ] });});// 假设点击“创建”按钮后触发此函数const handleCreateTodoBtnClick = () => { requestCreateTodo();};

这样也就完成了静默提交的操作了,图中有个 延迟更新数据 的功能我要特别说明一下(划重点🖍🖍🖍),它就像一个占位符,既可以让已确定的数据立即更新到对应的响应式状态中,让界面立即重新渲染,又可以在稍后请求响应后将占位符替换为实际数据的。

例子中就是在创建todo项时立即将todo项更新到todo列表数据中,同时它的id将在提交成功后自动替换为实际的id,这样就做到了非延迟的数据提交。

😃这次,我们老板终于开心了!

然后,我们又花了一些时间将项目的多个端使用alova改造,都取得了不错的效果,我们都喜笑颜开了!!!尤其是老板🧔🧔🧔。

老板:小伙子,干的漂亮,我要给你颁发奖章啊,我们的产品体验相比之前上升了一个档次了啊!

我:😶😶😶老板,别冲动!!!要不…给我多发个两万奖金就行啦…

老板:你在想屁吃!!!😲😲😲

前端组长:你在想屁吃!!!😲😲😲

我:开玩笑开玩笑,组长让我当就行了🤭🤭🤭

前端组长:我…qnmlgb!

各位看官们,你们觉得这个想法如何呢?让我看到你们的双手🙌🏻🙌🏻🙌🏻

再来一遍,alova库传送门在此!!!,求你不要不识抬举,点个start吧🤣🤣🤣

本文链接地址:https://www.jiuchutong.com/zhishi/300342.html 转载请保留说明!

上一篇:详解Transformer中Self-Attention以及Multi-Head Attention(transformer for)

下一篇:人工智能能否在翻译中胜过人类?(人工智能能否在证券市场取得额外收益)

  • 手机电池显示百分比在哪设置(手机电池显示百分百,拔掉电源就关机)

    手机电池显示百分比在哪设置(手机电池显示百分百,拔掉电源就关机)

  • 苹果8更新13卡吗(苹果8手机升级13.3怎么样)

    苹果8更新13卡吗(苹果8手机升级13.3怎么样)

  • 苹果xr热点电脑连不上(苹果xr热点电脑怎么连接)

    苹果xr热点电脑连不上(苹果xr热点电脑怎么连接)

  • 快手商品可以合并订单发货吗(快手商品可以合并付款吗)

    快手商品可以合并订单发货吗(快手商品可以合并付款吗)

  • 微信怎么设置支付页面密码(微信怎么设置支付密码锁不让别人看)

    微信怎么设置支付页面密码(微信怎么设置支付密码锁不让别人看)

  • 华为手机锁屏页面时间怎么设置(华为手机锁屏页面上的时间怎么设置)

    华为手机锁屏页面时间怎么设置(华为手机锁屏页面上的时间怎么设置)

  • pcle固态是什么意思(pcle固态与ssd固态的区别)

    pcle固态是什么意思(pcle固态与ssd固态的区别)

  • 车票信息已过期什么意思(12306车票信息已过期什么意思)

    车票信息已过期什么意思(12306车票信息已过期什么意思)

  • ipad和优学派有什么区别(优学派学生平板与苹果平板对比)

    ipad和优学派有什么区别(优学派学生平板与苹果平板对比)

  • 台式电脑显示屏不亮怎么回事(台式电脑显示屏不亮但是主机已开机)

    台式电脑显示屏不亮怎么回事(台式电脑显示屏不亮但是主机已开机)

  • 拉黑了短信能收到吗(拉黑了短信能收到吗微信)

    拉黑了短信能收到吗(拉黑了短信能收到吗微信)

  • 苹果xr内存有几个版本(苹果xr的内存多少)

    苹果xr内存有几个版本(苹果xr的内存多少)

  • 手机进水竖纹会自动消失吗(手机进水竖条纹)

    手机进水竖纹会自动消失吗(手机进水竖条纹)

  • 剪映的视频发朋友圈很模糊(剪映的视频发朋友圈很模糊怎么办)

    剪映的视频发朋友圈很模糊(剪映的视频发朋友圈很模糊怎么办)

  • 华为p20有没有nfc功能(华为nova11有nfc功能吗)

    华为p20有没有nfc功能(华为nova11有nfc功能吗)

  • 苹果5s为啥不能用4g(苹果5s为啥不能玩金铲铲)

    苹果5s为啥不能用4g(苹果5s为啥不能玩金铲铲)

  • icloud满了有什么影响(苹果icloud满了会怎么样)

    icloud满了有什么影响(苹果icloud满了会怎么样)

  • 酷狗vip是电脑手机互用吗(酷狗vip手机上和电脑不能通用吗)

    酷狗vip是电脑手机互用吗(酷狗vip手机上和电脑不能通用吗)

  • 怎么发朋友圈微信(怎么发朋友圈微信晒单)

    怎么发朋友圈微信(怎么发朋友圈微信晒单)

  • 艺龙黑鲸会员有啥用(黑鲸会员价格)

    艺龙黑鲸会员有啥用(黑鲸会员价格)

  • 滴滴出行拼车什么意思(滴滴拼车拼车规则)

    滴滴出行拼车什么意思(滴滴拼车拼车规则)

  • 苹果夜景模式怎么调(苹果夜景模式怎么开启)

    苹果夜景模式怎么调(苹果夜景模式怎么开启)

  • 刚开的淘宝店怎么发布宝贝(刚开的淘宝店怎么做起来)

    刚开的淘宝店怎么发布宝贝(刚开的淘宝店怎么做起来)

  • 抖音粉丝按什么排序(抖音粉丝什么时候更新)

    抖音粉丝按什么排序(抖音粉丝什么时候更新)

  • 华为nova4与4e的区别(华为nova4跟4e一样吗)

    华为nova4与4e的区别(华为nova4跟4e一样吗)

  • 微信对话框绿色能改吗(微信对话框绿色是什么色号)

    微信对话框绿色能改吗(微信对话框绿色是什么色号)

  • 图虫视频怎么保存到手机(图虫视频怎么保存本地)

    图虫视频怎么保存到手机(图虫视频怎么保存本地)

  • pidof命令  查找服务进程的PID号码(查找命令位置)

    pidof命令 查找服务进程的PID号码(查找命令位置)

  • repquota命令  显示文件系统配额的汇总信息(repo命令详解)

    repquota命令 显示文件系统配额的汇总信息(repo命令详解)

  • 金税开票软件怎么修改开票人
  • 个税申报怎么办
  • 公司没有收入怎么报销
  • 企业的筹建期允许有多长?
  • 吸收合并一般需要多久
  • 公司刻一套章子多少钱
  • 生产过程半成品报废
  • 发票开出来对方不走账会怎么样?
  • 增值税进行未认定怎么办
  • 临时人员工资需交税吗
  • 所得税除以利润总额是稳定性评价指标吗
  • 金税三期个人所得税扣缴系统网络设置
  • 取得甲供材料按简易征收发票能抵扣吗
  • 资本公积账务重组
  • 生产成本中材料款年末要全部结转吗
  • windows10如何卸载edge
  • 华为系统设置权限
  • 小规模减免的税额怎么做账
  • 总分类账是什么的依据
  • 如何更换电脑开机动画
  • php curl header参数
  • 不征税收入用于支出所形成的费用是什么意思
  • 净损益是
  • ctl.start
  • PHP:disk_total_space()的用法_Filesystem函数
  • 直布罗陀巨岩山
  • laravel debug rce
  • 单位专项资金使用管理规
  • 任意公积金可以不提取吗
  • Yii2 队列 shmilyzxt/yii2-queue 简单概述
  • 税控系统的维护包括哪些内容
  • php的运算符主要包括哪些?
  • 公司亏损注销了怎么处理
  • php计算多个集合的数据
  • php获取开始与结束的函数
  • 【第三趴】uni-app页面搭建与路由配置(了解工程目录结构、学会搭建页面、配置路由并成功运行)
  • node.js的安装步骤
  • 研发费用范围归集不正确
  • 在阿里云的云主机之间怎么通信
  • 电费账务qc
  • 工程咨询属于什么服务业
  • 民办非注销原因如何写
  • 累计摊销咋算
  • 开具发票要注意的方面是有哪些?
  • 收入准则适用范围
  • 红字发票账务处理需冲回成本吗?
  • 公司转给其他公司的投资款
  • 总产值的计算方法是什么
  • 材料采购成本包括买价和采购费用
  • 支票有效期过期了怎么办
  • mysql 非聚集索引
  • 微软6月24号
  • linux系统转换为win系统脚本
  • window8开机
  • winxp文件夹选项
  • mac修改用户名称
  • 解决win10蓝屏
  • win8系统如何查看文件浏览痕迹记录
  • airplay macbook
  • win10缺少文件怎么办
  • 萝卜家园和番茄花园哪个好
  • 多文件操作
  • 系统映像不存在怎么重装系统
  • 微信小程序实现轮播图
  • 批处理语言 从入门到精通
  • html td 合并
  • ReactNative 之FlatList使用及踩坑封装总结
  • js对象foreach
  • 简述javascript执行原理
  • 文件夹如何取名字
  • js实现原理
  • linux的sed -i
  • 工具类的作用
  • jquery中each()方法的作用及使用
  • jquerycuishifeng
  • 税务局约谈记录
  • 黄金消费税税率是多少
  • 锂电池税收优惠政策
  • 北京交通政务
  • 2022年印花税最新规定反映了什么
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设