非单文件组件
组件分为:非单文件组件和单文件组件
非单文件组件:一个文件中包含有n个组件,通过html文件管理
单文件组件:一个文件中只包含有1个组件,如.vue文件
1.基本使用组件
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 30
|
const simple = Vue.extend({ template:`<div>{{name}}</div>` data(){ return { name: 'simplelife'} }, methods:{} })
const vm = new Vue({ el:'#demo', data:{}, components:{ simple(组件名):simple(创建名) } })
<div id="demo"> <simple></simple> </div>
|
2.Vue.extend({})
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
const simple = { template:``, data(){} }
const simple = { name: 'SimpleLife' template:``, data(){} }
|
3.全局组件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
const cpnConstruct = Vue.extend({ template:` <div> <h2>标题</h2> <p>内容</p> </div> ` })
Vue.component('my-cpn',cpnConstruct);
<div id="app"> <my-cpn></my-cpn> <my-cpn></my-cpn> </div>
|
4.注意事项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
|
5.组件嵌套使用(父子组件)
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
const student = Vue.extend({ name:'student', template:` <div> <h2>学生姓名:{{name}}</h2> <h2>学生年龄:{{age}}</h2> </div> `, data(){ return { name:'simplelife', age:18 } } })
const school = Vue.extend({ name:'school', template:` <div> <h2>学校名称:{{name}}</h2> <h2>学校地址:{{address}}</h2> <student></student> </div> `, data(){ return { name:'simplelife', address:'江西' } }, components:{ student } })
const app = Vue.extend({ template:` <div> <hello></hello> <school></school> </div> `, components:{ school, } })
new Vue({ template:'<app></app>', el:'#root', components:{app} })
|
VueComponent
1 2 3 4 5 6 7 8
| const school = Vue.extend({ name:'school', template:`` })
|
1.关于this指向
组件配置中:
data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【VueComponent实例对象】。
new Vue(options)配置中:
data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【Vue实例对象】。
2.重要的内置关系
VueComponent.prototype.__proto__ === Vue.prototype
为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。
单文件组件
单文件组件由Vue创建的.vue文件,里面有三种标签<template>
、<script>
、<style>
1.组件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 25 26 27 28 29 30
| <template> <div id=""> </div> </template>
<script> export const simple = Vue.extend({}) export { simple } export default simple export default { name:'Simple', data(){ return {} } } </script>
<style> </style>
|
2.App文件管理组件
1 2 3 4 5 6 7 8 9 10 11 12
|
<script> import Simple form './Simple.vue'; export default { name:'Simple', data(){ return {} } } </script>
|
3.创建Vue实例 main.js
1 2 3 4 5 6 7 8
|
import App form './App.vue';
new Vue({ el:'#root', components:{App} })
|
4.index.html使用组件
1 2 3 4 5
| <div id="root"> <App></App> </div>
|
PS:目前一切就绪,但是浏览器无法识别ES6语法,更无法加载.vue
文件,因此需要打包工具 webpack
初期组件模板分离
抽离组件模板,将模板放置在其它地方,我们将使用两种方法,来抽离。
<script>
标签
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <div id="root"> <demo></demo> </div>
<script type="text/x-template" id="demo"> <div> <h2>{{message}}</h2> </div> </script>
<script> Vue.component('demo',{ template:'#demo', data(){ return {message:'simplelife'}} }) </script>
|
<template>
标签
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <div id="root"> <demo></demo> </div>
<template id="demo"> <div> <h2>{{message}}</h2> </div> </template>
<script> Vue.component('demo',{ template:'#demo', data(){ return {message:'simplelife'}} }) </script>
|
PS:通过脚手架帮我们构建项目,会非常便捷,且易维护。这种早期非单文件分离模板的做法,显然已不再使用
Vue组件数据 data
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
var obj = { name: 'simplelife', age: 18 }
var obj1 = obj var obj2 = obj
obj1.name = 'life' obj1.age = 20
console.log(obj1) console.log(obj2)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| function getName(){ return { name: 'simplelife', age: 18 } }
var test1 = getName() var test2 = getName()
test1.name = 'life' test1.age = 20
console.log(obj1) console.log(obj2)
|