点击我显示提示信息 // 等价与event.prevent
@keyup.enter 按下回车 delete 删除退格、esc退出、space空格、 tab换行、up上、down下、left左、right右对于所有的 Vue 组件,只要设置了,Vue就会给该组件生成一个唯一data值。
Vue 会将data值作为一个属性添加到组件内所有HTML的DOM节点
如果组件内部包含子组件,这有两种情况:
,则只会给子组件的最外层标签加上当前组件的data属性,则子组件会自动生成一个自己的唯一data值,然后子组件最外层标签在自己的data属性后面添加父组件的data属性。对于组件内写在里的样式,Vue均会自动在每句css选择器的末尾添加一个当前组件的data属性选择器来私有化样式。
基于以上,Vue就实现的scoped的功能。因为,组件scoped里的样式都加了当前组件的唯一标识data属性。也就是说,即使当前组件的class跟其他组件重名,因为每个组件的data属性不一样,当前组件的样式也就不能再其他组件生效了。
对于这一点的证明,很容易。我们知道,一般的,Vue 入口文件App.vue里的样式是默认全局样式的,也就没有添加****。所以,编译出来的结果如下图:

那在****添加scoped属性后呢?


可见App.vue编译后,增加里data属性。由此可知,组件的data属性存在是依据scoped来控制的。
规则二、三结合来证明:
用上面的例子来证,展开App.vue组件得:

App.vue全部HTML的DOM标签都添加的data属性。
仔细看上图,我们发现,
由此可证,子组件设置了****后,编译结果如下:

**
**标签的data属性只剩下App.vue的了。所以可证,子组件没有设置,则只会给子组件的最外层标签加上当前组件的data属性

混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。
将组件的公共逻辑或者配置提取出来,哪个组件需要用到时,直接将提取的这部分混入到组件内部即可。这样既可以减少代码冗余度,也可以让后期维护起来更加容易。
这里需要注意的是:提取的是逻辑或配置,而不是HTML代码和CSS代码。其实大家也可以换一种想法,mixin就是组件中的组件,Vue组件化让我们的代码复用性更高,那么组件与组件之间还有重复部分,我们使用Mixin在抽离一遍。
简单栗子局部混合:
// mixin.js
export const hh1 = {
methods: {
showName() {
alter("zhuba");
}
},
mounted() {
console.log("你好鸭!");
},
}
export const hh2 = {
data() {
return {
x:100, //如果导入组件中也有,以组件中为data
y:200,
}
}
}
// Vue1.vue 和 // Vue2.vue
<script>
import {hh1, hh2} from '../mixin';
mixins:[hh1, hh2];
</script>
局部混入和组件的按需加载有点类似,就是需要用到mixin中的代码时,然后再在组件章引入它。
全局混入的话,则代表在项目的任何组件中都可以使用mixin。
局部mixin是在需要的组件中引入它,也可以在全局先把它注册好,这样就可以在任何组件中直接使用了。
// 局部混入 在相应app中
<script>
import {hh1, hh2} from '../mixin';
mixins:[hh1, hh2];
</script>
// 全局混入 app.js中 修改app(main).js
import Vue from "vue";
import App from "./App.vue";
import { mixins } from "./mixin";
Vue.mixin(mixins);
Vue.config.productionTip = false;
new Vue({
render: (h) => h(App),
}).$mount("#app");