众所周知,在vue项目初始化过程中,created的生命周期只在初始化执行了一次,最近在开发迭代公司vue2的老项目时候,发现同一个页面渲染之后created被执行了多次。
在vue的生命周期created里打印
async created() { console.log('执行了created') console.log(this.invoiceInfo) }
一般来说,生命周期created只会在页面初始化过程中执行一次,但是这次却执行多次。该项目是一个上传图片发票显示页面的项目,可以传入多张图片,每新增上传1张,created执行了当前图片数量的次数。也就是当前上传了1张,再上传1张created就会执行2次,但是当我传入重复的发票时候,created就不会被执行多次。 页面样式如下:
进一步看下代码,发现created的生命周期是组件内部的,也就是整个页面的发票展示界面是一个组件invoice
问题的根本在于之前同事在组件内部使用了for循环,每循环一次,created就被执行一次,在invoices这个数组中有几张发票,就会被执行几次created。而且这个循环的KEY是由发票code或者唯一的uuid决定的,就是说重复的发票的code是一样的,造成重复的发票created不会重复执行 另外这个KEY取值还会造成另一个问题,之前的KEY设置的发票号码,页面刚好可以修改发票号码,每修改一个这个发票号码的数字,页面就会重新执行渲染,如果是移动端,每修改一次发票号码,手机键盘都会出现唤起来,再关闭。这个问题后台同事反馈过来,最后定位到是这个原因引起的。后来改成发票code,不会修改,完美解决这个问题。