我的编程空间,编程开发者的网络收藏夹
学习永远不晚

vue项目中created()被调用多次的问题怎么解决

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

vue项目中created()被调用多次的问题怎么解决

本文小编为大家详细介绍“vue项目中created()被调用多次的问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue项目中created()被调用多次的问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

一、问题描述

最近碰到一个奇怪的生产问题:

正常情况下、前端页面会请求一次后台、然后后台返回信息("处理成功"或"处理失败")、前端展示;
后台用aop+redis写了一个防止重复调用的方法,如果5s内同一个用户重复调用同一个接口,就返回"请勿重复调用",前端就会展示这个。

但是,某几个页面,前端总是会重复调用后端2次,导致用户只能看到"请勿重复调用",无法确认本次操作是成功还是失败,严重影响了用户的正常使用。(虽然是处理成功,但是显示不出来…)

一开始还怀疑是不是后端的问题,排查了半天,终于锁定了,是前端的问题,vue项目中的created()方法被调用了2次。

继续排查,发现从正常页面跳转到这个问题页面时,确实只跳转了1次,按理说created()方法应该也只触发1次的,但是就是不知道为什么触发了2次。

二、排查过程

从头开始排查前端项目,vue项目首先会加载main.js,发现这个文件里有:

import Vcon from './assets/js/vcon'new Vcon({  env: ENV}, () => {  new Vue({    router,    render: h => h(App)  }).$mount('#app')})

发现这个文件里,并不是普通的使用new Vue()创建的页面,而是外面有封装了一个new Vcon()方法,并传了2个参数,其中第一个参数是{ env: ENV },第二个参数是 () => { new Vue({ router, render: h => h(App) }).$mount('#app') }

继续,查看./assets/js/vcon.js文件,发现这个文件里有类似这样的:

class Vcon {  constructor (opt, callBack) {    this.env = opt.env || '' // 记录代码环境    this.callBack = callBack // 记录回调函数    // 如果是生产环境    if (this.env !== 'test') {      this.prodInit()      typeof this.callBack === 'function' && this.callBack()      return    }    // 如果是测试环境    if (this.env === 'test') {      this.testInit()      return    }  }  testInit () {    import('vconsole').then(({ default: VConsole }) => {      new VConsole()      console.log('测试vconsole加载完成')      typeof this.callBack === 'function' && this.callBack()    })  }    prodInit () {    let _that = this    window.ISALES.callApp('getUserInfoByNative', {      callback: function (userInfo) {        if (userInfo.code === '0') {          _that.betterStaffNUmber = userInfo.msg.staffNumber          _that.betterHandler(userInfo)          return        }        alert('获取sdk出错,请稍后再试')      }    })  }    betterHandler (userInfo) {    if (userInfo.msg.userCode == 'admin') {      import('vconsole').then(({ default: VConsole }) => {        new VConsole()        console.log(`admin的vconsole加载完成`)        typeof this.callBack === 'function' && this.callBack()      })      return    }else{      this.callBack()    }  }}

其中,当上一步执行new Vcon()时,实际执行的就是这里的constructor ()方法;

如果是测试环境,那就执行testInit ()方法,这个还是比较明显的,用来展示vconsole(测试环境一直正常,没有复测出来问题);
如果是生产环境,那就执行prodInit()方法,然后执行typeof this.callBack === 'function' && this.callBack()方法(这里感觉有些问题,先继续看);

prodInit()方法里,会执行window.ISALES.callApp方法,这个是个sdk方法(这个前端项目是vue项目,可以打包后把静态页面部署在服务器上;sdk方法是app和ios里的方法,前端只能这样才能调用到、待sdk方法处理完后会触发callback方法);

sdk方法中,会执行betterHandler()方法,意思是,如果当前app/ios的登录人是admin,那就显示vconsole,否则就不显示。

根据生产created()方法被调用2次、而测试正常的现象,排查到问题方法位置:

    // 如果是生产环境    if (this.env !== 'test') {      this.prodInit()      typeof this.callBack === 'function' && this.callBack()      return    }

因为prodInit()方法的逻辑中,正常情况下,已经调用过一次typeof this.callBack === 'function' && this.callBack()了,然而执行完prodInit()方法后,又会调用一次typeof this.callBack === 'function' && this.callBack(),所以才导致created()方法被重复调用了2次。

正确代码如下:

