最新文章
- MySQL中, group by 和 order by 一起使用会有排序问题,group by 和 order by 同时使用时要注意的地方
- Vue学习笔记(10) ——Vue组件中的data和methods
- Vue学习笔记(9) ——Vue组件创建的几种方式
- Vue学习笔记(8) ——Vue实例的生命周期
- Vue学习笔记(7) —— 过滤器 filter的基本使用
- Vue学习笔记(6) ——v-if指令和v-show指令
- Vue学习笔记(5) —— v-for指令和key属性
- Vue学习笔记(5) —— Vue中样式-class样式和style样式
- Vue学习笔记(4) —— v-model指令,双向数据绑定
- Vue学习笔记(3) —— Vue事件修饰符
关注我

在线咨询
x
有什么可以帮到你

点击咨询
Vue学习笔记(9) ——Vue组件创建的几种方式
- 分类:WEB前端
- 时间:2020-10-05
- 共2024人围观
简介什么是组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可;
一、什么是组件
组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可;
二、组件化和模块化的不同
1、模块化: 是从代码逻辑的角度进行划分的;方便代码分层开发,保证每个功能模块的职能单一;
2、组件化: 是从UI界面的角度进行划分的;前端的组件化,方便UI组件的重用;
三、创建全局组件的三种方式
1、使用 Vue.extend 配合 Vue.component 方法
var login = Vue.extend({ template: '<h1>登录</h1>' }); Vue.component('login', login);
示例代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>使用 Vue.extend 配合 Vue.component 方法</title> <script src="https://www.whmblog.cn/static/js/lib/vue-2.4.0.js"></script> </head> <body> <div id="app"> <!-- 如果要使用组件,直接,把组件的名称,以 HTML 标签的形式,引入到页面中,即可 --> <mycom1></mycom1> </div> <script> // 1.1 使用 Vue.extend 来创建全局的Vue组件 // var com1 = Vue.extend({ // template: '<h3>这是使用 Vue.extend 创建的组件</h3>' // 通过 template 属性,指定了组件要展示的HTML结构 // }) // 1.2 使用 Vue.component('组件的名称', 创建出来的组件模板对象) // Vue.component('myCom1', com1) // 如果使用 Vue.component 定义全局组件的时候,组件名称使用了 驼峰命名,则在引用组件的时候,需要把 大写的驼峰改为小写的字母,同时,两个单词之间,使用 - 链接; // 如果不使用驼峰,则直接拿名称来使用即可; // Vue.component('mycom1', com1) // Vue.component 第一个参数:组件的名称,将来在引用组件的时候,就是一个 标签形式 来引入 它的 // 第二个参数: Vue.extend 创建的组件 ,其中 template 就是组件将来要展示的HTML内容 Vue.component('mycom1', Vue.extend({ template: '<h3>这是使用 Vue.extend 创建的组件</h3>' })) // 创建 Vue 实例,得到 ViewModel var vm = new Vue({ el: '#app', data: {}, methods: {} }); </script> </body> </html>
2、直接使用 Vue.component 方法
Vue.component('register', { template: '<h1>注册</h1>' });
示例代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>直接使用 Vue.component 方法</title> <script src="https://www.whmblog.cn/static/js/lib/vue-2.4.0.js"></script> </head> <body> <div id="app"> <!-- 还是使用 标签形式,引入自己的组件 --> <mycom3></mycom3> </div> <script> // 注意:不论是哪种方式创建出来的组件,组件的 template 属性指向的模板内容,必须有且只能有唯一的一个根元素 Vue.component('mycom3', { template: '<div><h3>这是直接使用 Vue.component 创建出来的组件</h3></div>' }) // 创建 Vue 实例,得到 ViewModel var vm = new Vue({ el: '#app', data: {}, methods: {} }); </script> </body> </html>
3、将模板字符串,定义到script标签中
<script id="tmpl" type="x-template"> <div><a href="#">登录</a> | <a href="#">注册</a></div> </script> 同时,需要使用 Vue.component 来定义组件: Vue.component('account', { template: '#tmpl' });
示例代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>将模板字符串,定义到script标签种</title> <script src="https://www.whmblog.cn/static/js/lib/vue-2.4.0.js"></script> </head> <body> <div id="app"> <mycom3></mycom3> <!-- <login></login> --> </div> <div id="app2"> <mycom3></mycom3> <login></login> </div> <!-- 在 被控制的 #app 外面,使用 template 元素,定义组件的HTML模板结构 --> <template id="tmpl"> <div> <h1>这是通过 template 元素,在外部定义的组件结构,这个方式,有代码的只能提示和高亮</h1> <h4>好用,不错!</h4> </div> </template> <template id="tmp2"> <h1>这是私有的 login 组件</h1> </template> <script> Vue.component('mycom3', { template: '#tmpl' }) // 创建 Vue 实例,得到 ViewModel var vm = new Vue({ el: '#app', data: {}, methods: {} }); var vm2 = new Vue({ el: '#app2', data: {}, methods: {}, filters: {}, directives: {}, components: { // 定义实例内部私有组件的 login: { template: '#tmp2' } } }) </script> </body> </html>
三、注意点
1、组件中的DOM结构,有且只能有唯一的根元素(Root Element)来进行包裹!
2、当我们在创建新的子组件的时候,data里面的不能直接是一个{} 对象声明方式,需要通过函数的形式进行声明,这样做的目的就是防止子组件之间数据的冲突
3、Vue中ref引用,如果是在像div这种标签上直接使用ref引用的话,ref指向的就是dom元素本身,如果是子组件上使用ref的话,那ref指向的就是子组件