位置: IT常识 - 正文

vue项目created()被调用多次的坑(vue created mounted)

编辑:rootadmin
vue项目created()被调用多次的坑 一、问题描述

推荐整理分享vue项目created()被调用多次的坑(vue created mounted),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue created this,vue create 项目,vue create 项目报错,vue created 操作dom,vue里的created,vue created 操作dom,vue里的created,vue里的created,内容如对您有帮助,希望把文章链接给更多的朋友!

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

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

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

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

二、排查过程

1.从头开始排查前端项目,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') }

2.继续,查看./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() } }}vue项目created()被调用多次的坑(vue created mounted)

其中,当上一步执行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,否则就不显示。

3.根据生产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次。

4.正确代码如下:

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

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

三、备注

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

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

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

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

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

上一篇:用vue实现打印页面的几种方法(vue如何实现打印)

下一篇:OpenAI创始人:GPT-4的研究起源和构建心法(openai创始人阿尔特曼 取向)

  • 新版qq音乐音乐房间去哪里了(新版qq音乐音乐影片功能)

    新版qq音乐音乐房间去哪里了(新版qq音乐音乐影片功能)

  • play4tpro有陀螺仪功能吗(荣耀play4tpro陀螺仪延迟怎么办)

    play4tpro有陀螺仪功能吗(荣耀play4tpro陀螺仪延迟怎么办)

  • 操作系统作为接口连接的是(操作系统作为接口的特点)

    操作系统作为接口连接的是(操作系统作为接口的特点)

  • 华为手机文字怎么设置(华为手机文字怎么换成中文)

    华为手机文字怎么设置(华为手机文字怎么换成中文)

  • 荣耀各个系列的区别(荣耀各系列的定位和特点)

    荣耀各个系列的区别(荣耀各系列的定位和特点)

  • 美团申诉什么理由会成功(美团申诉什么理由最有效)

    美团申诉什么理由会成功(美团申诉什么理由最有效)

  • oppoa59悬浮球在哪里设置(oppoa55悬浮球)

    oppoa59悬浮球在哪里设置(oppoa55悬浮球)

  • 微信加人不显示怎么回事(微信加人不显示红点)

    微信加人不显示怎么回事(微信加人不显示红点)

  • 苹果官网定的手机可以退吗(苹果官网定的手机怎么退款)

    苹果官网定的手机可以退吗(苹果官网定的手机怎么退款)

  • ns蓝牙在哪里打开(ns蓝牙配对)

    ns蓝牙在哪里打开(ns蓝牙配对)

  • 显示器显示的数据来源于(显示器显示的数字是什么)

    显示器显示的数据来源于(显示器显示的数字是什么)

  • 对方关闭了查找我的iphone怎么办(对方关闭了查找设备怎么定位)

    对方关闭了查找我的iphone怎么办(对方关闭了查找设备怎么定位)

  • 演示样机和普通机有什么不同(演示样机有什么区别)

    演示样机和普通机有什么不同(演示样机有什么区别)

  • 怎么把照片设置成手机壁纸(怎么把照片设置成一寸照片大小)

    怎么把照片设置成手机壁纸(怎么把照片设置成一寸照片大小)

  • 双稳态触发器的类型有(双稳态触发器的记忆功能)

    双稳态触发器的类型有(双稳态触发器的记忆功能)

  • gtx850是独立显卡吗

    gtx850是独立显卡吗

  • 华为手机如何设置应用使用时间(华为手机如何设置返回键)

    华为手机如何设置应用使用时间(华为手机如何设置返回键)

  • 一加7T怎么加密应用(一加7怎么加密应用)

    一加7T怎么加密应用(一加7怎么加密应用)

  • mate20pro超广角怎么用(mate20 pro超广角)

    mate20pro超广角怎么用(mate20 pro超广角)

  • iqoo是双扬声器吗(iqoo双扬声器手机有哪些)

    iqoo是双扬声器吗(iqoo双扬声器手机有哪些)

  • 群聊聊天记录怎么生成(群聊聊天记录怎么转发)

    群聊聊天记录怎么生成(群聊聊天记录怎么转发)

  • 红米note7pro有小爱同学吗(红米note7有小窗口吗)

    红米note7pro有小爱同学吗(红米note7有小窗口吗)

  • vivox27pro有红外线吗(vivox27手机带红外线功能)

    vivox27pro有红外线吗(vivox27手机带红外线功能)

  • 苹果手机的便签在哪里(苹果手机的便签突然不见了在哪里找)

    苹果手机的便签在哪里(苹果手机的便签突然不见了在哪里找)

  • iTab插件谷歌浏览器安装、使用(程序员、开发、设计、摸鱼神器)(chrome插件api)

    iTab插件谷歌浏览器安装、使用(程序员、开发、设计、摸鱼神器)(chrome插件api)

  • Vue基础--webpack介绍以及基础配置(vue中webpack用来干啥)

    Vue基础--webpack介绍以及基础配置(vue中webpack用来干啥)

  • tsar命令  收集服务器系统信息

    tsar命令 收集服务器系统信息

  • 退回企业所得税的账务处理
  • 所得税税负率的计算公式中营业收入含不含税
  • 建设工程劳务分包的规定
  • 应征增值税不含税销售额(3%征收率)怎么填2020年
  • 餐费可以抵扣吗
  • 差额发票能不能报销
  • 代建制规定
  • 水利建设专项收入怎么计算
  • 土地出让金评估费怎么算
  • 现金折让怎么做会计分录
  • 堤围防护费什么时候停止征收
  • 已抵扣的增值税怎么做账
  • 汇算清缴退税现金流量表
  • 增值税专用发票几个点
  • 发票作废情况说明书
  • 房租增值税专用发票和普通发票的税率
  • 远程清卡显示清卡失败,证书已挂失怎么回事
  • 如何确定增值税以旧换新方式下销售货物的销售额
  • 药品底价高开票什么意思
  • 租赁发票需要写税号吗
  • 社保显示已录入什么意思
  • 税务申报系统叫什么
  • 给研发人员福利怎么做账
  • 营业费用包括哪些明细科目内容
  • 员工垫付货款走报销吗
  • 出口免抵退申报期限最新政策解读
  • 个体工商户的专票可以抵扣吗
  • 员工的罚款计入什么科目
  • 小商业企业应交所得税
  • 如何修复win7系统引导
  • vmware10虚拟机安装
  • php+redis
  • win7系统怎么设置最佳性能
  • php图片库
  • 注册造价师挂靠费如何缴个税?
  • 高德加载kml
  • segment anything model github
  • vue3封装axios
  • 计提的福利费怎么处理
  • PyTorch 深度学习实战 | 基于生成式对抗网络生成动漫人物
  • Sublime Text 4 (Build 4143) 注册方法STEP BY STEP
  • php封装app
  • 期权增发是什么行业
  • 小规模纳税人去年免税,红冲后今年开多少税率的发票
  • 利润表上期数指的是什么
  • 4s店收到红字发票怎么办
  • Fatal error: Call to undefined function mysqli_init() in 路径
  • 财务费用的科目类别是什么
  • 企业设立账簿
  • 其他权益工具的公允价值变动计入哪里
  • 固定资产处置的净收入计入
  • 非流动资产处置损失计入什么科目
  • 以前年度损益调整账务处理分录
  • 什么是库存现金限额?为什么要核定库存现金限额
  • 坏账准备的帐务处理
  • 现金发放工资有什么风险
  • 收到赠送的样品附件
  • 收到现金怎么做凭证
  • 品牌代理费计入什么科目
  • 所得税汇算清缴报告在哪查
  • 企业差旅费的报销流程
  • MySQL之Field‘***’doesn’t have a default value错误解决办法
  • win10一年更新一次
  • winxp系统纯净版
  • windows开始界面
  • centos7误删除怎么恢复
  • pacis.exe - pacis是什么进程 有什么用
  • vb win7
  • shell脚本echo输出变量
  • 深度缓冲
  • android 退出app
  • linux每隔1s执行一次命令
  • 什么是javascrip
  • 五十八二
  • jQuery Ajax 全局调用封装实例代码详解
  • 河南城乡居民医疗保险电话
  • 求资金占用利息的公式
  • 上海税务局怎么变更财务负责人
  • 税收筹划与避税的性质相同
  • 湖北国税发票手机查询
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设