    // 如果是生产环境    if (this.env !== 'test') {      this.prodInit()      //这里导致了重复created()      //typeof this.callBack === 'function' && this.callBack()      return    }

修改后,发布生产,终于恢复了正常。

三、备注

vue项目中,有时会自动优化代码格式,导致if后面没有大括号、只有1句,满足条件就执行、不满足就不执行,需要注意。

有时,if没有else,而是if中结尾有个return,此时也类似else,但是容易忽略,需要注意。(这个也是自动优化格式的?还是故意写的难懂了?)

typeof this.callBack === 'function' && this.callBack(),这个的意思是,如果this.callBackfunction类型的,那就会执行后面的this.callBack()方法,然后继续下一步;如果不是function类型的,那就不执行后面的方法,直接继续下一步。(又一个不好理解的高级写法,用if不好吗?)

4.正常情况下,vue页面的created()方法会在页面初始化的时候执行1次;但是如果代码有问题,就会导致created()方法会在页面初始化的时候执行2次或多次(如本文),这个坑需要注意。

读到这里,这篇“vue项目中created()被调用多次的问题怎么解决”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

vue项目中created()被调用多次的问题怎么解决

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

vue项目中created()被调用多次的问题怎么解决

本文小编为大家详细介绍“vue项目中created()被调用多次的问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue项目中created()被调用多次的问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来
2023-07-05

js中setInterval多次调用问题怎么解决

在 JavaScript 中,setInterval 函数可以用来重复执行一个函数或者一段代码。然而,有时候我们可能需要在 setInterval 函数执行的过程中,暂停或者停止该函数的执行。以下是解决 setInterval 多次调用问
js中setInterval多次调用问题怎么解决
2024-02-29

Vue项目中怎么解决跨域问题

本篇内容主要讲解“Vue项目中怎么解决跨域问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue项目中怎么解决跨域问题”吧!跨域跨域报错是前端开发中非常经典的一个错误,报错如下 Access
2023-07-02

Vue开发项目中的兼容问题怎么解决

今天小编给大家分享一下Vue开发项目中的兼容问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. KingEdit
2023-07-04

vue-cli创建项目的loader问题怎么解决

这篇文章主要介绍“vue-cli创建项目的loader问题怎么解决”,在日常操作中,相信很多人在vue-cli创建项目的loader问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue-cli创建
2023-07-04

Vue项目中使用setTimeout存在的潜在问题及解决

这篇文章主要介绍了Vue项目中使用setTimeout存在的潜在问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-28

Vue+tsx使用slot没有被替换的问题怎么解决

本篇内容介绍了“Vue+tsx使用slot没有被替换的问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录前言发现问题解决后记前言
2023-06-20

vue中ref的使用问题怎么解决

本文小编为大家详细介绍“vue中ref的使用问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue中ref的使用问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。vue的ref(this.$r
2023-06-29

vue项目中的public、static及指定不编译文件问题怎么解决

这篇文章主要介绍“vue项目中的public、static及指定不编译文件问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue项目中的public、static及指定不编译文件问题怎么解
2023-07-05

PHP项目中遇到无法调用commit的问题怎么办

当在PHP项目中遇到无法调用commit的问题,可能是由于代码中的错误、权限不足或者版本控制工具配置问题等引起的。在遇到这类问题时,可以通过以下方法来逐步排查和解决:一、检查代码错误首先,需要检查代码中是否有语法错误、逻辑错误或者其他与提
PHP项目中遇到无法调用commit的问题怎么办
2024-03-04

vue项目proxyTable配置和部署服务器的问题怎么解决

这篇文章主要介绍“vue项目proxyTable配置和部署服务器的问题怎么解决”,在日常操作中,相信很多人在vue项目proxyTable配置和部署服务器的问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家
2023-06-30

springmvc项目使用@Valid+BindingResult遇到的问题怎么解决

本篇内容介绍了“springmvc项目使用@Valid+BindingResult遇到的问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有
2023-06-21

vue项目中使用axios遇到的相对路径和绝对路径问题怎么解决

这篇文章主要讲解了“vue项目中使用axios遇到的相对路径和绝对路径问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue项目中使用axios遇到的相对路径和绝对路径问题怎么解决
2023-06-30

java高级用法之JNA中的回调问题怎么解决

今天小编给大家分享一下java高级用法之JNA中的回调问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。简介什么是c
2023-06-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录