首页 > 代码库 > 【学习笔记】Vue.js组件
【学习笔记】Vue.js组件
一、组件的注册
组件的注册分为全局注册和局部注册
全局注册
1 Vue.component(‘my-component‘, {
2 // 选项
3 })
局部注册
1 var Child = {
2 template: ‘<div>A custom component!</div>‘
3 }
4 new Vue({
5 // ...
6 components: {
7 // <my-component> 将只在父模板可用
8 ‘my-component‘: Child
9 }
10 })
二、使用Props传递数据
组件实例的作用域是孤立的。这意味着不能并且不应该在子组件的模板内直接引用父组件的数据。可以使用 props 把数据传给子组件。
在组件中需要显式的用props选项来声明:
1 Vue.component(‘child‘, {
2 // 声明 props
3 props: [‘message‘],
4 // 就像 data 一样,prop 可以用在模板内
5 // 同样也可以在 vm 实例中像 “this.message” 这样使用
6 template: ‘<span>{{ message }}</span>‘
7 })
在HTML传入普通字符串中:
1 <child message="hello!"></child>
也可以动态地绑定props,使用 v-bind 动态绑定表单值,HTML如下:
1 <div>
2 <input v-model="parentMsg">
3 <br>
4 <child v-bind:my-message="parentMsg"></child>
5 </div>
三、传递数据
- 使用 $on(eventName) 监听事件
-
使用 $emit(eventName) 触发事件
父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件。
下面是一个例子:
//HTML
<div id="counter-event-example">
<p>{{ total }}</p>
<button-counter v-on:increment="incrementTotal"></button-counter>
<button-counter v-on:increment="incrementTotal"></button-counter>
</div>
//Js
Vue.component(‘button-counter‘, {
template: ‘<button v-on:click="increment">{{ counter }}</button>‘,
data: function () {
return {
counter: 0
}
},
methods: {
increment: function () {
this.counter += 1
this.$emit(‘increment‘)
}
},
})
new Vue({
el: ‘#counter-event-example‘,
data: {
total: 0
},
methods: {
incrementTotal: function () {
this.total += 1
}
}
})
四、使用slot分发内容
除非子组件模板包含至少一个 <slot> 插口,否则父组件的内容将会被丢弃。当子组件模板只有一个没有属性的 slot 时,父组件整个内容片段将插入到 slot 所在的 DOM 位置,并替换掉 slot 标签本身。
最初在 <slot> 标签中的任何内容都被视为备用内容。备用内容在子组件的作用域内编译,并且只有在宿主元素为空,且没有要插入的内容时才显示备用内容。
假定 my-component
组件有下面模板:
<div>
<h2>I‘m the child title</h2>
<slot>
如果没有分发内容则显示我。
</slot>
</div>
父组件模版:
<div>
<h1>I‘m the parent title</h1>
<my-component>
<p>This is some original content</p>
<p>This is some more original content</p>
</my-component>
</div>
渲染结果:
<div>
<h1>I‘m the parent title</h1>
<div>
<h2>I‘m the child title</h2>
<p>This is some original content</p>
<p>This is some more original content</p>
</div>
</div>
五、可复用组件
在编写组件时,记住是否要复用组件有好处。一次性组件跟其它组件紧密耦合没关系,但是可复用组件应当定义一个清晰的公开接口。
Vue 组件的 API 来自三部分 - props, events 和 slots :
-
Props 允许外部环境传递数据给组件
-
Events 允许组件触发外部环境的副作用
-
Slots 允许外部环境将额外的内容组合在组件中。
1 <my-component
2 :foo="baz"
3 :bar="qux"
4 @event-a="doThis"
5 @event-b="doThat"
6 >
7 <img slot="icon" src="...">
8 <p slot="main-text">Hello!</p>
9 </my-component>
六、子组件索引
尽管有 props 和 events ,但是有时仍然需要在 JavaScript 中直接访问子组件。为此可以使用 ref 为子组件指定一个索引 ID 。例如:
1 <div id="parent">
2 <user-profile ref="profile"></user-profile>
3 </div>
1 var parent = new Vue({ el: ‘#parent‘ })
2 // 访问子组件
3 var child = parent.$refs.profile
【学习笔记】Vue.js组件