换了vue3+alova后,老板被我整笑了

这篇具有很好参考价值的文章主要介绍了换了vue3+alova后,老板被我整笑了。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

老板又来了BT的需求😳

我们公司最近开发一款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???🤬🤬🤬)

这咋整!!!?

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

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

😎😎😎完美!!!

// 代码有点长,自行脑补...

SB老板又来了

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

我:🤢🤢🤢

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

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

我们决定封装成一个库

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

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

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

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

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

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

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

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

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

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

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

来,直接上模型图。
换了vue3+alova后,老板被我整笑了

alova诞生了

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

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

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

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

  1. ✅请求的非异步模式
  2. ✅响应数据缓存
  3. ✅数据预拉取

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

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

// api/index.js
export 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.vue
const 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.toymoban.com/news/detail-440174.html

到了这里,关于换了vue3+alova后,老板被我整笑了的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 测试月入30K,Soeasy?测试这一行涨薪机制被我摸透了...

    首先涨薪并不是从8000涨到9000这种涨薪,而是从8000涨到15K加到25K的涨薪。基本上三年之内就可以实现。 如果我们只是普通的有应届毕业生或者是普通本科那我们就只能从小公司开始慢慢往上走。 有些同学想去做测试,是希望能够日后收入能够买房买车,然后能够让我在大城

    2023年04月25日
    浏览(50)
  • 不好意思,ELK 该换了!

    来源:https://cloud.tencent.com/developer/article/2115373 最近客户有个新需求,就是想查看网站的访问情况,由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的页面,咱也做不到 成熟的日志解决方

    2024年02月05日
    浏览(47)
  • 不好意思,Nginx 该换了!

    来源:nginx(ID:nginx-study) Cloudflare公司去年宣布弃用nginx,转用自研的新一代方向代理服务Pingora,并号称比nginx更快、更高效、更安全,下面通过Cloudfare官方网站的一篇文章来了解下Pingora比Nginx强在哪里。 今天,我们很高兴有机会在此介绍 Pingora,这是我们使用 Rust 在内部构

    2024年02月08日
    浏览(56)
  • 不好意思,Mybatis Plus 该换了!

    来源:juejin.cn/post/6886019929519177735 使用fluent mybatis可以不用写具体的xml文件,通过java api可以构造出比较复杂的业务sql语句,做到代码逻辑和sql逻辑的合一。不再需要在Dao中组装查询或更新操作,在xml或mapper中再组装参数。那对比原生Mybatis, Mybatis Plus或者其他框架,FluentMybati

    2024年02月08日
    浏览(53)
  • 什么样的故障让阿里云换了总裁?

    📣📣📣📣📣📣📣 🎍大家好,我是慕枫 🎍前阿里巴巴高级工程师,InfoQ签约作者、阿里云专家博主,一直致力于用大白话讲解技术知识 🎍在这里和大家分享一线互联网大厂面试经验、技术人成长路线以及Java技术、分布式、高并发、架构设计方面的经验总结 🎍感恩遇见

    2024年02月03日
    浏览(36)
  • 前端工作方式要换了?HTMX简介:无需JavaScript的动态HTML

    HTMX允许你使用扩展的HTML语法代替 JavaScript 来实现交互性。 HTMX 在标记中直接为你提供HTTP 交互,并支持许多其他交互需求,无需求助于 JavaScript。这是一个有趣的想法,可能最终会影响到web前端的工作方式。让我们看看如何使用HTMX以及它的吸引力。 HTMX已经存在了一段时间,

    2024年01月20日
    浏览(57)
  • 假设你新换了电脑,如何不用U盘的情况下实现软件文件转移?

    要将笔记本和台式机连接到同一个局域网,并实现文件共享或使用文件传输协议进行文件传输,您可以按照以下步骤操作: 设置局域网连接 共享文件夹 使用文件传输协议 Step 1: 设置局域网连接 确保笔记本和台式机连接到同一个局域网。有几种常见的连接方式: 通过路由器

    2024年02月12日
    浏览(64)
  • 换了固态硬盘需要重装系统吗?教你如何实现不重装系统!

    电脑大家都用过嘛,如果您的计算机装的还是机械硬盘,想必阁下肯定是修身养性的高手,因为在这个浮躁的社会中,是很少有人能够忍受5分钟甚至更久的开机时间的,不仅开机慢,应用程序的响应速度也很慢,用电脑时得在旁边摆一壶茶,双击一下PS,然后就可以去品茶了

    2024年02月09日
    浏览(46)
  • 如何与甲方/老板/导师对接

    跟甲方或者老板对接,初步了解甲方或者老板的大概要求,需要我们做什么,老板为什么会有这个想法,觉得项目可行之后,接下项目。 觉得项目不可行做不下来,告诉甲方或者老板,为什么做不了,解释完之后万一老板强行要做,那我们就只有照接(做好记录)。不过要告

    2024年02月06日
    浏览(47)
  • 由于不会Git被老板好好教训,学会PyCharm内置Git工具让老板刮目相看!(包含PyCharm 中如何Git merge 冲突)

    最近因为不会Git,被老板狠狠的骂了一顿,呜呜, 另外如果不在linux 或者非要纯命令行的情况下,建议上手PyCharm内置的Git很好使用.(疯狂打脸) 因为如果你非要用命令行 在合并冲突的时候 还得用VSCode手动合并冲突(或者大神可以用Vim),去分清===========到底谁是谁,还不如用好现成的

    2024年01月22日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包