如何基于vue进行组件化开发?
最基本的操作就是组件的处理,组件首先要注册(定义),然后才能使用
组件复用
:每个组件是一个独立的实例,他们之间的数据是相互独立的
全局组件注册
vue实例
本身就是一个组件,所有vue模板的内容都要放到el指定的容器中(根容器)
父子组件
:现在注册的是子组件,他要放到最外层容器里,最外层容器也是组件,他们之间就形成了父子关系。
data的值是个函数
:本质上来说,使用函数会形成一个闭包
环境,这样保证每个组件都有一个独立的作用域
全局组件不仅可以用于其他组件还可以用于根组件
局部组件注册
组件名称(推荐用短横线的方式):组件内容
组件内容抽取到一个对象中
vue调试工具
组件最终会被渲染成原生的dom
1.展示组件之间的层次关系
2.调试组件中的数据
组件间数据交互
组件之间的关系
:父子组件、兄弟组件
组件之间的
数据交互
:
1.父组件向子组件传递数据
2.子组件向父组件传递数据
3.兄弟组件之间传递数据
vue实例本身是一个组件,并且是个根组件
,在此基础之上重新定义一个子组件
定义子组件
:
组件名称(短横线),组件内容
组件内容是个对象,里面包括组件的相关属性。
data属性是个函数,返回值是个对象,里面是子组件的数据
template属性是个字符串,把子组件的内容呈现出来
使用子组件
:
在根组件中直接使用组件名称,用标签包起来
1.父组件向子组件传递数据
子组件可以使用父组件传递过来的数据
子组件怎么接收:子组件注册时,组件内容添加一个props
属性,用来接收父组件传递过来的数据。值是个数组
,数组里面可以有多个父组件的属性。
父组件怎么把数据传递过来:以属性的方式传递过来,父组件使用子组件时,给子组件绑定一个属性,属性名要和props中传递过来的属性名一样,属性值可以直接写也可以或者在父组件的data中动态绑定
通过v-bind(即:)绑定就会在子组件中获取到对应类型的数据,否则就是字符串
2.子组件向父组件传递数据
不能通过props直接操作父组件的数据,因为他是单向数据流
情况一:
给子组件添加一个按钮,显式调用一个
特定的方法$emit
,当点击的时候会触发$emit
,方法名固定,这个方法会携带一个参数
,参数名称就是自定义事件,名字是自己定义的,这个事件会传递给父组件。
父组件需要监听这个事件
v-on:事件名(即@事件名)
,事件名要和$emit()括弧里的一样,写在父组件模板区域的都属于父组件
情况二:
需要传值,子组件用
$emit
方法传递,父组件用$event
接收
3.兄弟组件之间传递数据
兄弟组件之间不可以直接交互,必须通过事件中心进行通信
首先定义两个子组件,组件名称,组件内容(包括data,template,methods) 下面要做的就是对事件中心事件的监听和事件的触发
1.定义一个全局的hub,在hub中可以进行事件监听
2.组件内部
何时监听
事件
mounted(){}钩子函数
,一旦被触发,模板template已经就绪了,可以对模板进行相关的操作了,在这里监听事件
起一个事件名称,事件触发之后做什么使用箭头函数,这个函数会接收对方传过来的数据
3.什么时候触发
事件
点击
对应按钮的时候,触发监听的兄弟组件事件,触发的事件名称、传递过来的值
实现每次点击jerry后tom+1
组件插槽
插槽的意思就是在子组件模板中提供一个位置
插槽的内容在当父组件使用子组件时
子组件标签的中间传递,使得子组件模板展示的信息
通过插槽的方式动态改变
插槽:父组件向子组件传递
内容
(修改子组件的模板内容)。<slot></slot>
属于vue的api,名字固定
子组件标签中有内容
,内容会通过插槽
的方式传递给子组件模板区域
,子组件的模板中会预留一个位置
,这个位置就是插槽,子组件标签中的内容会放到插槽中最终呈现出来
如果slot标签中间有内容
,当父组件使用子组件时:
- 子组件标签中间
没有
内容,那slot标签中间的内容会默认显示出来;- 子组件标签中间
有
内容,那slot标签中间的内容会被子组件标签中间的内容覆盖;
具名插槽
有名字的插槽 :在定义子组件时,他的模板中可以有多个插槽
<slot></ slot>
,有的通过name属性,指定插槽的名字,也有一个默认的不带名字的插槽
插槽如何填充
?
根据父组件中插槽的名字匹配到子组件模板中的对应位置,没有名字的匹配到子组件中的匿名插槽处,让子组件把内容渲染出来;想要往插槽中填充多个标签,可以在父组件中使用template标签包裹
作用域插槽
应用场景:父组件可以获取子组件中的数据,并对子组件的数据进行一些
加工处理
的操作
子组件的模板一般写好就不动了,由父组件直接
对子组件进行操作
子组件模板区域:把子组件要展示的内容通过slot包裹起来,给slot绑定一个自定义属性
,属性名自己写,值就是要操作的数据
父组件怎么往子组件模板区域填充
内容?父组件中用template标签,slot-scope
属性能得到绑定的那个属性,属性名自己定义一般叫slotProps点出自己定义的属性名