Vue的data变量都会循环执行绑定setter和getter,为了保证渲染效率,不需要修改的变量使用Object.freeze,但是需要修改的变量使用Object.freeze会有问题,而放在data中会影响效率;要是把变量放在export default 之外,当成局部变量会有问题。
例子:
parent.vue
<template>
<div>
<child></child>
<child></child>
<child></child>
</div>
</template>
<script>
import child from './child.vue'
export default{
components: { child }
}
</script>
child.vue
<template>
<h3>hello child</h3>
</template>
<script>
let chart;
console.log('chart')
export default{
created(){
chart = new Chart()
}
}
</script>
执行parent.vue的时候只会打印一次chart,因为vue-cli打包的时候,chart被当成了parent.vue中的局部变量,所有子组件共享该局部变量。
有没有好的解决方案?
###首先确认一个事情,vue中会被数据劫持的只有在初始化实例中已经定义在data函数中的数据,
后续的诸如我们在created
这些钩子函数、或者methods
等中定义的都不会, 也就是无法双向绑定,除非使用set
重新设置, 所以你只要不写在data里面,其他地方比如在钩子函数中定义this.chart = new Chart()
都可以实现题主想要的效果
export default {
data () {
this.staticData = ""; // 这种方式不会被监听
return {
// 这里时会被监听的
}
}
}