一,什么是组件实现应用中局部功能代和资源的集合(简单来说就是将html,js,css,资源整合起来的一个小盒子)
理解:用来实现局部(特定)功能效果的代码集合
为什么:一个界面的功能很复杂
作用:复用编码,简化项目编码,提高运行效率
组件又分为非单文件组件和单文件组件,一般常用的就是单文件组件。【相关推荐:vuejs视频教程、web前端开发】
二,非单文件组件2.1使用组件的三大步骤
1.创建组件(1)如何定义一个组件?
使用vue.extend(options )创建,其中options和new vue(options)时传 入的那个options儿乎一样。但是也略有不同,组件内不需要写el该属性,因为组件是直接服务于vue实例的,所以并不需要在组件内写,并且组件写完之后不只是服务于一个地方,这里就体现了组件的复用性,所以组件不能写el。
2.注册组件(2)如何注册组件?
1.局部注册:靠new vue的时候传入components选项
2.全局注册:靠vue.component( '组件名,组件)
3.使用组件(3)如何使用组件
编写组件标签(使用组件)
下面是创建非单文件组件的全过程
(4)为什么data必须写成函数?
避免组件被复用时,数据存在引用关系。
注:使用template 可以配置组件结构。
<body> <div id="user"> <!-- 第3步使用组件编写组件标签 --> <school></school> <br> <xuesheng></xuesheng> </div> <div class="user2"> <hello></hello> </div></body><script> // 第一步:创建组件 // 创建school组件 const school = vue.extend({ template: ` <div> <h2>学校名称:{{schoolname}}</h2> <h2>地址:{{address}}</h2> </div> `, // 组件里不用写el也不能写el,而且组件里必须写函数式 data() { return { schoolname: '山鱼屋', address: 'nanbian' } } }) // 创建student组件 const student = vue.extend({ template: ` <div> <h2>学生名称:{{studentname}}</h2> <h2>年龄:{{age}}</h2> <button @click = 'showname'>点我出名</button> </div> `, // 组件里不用写el也不能写el,而且组件里必须写函数式 data() { return { studentname: '山鱼屋', age: 20 } }, methods: { showname() { alert(this.studentname) } }, }) // 创建全局组件 const hello = vue.extend({ template: ` <div> <h2>你好呀!{{name}}</h2> </div> `, data() { return { name: 'shanyu', } } }) // 注册全局的组件 vue.component('hello', hello); // 创建vm new vue({ el: '#user', // 第2步.注册组件 components: { // 键值对形式(若键值对同名可简写) school, xuesheng: student } }) new vue({ el: '.user2', })</script>
4.关于写法的注意点1)关于组件名
一个单词组成: 第一种写法( 首字母小写):+ school,第二种写法(首字母大写) school
多个单词组成: 第一种写法(kebab-case命 名):my-school,第二种写法(came1case命 名): myschool (需要vue脚手架支持)
注:
(1),组件名尽可能回避html中已有的元素名称,例如: h2、 h2都不行。
(2).可以使用name配置项指定组件在开发者工具中呈现的名字。
2)关于组件标签
第1种写法: <school></school>
第2种写法: <school/> 备注:不用使用脚手架时,<schoo1/> 会导致后续组件不能渲染。
3)简写方式
const school = vue.extend(options)可简写为: const school = {options}
2.2组件的嵌套
和俄罗斯套娃差不多,大件套小件(其实vm下面还有一个名为app的组件,他管理着所有的组件)
<body> <div id="user"> </div> <script> // 创建room组件 const room = { template: `<div> <h2> 房间号{{num}} </h2> <h2> puwei:{{pnum}} </h2> </div>`, data() { return { num: '222', pnum: '8' } } } // 创建students组件 const students = { template: `<div> <h2> 姓名:{{name}} </h2> <h2> 学号:{{studentnum}} </h2> <room></room> </div>`, data() { return { name: '山鱼', studentnum: '9657' } }, components: { room } } // 创建school组件 const school = { template: `<div> <h2> 校名:{{sname}} </h2> <h2> 地址:{{address}} </h2> <students></students> </div>`, data() { return { sname: '山鱼学院', address: '华山道9088号' } }, components: { students } } const app = { template: ` <school></school> </div>`, components: { school } } // 创建app组件 new vue({ template:`<app></app>`, el: '#user', components: { app, } }) </script></body>
关于vuecomponentschool组件本质是一个 名为vuecomponent的构造函数,且不是程序员定义的,是vue.extend生成的。
只需要写b8ca3119a7915a4a685cd5b3046ccc27(自闭合标签)或36294b0081e4be8b0f9233f2d04ce30245b904bf2d760e20eca78bbc1279a7b6, vue解析时会帮我们创建school组件的实例对象,也就是vue帮我们执行的: new vuecomponent(options)。
每次调用vue.extend,返回的都是一一个全新的vuecomponent(虽然双胞胎特别像但是无论怎么来说也不是相同的一个人)
this指向
(1).组件配置中data函数、methods中的函数、watch中的函数、computed中的两数它们的this均 是[vuecomponent实例对象]。
(2) new vue(options )配置中data函数、methods中的函数、watch中的函数、computed中 的函数 它们的this均是[vue实例对象]。
(学习视频分享:vuejs入门教程、编程基础视频)
以上就是一文聊聊vue中非单文件组件的使用的详细内容。