组件注册
全局注册
Vue.component('HelloWorld', { template: '<h3>hello world,你好,世界</h3>'})
之后就可以在任何地方使用HelloWorld
组件了。
单文件组件注册
// HelloWorld.vue文件<template> <h3>hello world,你好,世界</h3></template><script>export default { name: 'HelloWorld'}</script>// app.vue 需要使用哪个组件,就把哪个组件引进来<template> <div class="app"> <HelloWorld></HelloWorld> </div></template><script>import HelloWorld from './HelloWorld.vue'export default { name: 'app', components: { HelloWorld } }</script>
slot分发
我们可以发现原生的标签是可以插入内容的,例如<h1>hello</h1>
,要想我们写的自定义组件也可以这样<HelloWorld>hello</HelloWorld>
,就要用到slot。最终会用<HelloWorld></HelloWorld>
之间的内容替换掉slot
。除此之外,还可以为插槽设置默认值,定义具名插槽等。
// HelloWorld.vue文件<template> <h3>hello world</h3> <slot></slot> //<slot>我爱世界</slot> 我爱世界便为插槽默认值</template><script>export default { name: 'HelloWorld'}</script>// app.vue 需要使用哪个组件,就把哪个组件引进来<template> <div class="app"> <HelloWorld>您好世界</HelloWorld> </div></template><script>import HelloWorld from './HelloWorld.vue'export default { name: 'app', components: { HelloWorld } }</script>
注意事项
组件名称可以使用大驼峰命名方式,也可使用连字符命名方式,看个人习惯,保持统一即可。
组件是可复用的 Vue 实例,可以进行任意次数的复用。
一个组件的 data 选项必须是一个函数。
组件通信
父子组件的通信
父组件通过属性prop与子组件进行通信,子组件通过事件与父组件进行通信。例子说明
用一个非常简单的例子说明父子组件是如何通信的。
假设有一个HelloWorld
子组件,接受一个msg
属性,用来初始化输入框的值。为输入框绑定change
事件,事件方法为changeMsg
,在该方法中,手动触发自定义事件changeParentMsg
,并将输入框的值作为参数传递出去。
// HelloWorld.vue文件<template> <input type="text" v-model="customMsg" v-on:change="changeMsg($event)"></template><script>export default { name: 'HelloWorld', props:{ msg: String }, data: function() { return { customMsg: this.msg } }, methods: { changeMsg($event) { this.$emit('changeParentMsg',$event.target.value) } } }</script>
有一个app.vue组件,该组件将message
通过msg
属性传递给HelloWorld
组件,完成父与子的通信过程。该组件绑定HelloWorld
组件的自定义事件changeParentMsg
,当该事件被触发后,调用changeMsg
方法,改变message
的值,完成子与父的通信。
// app.vue<template> <div class="app"> <p>{{message}}</p> <HelloWorld v-bind:msg="message" v-on:changeParentMsg="changeMsg($event)"/> </div></template><script>import HelloWorld from './components/HelloWorld.vue'export default { name: 'app', components: { HelloWorld }, data: function() { return { message:'hello' } }, methods: { changeMsg(value) { this.message = value } } }</script>
注意事项
props是只读的,子组件不能直接修改属性。子组件可以将用属性初始化自己的本地数据(就是data函数返回的对象),然后修改自己本地的数据。
可以进行自定义props验证。
作者:tiancai啊呆
链接:https://www.jianshu.com/p/8afaa84cadaf