@作者 陶务华
一、组件作用
组件(Component)是 Vue.js 最强大的功能之一。<br /> 组件可以扩展 HTML 元素,封装可重用的代码。<br /> 组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个 组件树:<br /><br /> 上图由页头、侧边栏组成,我们可以把他们理解为组件,每个组件又包含了其它的像导航链接、博文之类的 组件,这样做的好处是灵活方面,真正做到了面向对象的闭合原则
二、注册组件
2.1 全局注册(所有示例都能使用全局组件)
2.1.1 语法格式
全局注册这种方式通过Vue.commponent(tagName, options)创建了一个名为tagName的Vue组件,options 是一个对象,表明组件里面的数据、方法、html结构(注意:一个组件的 data 选项必须是函数,通过闭包的方式防止数据污染)。
2.1.2 调用组件:
<tagName></tagName> (注组件名尽量用小写)
2.1.3 实例代码:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script></head><body><div id="app"><!-- 调用 --><button-counter></button-counter></div><script>//全局注册组件(注意先全局注册组件然后再挂载到vue实例上面)Vue.component("button-counter", {data: function() {return {name: "陶务华"};},template: "<p> {{name}}在前端小课体验局部注册组件</p>"});var obj = {el: "#app"};new Vue(obj);</script></body></html>
2.2 局部注册(实例选项中注册局部组件,这样组件只能在这个实例中使用)
2.2.1调用组件:
2.2.2 实例代码:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script></head><body><div id="app"><register ></register></div><script>const vm = new Vue({el:'#app',data:function(){return{}},components:{register:{template:'<h1> 我在前端小课学习局部注册组件</h1>'}},methods: {},});</script></body></html>
三、通过 Prop 向子组件传递数据
3.1 为什么使用props 传值
子组件无法访问父组件的数据和方法,所以延伸出props
3.2 如何使用
3.2.1 父组件引用子组件并通过自定义属性的方式传递数据(注意:自定义属性的命名需要分割式,不建议 驼峰式。详情查看vue官方 https://cn.vuejs.org/v2/guide/components-props.html)
3.2.2 注册父组件传递子组件的自定义属性
3.2.3 子组件就可以调用了
3.3 代码示例
3.3.1 局部组件的传值
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script></head><body><div id="app"><!-- 第一步、父组件可以在引用子组件的时候通过属性绑定的形式(v-bind:自定义属性)把需要传递给子组件的数据传过去 --><con1 v-bind:parentmsg="msg"></con1></div><script>const obj = {el: '#app',data: function () {return {msg: 'taowuhua'}},components: {con1: {// 第二步、 把父组件传递的自定义属性定义下,然后子组件就可以用了props: ['parentmsg'],// 第三步、 子组件无法访问父组件间的数据和methods中的方法// 组件挂载在vm上,和子组件相关template: '<p> {{parentmsg}}正在前端小课学习vue </p>'}}}// 创建vue实例const vm = new Vue(obj)</script></body></html>
3.3.2 全局组件的传值
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script></head><body><div id="app"><register v-bind:name ='msg'></register></div><script>Vue.component("register", {data: function() {return {};},props:['name'],template: '<p >{{name}}正在前端小课学习全局注册组件</p>'});new Vue({el: "#app",data:function(){return{msg:'陶务华'}}});</script></body></html>
四、通过 $emit 向子组件传递数据
4.1 如何使用
4.1.1 父类中注册自定义click事件
4.1.2 子类模板触发的事件就是父类自定义click事件的表达式
4.1.3 在子类事件通过this.$emit(‘自定义click事件名’,数据)将数据回调给父类
4.1.4 父类通过回调方法收到需要的数据
4.2 代码示例
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script></head><body><div id="app"><register @sendparentdata='getChildData'></register></div><script>new Vue({el:'#app',data:function(){return{}},methods:{getChildData:function(e){console.log("getChildData===="+e)}},components:{register:{data:function(){return{msg:'taowuhua'}},methods: {getChildData:function(){console.log(this.msg)this.$emit('sendparentdata',this.msg)}},props:[],template:'<h1 @click="getChildData">这个方式不友好</h1>'}}})</script></body></html>
