每个vue组件是一个私有的作用域(script标签包裹的都是)如下测试:
父组件:
子组件:
结果:我们发现只有定义在vue原型上的,才能拿到,因为this就是vue的实例,实例当然可以访问原型上的方法啦,但是虽然父组件引入了子组件,但是却不能使用子组件中的变量。
我们发现vue-runtime-esm.js也就是:
说明在预编译单文件组件的时候,就没找到父组件中打印的这个变量,说明每一个单文件组件作用域都是独立的。
正是利用私有作用域的特性,我们可以把一些当前组件中一些静态数据,不需要变动的,放在export default外边,与其平级的script标签中,因为如果放在data中时,就会触发数据劫持,消耗不必要的性能。
css私有原理:
可以清楚看到,添加scoped后,vue-loader加载器会做两个处理:
1、给html标签添加data-v-hash属性
2、给css样式添加[data-v-hash]选择器
这样一来,css样式就只对带有相应data-v-hash的标签起作用了,也就变现实现了css作用域的功能。