组件定义与使用
vue 文件的组成(3个部分)
- 模板页面
<template>
页面模板
</template>
- JS 模块对象
<script>
export default {
data(){return {};},
methods:{},
computed:{},
components:{}
}
</script>
- 样式
<style>
样式定义
</style>
基本使用
- 引入组件
- 映射成标签
- 使用组件标签
- 参考代码
<template>
<HelloWorld></HelloWorld>
<hello-world></hello-world>
</template>
<script>
import HelloWorldfrom'./components/HelloWorld'
export default {
components:{
HelloWorld
}
}
</script>
关于标签名与标签属性名书写问题
- 写法一:一模一样
- 写法二:大写变小写,并用
-
连接
组件间通信
基本原则
- 不要在子组件中直接修改父组件的状态数据
- 数据在哪,更新数据的行为(函数)就应该定义在哪。
vue 组件间通信方式
- props
- vue的自定义事件
- 消息订阅与发布(如:PubSubJS 库)
- slot
- vuex
组件间通信 props
- 使用组件标签时:
<myComponent :name="'tom" :age="3" :setName="setName" />
- 定义
MyComponent
组件时,在组件内声明所有的 props
- 方式一: 只指定名称
props:['name','age','setName']
- 方式二:指定名称和类型
props:{
name:String,
age:Number,
setName:Function
}
- 方式三:指定名称/类型/必要性/默认值
props:{
name:{type:String,required:true,default:xxx},
}
- 注意:
- 此方法用于父组件向子组件传递数据
- 所有标签属性都会成为组件对象的属性,模板页面可以直接引用。
- 问题:
- 如果需要向非子后代传递数据必须多层逐层传递
- 兄弟组件间也不能直接
props
通信,必须借助父组件才可以。
组件间通信:vue自定义事件
- 在父组件中绑定事件监听:
- 在子组件中触发事件:
this.$emit(eventName,data)
- 注意:
- 此方式只用于子组件向父组件发送数据
- 问题:隔代组件或兄弟组件间通信用此种方式不合适
- 安装:
npm install pubsub-js --save
- 订阅消息
PubSub.subscribe('msg',function(msg,data){} )
- 发布消息
PubSub.publish('msg',data)
- 此方式可实现任意关系组件间通信(数据)
- 事件的两个重要操作
- 绑定事件监听(订阅消息)
- 触发事件(发布消息)
- DOM 事件:用户在浏览器上对应的界面上做对应的操作
- 自定义:编码手动触发。
- 此方式用于父组件向子组件传递’标签数据’
- 子组件:
Child.vue
<template>
<div>
<slot name="xxx">不确定的标签结构 1</slot>
<div>组件确定的标签结构</div>
<slot name="yyy">不确定的标签结构 2</slot>
</div>
</template>
- 父组件
<child>
<template v-slot:xxx>xxx 对应的标签结构</template>
<template v-slot:yyy>yyy 对应的标签结构</template>
</child>