Vue学习笔记
Vue组件化,组件数据存放,父子组件通信…
Vue组件化
组件化思想
组件化是Vue.js中的重要思想,它提供了一种抽象,让我们可以开发出一个个独立可复用的小组件来构造我们的应用,任何的应用都会被抽象成一颗组件树。

注册组件
组件的使用分成三个步骤:
创建组件构造器 -> 注册组件 -> 使用组件
1 | <div id="app"> |
注册组件步骤解析
1、Vue.extend():
- 调用Vue.extend()创建的是一个组件构造器。
- 通常在创建组件构造器时,传入template代表我们自定义组件的模板。
- 该模板就是在使用到组件的地方,要显示的HTML代码。
2、Vue.component():
调用Vue.component()是将刚才的组件构造器注册为一个组件,并且给它起一个组件的标签名称。
所以需要传递两个参数:1、注册组件的标签名 2、组件构造器
3、组件必须挂载在某个Vue实例下,否则它不会生效。
全局组件和局部组件
调用Vue.component()注册组件时,组件的注册是全局的,这意味着该组件可以在任意Vue示例下使用。
如果我们注册的组件是挂载在某个实例中, 那么就是一个局部组件。
1 | <div id="app"> |
父组件和子组件
组件和组件之间存在层级关系。
1 | <div id="app"> |
注册组件的简便写法
我们可以省去了调用Vue.extend()的步骤,直接使用一个对象来代替。
1 | <div id="app"> |
模板分离
我们可以将其中的HTML分离出来写,然后挂载到对应的组件上,必然结构会变得非常清晰。
Vue提供了两种n定义HTML模块内容的方法:
使用<script>标签;
使用<template>标签;
1 | <div id="app"> |
组件数据存放
存放数据
组件对象也有一个data属性,只是这个data属性必须是一个函数,而且这个函数返回一个对象,对象内部保存着数据。
1 | <!--组件实例对象--> |
组件可以访问Vue实例数据吗
不能访问,而且即使可以访问,如果将所有的数据都放在Vue实例中,Vue实例就会变的非常臃肿。
结论:Vue组件应该有自己保存数据的地方。
data在组件中为什么必须是函数
原因是在于Vue让每个组件对象都返回一个新的对象,因为如果是同一个对象的,组件在多次使用后会相互影响。
父子组件通信

父级向子级传递
nprops的值有两种方式:
方式一:字符串数组,数组中的字符串就是传递时的名称。
方式二:对象,对象可以设置传递时的类型,也可以设置默认值等。
1 | <div id="app"> |
当需要对props进行等验证时,支持的类型:
String,Number,Boolean,Array,Object,Date,Function,Symbol

使用驼峰命名
使用驼峰的话在动态绑定(v-bind)时需要把大写变为小写,并在前面加-符号;
1 | <div id="app"> |
子级向父级传递
子组件需要向父组件传递数据时,就要用到自定义事件了;v-on不仅仅可以用于监听DOM事件,也可以用于组件间的自定义事件;
自定义事件的流程:
在子组件中,通过$emit()来触发事件。
在父组件中,通过v-on来监听子组件事件。
1 | <!-- 父组件模板 --> |
父子组件的访问方式
1 | <div id="app"> |
父组件访问子组件
使用$children或$refs reference(引用);
通过$children访问子组件时,是一个数组类型,访问其中的子组件必须通过索引值。(不常用,需要获取全部组件时使用);$refs和ref指令通常是一起使用的;
1 | <div id="app"> |
子组件访问父组件
子组件访问父组件:使用$parent;
子组件应该尽量避免直接访问父组件的数据,因为这样耦合度太高了;
如果我们将子组件放在另外一个组件之内,很可能该父组件没有对应的属性,往往会引起问题;
1 | <div id="app"> |
slot-插槽
组件的插槽是为了让我们封装的组件更加具有扩展性;
如何封装这类组件呢?
抽取共性,保留不同;最好的封装方式就是将共性抽取到组件中,将不同暴露为插槽。
slot基本使用
<slot>中的内容表示,如果没有在该组件中插入任何其他内容,就默认显示该内容。

具名插槽
当子组件的功能复杂时,子组件的插槽可能并非是一个,我们就需要给插槽起一个名字;
1 | <div id="app"> |
作用域插槽
作用域:
父组件模板的所有东西都会在父级作用域内编译;子组件模板的所有东西都会在子级作用域内编译。
父组件替换插槽的标签,但是内容由子组件来提供;
1 | <div id="app"> |
- 本文作者:
腾飞
- 本文链接:
https://www.tengfei.eu.org/article/8da3525b.html
- 版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!