第七章 深入理解上手Vue的组件化编程
1. 详解Vue组件化编程
简介:详解Vue组件化编程
图解
在使用
js框架之前的代码管理在使用
vue框架之后的代码管理
没使用组件思想构建项目的缺点
代码关系混乱,不好维护
代码复用率不高
模块
- 定义
- 一般指一个
js文件,提取公共或逻辑复杂的js代码
- 一般指一个
- 作用
- 复用
js代码、提高代码的复用率
- 复用
- 定义
模块化
- 当项目中的
js都用模块来编写,那这个项目就是模块化的
- 当项目中的
组件
- 定义
- 实现局部功能、逻辑的代码合集(html、css、js、image、map4)
- 定义
组件化
- 当项目中的功能或者页面都以组件的形式来去编写,那么这个项目就是组件化的
2. 详解组件的全局注册与局部注册
简介:详解组件的全局注册与局部注册
全局注册
Vue.component
Vue.component('button-counter', { data() { // data必须是个函数, 如果是对象,则指向同一个地址 return { count: 0, }; }, template: '<button v-on:click="count++">点击了 {{ count }} 次</button>', });组件名的两中写法
button-counterButtonCounter //此写法直接在DOM引用时,只有button-counter才能生效组件的复用
data必须是个函数, 如果是对象,则指向同一个地址
不写el选项(实现组件可复用,一个项目中所有的组件最终都由一个vm实例管理)
局部注册
Vue.extend
const xd = Vue.extend({ data() { return { count: 0, }; }, template: '<button v-on:click="count++">点击了 {{ count }} 次</button>', });new Vue({ el: '#app', data: { name: '小滴课堂', }, components: { xd, // 全写 xd:xd }, });
组件的嵌套
3. Vue脚手架开发必备的单文件组件
简介:深入理解单文件组件
单文件组件
结构
<template> <div>{{ name }}</div> </template>交互
<script> export default { data() { return { name: '你好,小滴课堂' }; }, }; </script>样式
<style> div { color: red; } </style>
重写案例
// HelloWord.vue
<template>
<div>
<h1 >{{ name }}</h1>
</div>
</template>
<script>
export default {
data() {
return { name: "小滴课堂"};
},
}
</script>
<style>
</style>
APP.vue 组件
// APP.vue
<template>
<HelloWorld/> // 3.插入组件
</template>
<script>
import HelloWorld from "./components/HelloWorld.vue"; // 1. 引入组件
export default {
name: "App",
components: {
HelloWorld, // 2. 注册组件
},
};
</script>
<style>
</style>
引入子组件步骤
- 引入组件
- 注册组件
- 插入组件
4. 深入剖析Vue父子组件的传值上
简介:深入理解父子组件的传值
父向子传值
props只接收 (第一种)
props: ["xd"]限制类型 (第二种)
props: { xd: String }限制类型,限制必要性,限制默认值d (第三种)
props: { xd: { type: String, required: true, // 父组件必须要传值 否则报错 default:'你好', // 默认值 }, },父向子传字符串
- 父向子传 非字符串
- 注意
- props的数据时单向的,只能从父组件传到子组件
- props的数据不可更改,如果要更改需备份到data中做操作
修改内容方法
5. 深入剖析Vue父子组件的传值下
简介:深入理解父子组件的传值
子向父传值
- 父组件通过
props传给子组件事件回调传值【第一种方法】
自定义事件(@绑定)【第二种方法】
// 父组件 <xd-home @myXd="dianji" />// 子组件 dianji_xd() { this.$emit("myXd", this.name); },
自定义事件(ref绑定:灵活,延时效果)【第三种方法】
// 父组件 <xd-home ref="child" /> mounted() { this.$refs.child.$on("myXd", this.dianji); //this.dianji在methods声明或者用箭头函数 },// 子组件 methods: { dianji_xd() { this.$emit("myXd", this.name); }, },自定义事件的解绑 (一般解绑事件放置在
destroyed销毁周期函数中)this.$off()
- 父组件通过
6.【面试】必须掌握的任意组件间通讯(全局事件总线)
简介:详解非父子组件间的通讯
兄弟组件的数据操作
- 将一个子组件的数据放在父组件维护(状态提升)
- 操作声明在父组件,传到另一个子组件就可实现兄弟组件间的数据操作
- 示例: 子组件1删除子组件2中的数据
任意组件的事件
安装全局事件总线
new Vue({ ... beforeCreate(){ Vue.prototype.$bus = this } ... })在需要接收数据的组件绑定自定义事件
methods:{ xd(i){ console.log(i) } } mounted(){ this.$bus.$on('xx',this.xd) }提供数据的组件
this.$bus.$emit('xx',数据)解绑
beforeDestroy() { this.$bus.$off(); },
7. 怎么使用Vue中的插槽?
简介:详解Vue中的插槽
默认插槽
定义
- 父子组件通讯的一种方式,可以在子组件指定的节点插入html内容
写法
父组件
<soltComponent> <span>小滴课堂</span> </soltComponent>子组件
<template> <div> <h1></h1> <p> <slot></slot> </p> </div> </template>
具名插槽
定义
- 有多个html内容需要指定插入到子组件的对应节点
写法
父组件
<soltComponent> <template v-slot:title> // 推荐使用此写法 <span>小滴课堂</span> // vue2 写法 <span slot="title">小滴课堂</span> // vue3 弃用此写法 </template> <template v-slot:website> <span>xdclass.net</span> </template> </soltComponent>子组件
<template> <div> <h1> <slot name="title"></slot> </h1> <p> <slot name="website"></slot> </p> </div> </template>注意
v-slot:title只能写在template标签以及组件上,可以写成
slot='title'但是此用法在vue3被弃用
作用域插槽
定义
- 数据定义在子组件,但是数据需要在父组件的插槽中使用
写法
父组件
<soltComponent> <template v-slot="{ list }"> <li v-for="(i, index) in list" :key="index">{{ i }}</li> </template> </soltComponent>子组件
<template> <div> <slot :list="list"></slot> </div> </template>
8. 实现Vue 组件中的复用功能—混入(mixin)
简介:详解混入实现复用功能
混入
定义
- 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项
写法
局部混入
定义个混入对象
// mixin.js export const myMixin = { // 用export导出对象 data() { return { xd: '小滴课堂', }; }, mounted() { console.log('hello from xdclass.net'); }, };引用使用
// 需要混入的组件 import { myMixin } from "../mixin"; mixins: [myMixin],
全局混入
定义个混入对象
引入使用
// main.js import { myMixin } from "./mixin"; Vue.mixin(myMixin);
注意
- 当组件和混入对象含有同名选项时,这些选项将进行“合并”
- 在选项发生冲突时以组件数据优先
- 请谨慎使用全局混入,因为会使实例以及每个组件受影响

















