位置: 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创始人阿尔特曼 取向)

  • 微信零钱怎么转入零钱通(微信零钱怎么转到零钱通里去)

    微信零钱怎么转入零钱通(微信零钱怎么转到零钱通里去)

  • 微信群里踢人怎么踢人(微信群里踢人怎么踢不出去)

    微信群里踢人怎么踢人(微信群里踢人怎么踢不出去)

  • 网上查询身份证名下手机卡(网上查询身份证名下飞机票)

    网上查询身份证名下手机卡(网上查询身份证名下飞机票)

  • 苹果11如何给app上锁(苹果11如何给相册设置密码锁)

    苹果11如何给app上锁(苹果11如何给相册设置密码锁)

  • 华为freebuds3耳机盒能单独充电吗(华为freebuds3耳机盒丢了)

    华为freebuds3耳机盒能单独充电吗(华为freebuds3耳机盒丢了)

  • 网易云音乐云盘有什么用(网易云音乐云盘别人能听吗)

    网易云音乐云盘有什么用(网易云音乐云盘别人能听吗)

  • 钉钉通话记录在哪(钉钉的通话记录可以回放吗)

    钉钉通话记录在哪(钉钉的通话记录可以回放吗)

  • 骁龙和高通骁龙的区别(骁龙和高通骁龙的区别 新闻)

    骁龙和高通骁龙的区别(骁龙和高通骁龙的区别 新闻)

  • 手机迅雷是用来干嘛的(手机迅雷伤手机吗)

    手机迅雷是用来干嘛的(手机迅雷伤手机吗)

  • 8plus电池容量(苹果8p为什么被称为机皇)

    8plus电池容量(苹果8p为什么被称为机皇)

  • 为什么筛选显示不全(为什么筛选显示的信息不全)

    为什么筛选显示不全(为什么筛选显示的信息不全)

  • 手机淘宝微信支付怎么设置(淘宝支付方式微信)

    手机淘宝微信支付怎么设置(淘宝支付方式微信)

  • 一个文件的扩展名通常表示为什么(一个文件的扩展名通常为)

    一个文件的扩展名通常表示为什么(一个文件的扩展名通常为)

  • 微信现在能加多少好友(微信现在能加多少人)

    微信现在能加多少好友(微信现在能加多少人)

  • 智行火车票改签为什么还要付钱(智行火车票改签成功后会退回原来的车票钱吗)

    智行火车票改签为什么还要付钱(智行火车票改签成功后会退回原来的车票钱吗)

  • ppt暂停快捷键(ppt暂停键)

    ppt暂停快捷键(ppt暂停键)

  • 手机高德地图怎么更新(手机高德地图怎么看海拔多少米)

    手机高德地图怎么更新(手机高德地图怎么看海拔多少米)

  • 手机怎么提炼黄金(手机怎么提炼黄金犯法吗)

    手机怎么提炼黄金(手机怎么提炼黄金犯法吗)

  • 苹果8p多重(苹果8p多重量多少克)

    苹果8p多重(苹果8p多重量多少克)

  • iphne怎么设置来电铃声(苹果手机如何设置来电模式)

    iphne怎么设置来电铃声(苹果手机如何设置来电模式)

  • 苹果qq提示音改不了吗(ios改qq提示音)

    苹果qq提示音改不了吗(ios改qq提示音)

  • vivoz3快充怎么开启(vivoz3i怎么充电快点)

    vivoz3快充怎么开启(vivoz3i怎么充电快点)

  • 华为扫描文件在哪里(华为 扫描件)

    华为扫描文件在哪里(华为 扫描件)

  • xr第二个卡槽在哪(xr第二个卡槽在哪里打开)

    xr第二个卡槽在哪(xr第二个卡槽在哪里打开)

  • 增值税认证勾选平台
  • 内账会计会承担法律责任吗
  • 小规模纳税人免税账务处理
  • 什么样的个体需要纳税
  • 公司奖金没有按时发可以要吗
  • 企业取得非货币性收入
  • 其他应付款在现金流量表中应该填哪里
  • 外经证预缴税款之后剩下的税款交到哪呢
  • 股东退出资本金收回
  • 企业月奖金发放制度
  • 印花税已经缴纳了但是还未申报
  • 出售股票会计怎么做分录
  • 商品销售税金及附加会计分录
  • 汇算清缴补交的税怎么做凭证
  • 变相处理问题什么意思
  • 进口原材料的关税怎么算
  • 计算消费税要价税分离吗
  • 核定征收的个税怎么算
  • windows11怎么添加桌面图标
  • 环境保护税入账什么会计科目
  • 公司注销帐上的钱取出来要交税吗
  • 无序树有几种
  • php常用的设计模式在开发中的实例
  • 转销盘盈会计分录
  • echarts地图tooltip
  • php的session
  • php检测字符串长度
  • php中exec
  • css元素居中的几种方法
  • mysql_install_db命令 初始化MySQL数据目录
  • python统计字符串长度
  • 个税少报了能查出来吗
  • python搞自动化
  • 厂房出租一年多少钱
  • 生育津贴如何做帐
  • 出口货物离岸价差异原因说明表在电子税务局的位置
  • 附加税减免额怎么算
  • 公司股东的权利和义务有哪些
  • 净利润和盈余公式的关系
  • 社保怎么交最划算
  • 酒吧会计如何做工作
  • 小微企业减免的增值税账务处理
  • 小规模定额征收和查账征收哪个更好一些
  • 可供出售金融资产属于什么科目
  • 发票未及时开,但是双方会计已经做帐,怎么办?
  • 小规模纳税人出租不动产优惠政策
  • 加工费发票可以抵扣吗
  • 中小创投企业收益分析
  • 收据可以纳税吗
  • 个人账户转公司账户附言写什么
  • 以货物抵应收账款的分录
  • 小规模纳税人缴税的分录
  • 职工福利费的扣除标准工资总额包括什么
  • 替别人公司开发票违法吗
  • 酒店营业成本率怎么算
  • 发票 发票专用章
  • 装修费摊销怎么计算公式
  • 收到客户提供代付发票
  • 房产预售什么时候开始
  • mysql跨服务器查询语句
  • 在windows 10
  • sllights.exe - sllights进程是什么意思
  • 如何查看ubuntu系统版本
  • windows运行在哪
  • win7立体声混音怎么设置
  • ghoststartservice.exe是什么进程 有什么作用 ghoststartservice进程查询
  • linux执行多个脚本
  • Eclipse引入jdk1.8
  • android去掉状态栏第三方图标
  • python 数独破解器
  • js 实现跳转页面
  • jqueryw3c
  • js强制把网址设为密码
  • shell脚本中实现rm -fr !(file1)
  • java script教程
  • javascript面向对象编程指南 pdf
  • js弹出对话框的命令
  • javascript的基础类型有哪些
  • 临时税务登记纳税有区域限制吗为什么
  • 智能财税证书含金量
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设