标签:eve cas 第一步 lis 第一个 情况 状态 efs 总线
组件组件可以看作是一些可复用的ui模块
小到一个标签 : <div>哈哈</div>
大到一个页面 :<div><div><div><div><div></div></div></div></div></div>
一个组件对应 一个实例
组件 === Vue实例 == new Vue ( options )
先注册, 再使用
全局组件在所有的vue实例中都可以使用
局部组件在所有的当前实例中可以使用
/**
* 第一个参数 : 组件名
* 第二个参数 : 是一个配置对象, 该配置对象与 Vue 实例的配置对象几乎完全相同
* 也就是说: vue实例中用到的配置项,和组件中的配置项几乎相同
*/
Vue.component(‘child‘, {
template: `
<h1 class="red">这是child组件</h1>
`
})
// 演示为什么vue在组件中的数据采用函数,而不是对象
// 原因 : 只想让组件复用,不想让数据复用
var Component = function() {}
// 使用对象
Component.prototype.data = {
demo: 123
}
// 使用函数
Component.prototype.data = function() {
return {
demo: 111
}
}
var component1 = new Component()
var component2 = new Component()
component1.data().demo = ‘8888‘
console.log(component2.data().demo) // 456
- 当标签一样使用 <child></child>
导入 : 演示子组件访问父组件数据,发现报错
组件是一个独立、封闭的个体
也就是说 : 组件中的数据默认情况下, 只能在组件内部使用,无法直接在组件外部使用
组件通讯的三种情况 :
<child :msg="pmsg"></child>
props: [‘msg‘]
// 以后使用
- 组件内 : msg
- 事件中 : this.msg
pfn(arg) {
console.log(‘父组件中接受到子组件传递过来的数据:‘, arg)
}
// 自定义事件 <child @fn="pfn"></child>
// 在钩子函数里演示也可以,自己调用
created() {
// 调用父组件中的方法 pfn
// 注意:通过 $emit 方法来触发事件 fn
// 第一个参数:表示要触发的自定义事件名称,也就是 @fn
// 第二个参数:表示要传递给父组件的数据
this.$emit(‘fn‘, ‘child msg‘)
}
所有的 prop 都使得其父子 prop 之间形成了一个
单向下行绑定
:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。
obj={}
立马报错父组件传给子组件的
数据思路 : 把接收过来的数据,保存到 data 中一个临时值 (适用在该组件接收数据只会在当前组件内使用)
Vue.component(‘child‘, {
template: `
<div>子组件 {{ cmsg }} </div>
`,
data() {
return {
cmsg: this.msg
}
},
props: [‘msg‘],
created() {
this.cmsg = 666
}
})
<H1 TITLE="哈哈">我是h1</H1>
<child :cMsg="pmsg"></child>
会报警告,父传子也接收不到了You should probably use "c-msg" instead of "cMsg".
方式 1 : 全用小写,不要使用驼峰命名
cmsg
cmsg
方式 2 官 : 需要使用其等价的 kebab-case (短横线分隔命名) 命名: (推荐)
:c-msg=‘pmsg‘
cMsg / this.cMsg
大小写在 父传子和 子传父中的应用 (都是要 带 - 的)
:c-msg ==> cMsg
改驼峰 - 因为props子传父 : @todo-head = ‘pAddTodo‘ ==> this.$emit(‘todo-head‘)
不改驼峰
需求 : 组件 jack ===> 恁弄啥哩 ===> 组件 rose
事件总线 (event bus 公交车) 的机制
来实现的空Vue实例
// 第一步 : 事件总线
var bus = new Vue()
// 第二步 : 发送数据 可在点击事件里 触发事件
// 参数1 : 唯一标识 参数2:参数
bus.$emit(‘todo‘, ‘恁弄啥哩?‘)
// 第三步 : 接收数据 可在 created 里 注册事件
bus.$on(‘todo‘, arg => {
console.log(‘接收过来的‘, arg)
})
// 注册局部组件:
components: {
// child表示组件名称
// 值为配置对象,与 Vue.component 中的第二个参数相同
// 注意:子组件child属于 Vue实例,因此,只能在 Vue实例的模板中使用
child: {
template: `
<div>这是局部组件 child</div>
`
}
}
说明 : vm.$refs
一个对象, 持有已注册过 ref 的所有子组件 ( HTML 元素)
使用 :
// $refs = { div : div元素, child:child组件 }
// 标签
<div ref="div">哈哈</div>
// 组件
<child ref="child"></child>
// mounted 操作DOM
* this.$refs.div
* this.$refs.child
注意点 : 如果获取的是一个子组件,那么通过 ref 就能获取到子组件中的 data
和 methods
this.$refs.child.num
this.$refs.child.fn
场景 : 一般在第三方的组件中, 可能会用到这个功能
// 组件
<div ref="div">哈哈</div>
<child ref="child"></child>
// js
mounted() {
console.log(this.$refs.div)
console.log(this.$refs.child.fn)
}
标签:eve cas 第一步 lis 第一个 情况 状态 efs 总线
原文地址:https://blog.51cto.com/13132323/2506299