组件

所有的vue组件都是以.vue格式结尾的文件。可以说,一个vue文件就是一个类。

我们看到的vue-cli中的App.vue文件就是整个vue的根组件。

 1 <template>
 2   <div id="app">
 3    {{a}}
 4   </div>
 5 </template>
 6 <script>
 7 export default {
 8 }
 9 </script>
10 <style>
11 </style>

在我们之前写data时候是一个对象,但是此时会报错

 1 <template>
 2   <div id="app">
 3    {{a}}
 4   </div>
 5 </template>
 6 <script>
 7 export default {
 8  data:{
 9    a:100
10  }
11 }
12 </script>
13 <style>
14 </style>

组件

 

 

 

此时我们的data需要这样写才不会报错

1 data(){
2    return{
3      a:100
4    }
5  }

注意:是data必须是一个函数,最外层必须有默认暴露

如果在我们组件中data必须是一个函数,是因为防止数据之间冲突

data是一个函数,返回的是一个对象,目的是为了让每个组件数据隔离,这个是JavaScript的原理,并不是vue去设计的

 

为什么vue的data必须是一个函数,我们从JavaScript的面向对象开始

我们看下面的一个案例

 1  <script>
 2         var obj = {
 3             data:{
 4                 name: '小明'
 5             }
 6         }
 7         var People = function(obj) {
 8             this.data = obj.data
 9         }
10     
11         var xiaoming = new People(obj)
12         var xiaohong = new People(obj)
13         xiaohong.data.name = '小红'   
14         console.log(xiaoming.data.name)
15         console.log(xiaohong.data.name)
16     </script>

组件

 

 

 

此时我们看浏览器,当我们修改了其中的一个名字之后,此时浏览器会输出两个小红,这就意味着整个实例的data都被篡改了,也就是说,他改的是整个地址。

我们知道复杂数据类型指的都是同一个地址,所以,当xiaohong.data.name修改的时候,xiaoming.data.name也就随之修改了

解决办法就是obj对象返回一个data函数,这个函数return一个对象

     var obj = {
            data(){
                return {
                    name:"小明"
                }
            }
        }
        var People = function(obj) {
            this.data = obj.data()
        }

此时看浏览器输出结果

组件

 

 

 

此时People的data返回的是一个对象,不是一个地址,每一个实例拿到的都是个独立,个体的对象,互相不会数据冲突,这个就是vue组件data为什么是函数的原因,

 

 

自定义组件

如何使用自定义组件?

第一步创建自己的组件

比如在components文件夹中创建一个study.vue文件

App.vue文件

 1 <template>
 2   <div>
 3     <study></study>
 4   </div>
 5 </template>
 6 
 7 <script>
 8 // 引入组件
 9 import study from './components/study.vue'
10 
11 export default {
12   // 注册组件
13   components:{
14     study
15   },
16   data(){
17    
18   }
19 }
20 </script>

 

使用组件三步走:

1)   创建vue文件

2)   在要渲染的地方引入该组件

3)   注册该组件

 

<study></study>组件内容

 1 <template>
 2   <div id="app">
 3   <h1>{{a}}</h1>
 4   <button @click="add">加一</button>
 5   </div>
 6 </template>
 7 
 8 <script>
 9 export default {
10   data(){
11     return {
12       a:100
13     }
14   },
15   methods:{
16     add(){
17       this.a++
18     }
19   }
20 }
21 </script>
22 <style >
23 </style>

App.vue文件内容

 1 <template>
 2   <div id="app">
 3   <study></study>
 4   </div>
 5 </template>
 6 <script>
 7 import study from "./components/study.vue"
 8 
 9 export default {
10   components:{
11     study
12   },
13  data(){
14    return{
15      a:100
16    }
17  }
18 }
19 </script>
20 <style>
21 </style>

组件

 

 

组件是可以复用的,并且数据是隔离的

在给App.vue多添加几个study.vue文件

1 <template>
2   <div id="app">
3   <study></study>
4   <study></study>
5   <study></study>
6   <study></study>
7   </div>
8 </template>

组件

 

上一篇:如何设计一个短小精悍、可拓展的RPC框架?(含实现代码)


下一篇:懒汉式单例模式的线程安全实现(最新)