Vue组件之全局组件与局部组件的使用详解
组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能。在有些情况下,组件也可以是原生 HTML 元素的形式,以is
特性扩展。个人认为就是一个可以重复利用的结构层代码片段。
全局组件注册方式:Vue.component(组件名,{方法})
eg:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <body> <div id= "app" > <my-component></my-component> </div> <div id= "app1" > <my-component></my-component> </div> <script> Vue.component( "my-component" ,{ template: "<h1>我是全局组件</h1>" }); new Vue({ el: "#app" }); new Vue({ el: "#app1" }) </script> </body> |
渲染结果:
1 2 3 4 5 6 | <div id= "app" > <h1>我是全局组件</h1> </div> <div id= "app1" > <h1>我是全局组件</h1> </div> |
这里需要注意:
1.全局组件必须写在Vue实例创建之前,才在该根元素下面生效;
eg:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <body> <div id= "app" > <my-component></my-component> </div> <div id= "app1" > <my-component></my-component> </div> <script> new Vue({ el: "#app" }); Vue.component( "my-component" , { template: "<h1>我是全局组件</h1>" }); new Vue({ el: "#app1" }) </script> </body> |
这样只会渲染app1根元素下面的,并不会渲染app根元素下面的,并且会报错。
2.模板里面第一级只能有一个标签,不能并行;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <body> <div id= "app" > <my-component></my-component> </div> <script> new Vue({ el: "#app" }); Vue.component( "my-component" , { template: "<h1>我是全局组件</h1>" + "<p>我是全局组件内标签</p>" }); new Vue({ el: "#app1" }) </script> </body> |
这样子会报错,并且只会渲染第一个标签h1;我们应该这样子写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <body> <div id= "app" > <my-component></my-component> </div> <script> new Vue({ el: "#app" }); Vue.component( "my-component" , { template: "<h1>我是全局组件<p>" + "我是全局组件内标签</p></h1>" }); new Vue({ el: "#app1" }) </script> </body> |
局部组件注册方式,直接在Vue实例里面注册
eg:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <body> <div id= "app1" > <child-component></child-component> </div> <script> new Vue({ el: "#app1" , components:{ "child-component" :{ template: "<h1>我是局部组件</h1>" } } }); </script> </body> |
局部组件需要注意:
1.属性名为components,s千万别忘了;
2.套路比较深,所以建议模板定义在一个全局变量里,代码看起来容易一点,如下:(模板标签比较多的时候,这样子写更加简洁规整)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <body> <div id= "app1" > <child-component></child-component> </div> <script> var child={ template: "<h1>我是局部组件</h1>" }; new Vue({ el: "#app1" , components:{ "child-component" :child } }); </script> </body> |
关于组件中的其他属性,可以和实例中的一样,但是data属性必须是一个函数:
eg:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <body> <div id= "app1" > <child-component></child-component> </div> <script> var child={ template: "<button @click='add2'>我是局部组件:{{m2}}</button>" , data: function (){ return {m2:1} }, methods:{ add2: function (){ this .m2++ } } }; new Vue({ el: "#app1" , components:{ "child-component" :child } }) </script> </body> |
显示结果:
全局组件和局部组件一样,data也必须是一个函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <body> <div id= "app1" > <my-component></my-component> </div> <script> Vue.component( "my-component" ,{ template: "<button @click='add1'>全局组件:{{m1}}</button>" , data: function (){ return { m1:10 } }, methods:{ add1: function (){ this .m1++ } } }); new Vue({ el: "#app1" }) </script> </body> |
显示结果:
当使用 DOM 作为模板时 (例如,将el
选项挂载到一个已存在的元素上),你会受到 HTML 的一些限制,因为 Vue 只有在浏览器解析和标准化 HTML 后才能获取模板内容。尤其像这些元素<ul>
,<ol>
,<table>
,<select>
限制了能被它包裹的元素,而一些像<option>
这样的元素只能出现在某些其它元素内部。
自定义组件<my-row>
被认为是无效的内容,因此在渲染的时候会导致错误。变通的方案是使用特殊的is
属性:
eg:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <body> <div id= "app1" > <ul> <li is= "my-component" ></li> </ul> </div> <script> Vue.component( "my-component" ,{ template: "<h1>{{message}}</h1>" , data: function (){ return { message: "hello world" } } }); new Vue({ el: "#app1" }) </script> </body> |
渲染结果为:
对于全局与局部的作用域问题,我们可以这样理解,只要变量是在组件内部用的,这些变量必须是组件内部的,而在外部html结构中引用的变量,都引用的是该挂载下的实例里面的变量
eg:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <body> <div id= "app1" > <my-component></my-component> </div> <script> Vue.component( "my-component" ,{ template: "<button @click='add3'>" + "{{message}}</button>" , data: function (){ return { message: "hello world" } }, methods:{ add3: function (){ alert( "我是局部" ) } } }); new Vue({ el: "#app1" , methods:{ add3: function (){ alert( "我是全局" ) } } }) </script> </body> |
弹出框显示:我是局部
Vue中所谓的全局指的是该挂载下的区域;
下面这种做法是错误的,按我的想法觉得应该会弹出:我是全局,但是却报错,也就是说组件处于全局下不可以添加默认事件,要用全局的事件函数,必须父子通信
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <body> <div id= "app1" > <my-component @click= "add3" ></my-component> </div> <script> Vue.component( "my-component" ,{ template: "<button @click='add3'>" + "{{message}}</button>" , data: function (){ return { message: "hello world" } } }); new Vue({ el: "#app1" , methods:{ add3: function (){ alert( "我是全局" ) } } }) </script> </body> |
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY