Vue.js-资料-组件化思想 —上

1、Vue中的组件编程

 

Vue视图层的灵魂 —  组件化数组

组件(Component)是 Vue.js 最强大的功能之一;浏览器

 

组件能够扩展 HTML 元素,封装可重用的代码;app

 

在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能。在有些状况下,组件也能够是原生 HTML 元素的形式,以 is 特性扩展。函数

 

2、全局组件的建立和注册组件化

 

 

案例代码:spa

 

 

调用Vue.extend()建立的是一个组件构造器,构造器有一个选项对象,选项对象的template属性用于定义组件要渲染的HTML;component

  

调用Vue.component()注册组件时,须要提供2个参数:组件的标签名 和 组件构造器;注册的组件要挂载到某个Vue实例下,不然它不会生效;对象

  

Vue.extend() 和 Vue.component():因为 Vue 自己是一个构造函数,Vue.extend() 是一个类继承方法,它用来建立一个 Vue 的子类并返回其构造函数;继承

  

而Vue.component() 的做用在于:创建指定的构造函数与 ID 字符串间的关系,从而让 Vue.js 能在模板中使用它;直接向 Vue.component() 传递 options 时,它会在内部调用 Vue.extend()。

 

3、局部组件的建立和注册

 

案例代码:

 

 

 

运行结果:

 

 

 

4、另外一种组件建立和注册方式

 

直接经过Vue.component注册或获取全局组件,主要体如今如下几种方式:

 

// 注册组件,传入一个扩展过的构造器

Vue.component('my-component', Vue.extend({ /* ... */ }))

 

// 注册组件,传入一个选项对象(自动调用 Vue.extend)

Vue.component('my-component', { /* ... */ })

 

// 获取注册的组件(始终返回构造器)

var MyComponent = Vue.component('my-component') 

 

4.1  自定义全局组件

 

 

 

4.2  自定义局部组件

 


5、父子组件

 

      组件意味着协同工做,一般父子组件会是这样的关系:组件 A 在它的模版中使用了组件 B 。

 

最简单的父子组件:

 

 

运行结果:

 

 

在父子组件组合使用中要注意如下一些问题:

 

没有实例化的子组件不能拿出来单独使用!

 

<div id="app">

       <parent-component></parent-component>

       <child-component></child-component>

</div>

 

 

在父标签内部嵌套子标签!

 

 

<div id="app">

       <parent-component>

           <child-component></child-component>

       </parent-component>

</div>

 

        由于在父标签一旦生成真实的DOM,其内部的子标签就会被解析成为普通的HTML标签来执行,并且<child-component>不是标准的HTML标签,会被浏览器过滤掉。

 

6、在组件上绑定Class和Style


       数据绑定一个常见需求是操做元素的 class 列表和它的内联样式。由于它们都是属性 ,咱们能够用v-bind 处理它们:只须要计算出表达式最终的字符串。

        并且,把 v-bind 用于 class 和 style 时,表达式的结果类型除了字符串以外,还能够是对象或数组。

 

案例代码:

 

 

7、template和script标签

 

       尽管在上面组件的组件注册的方式已经很简单,可是在template选项中拼接HTML的标签仍是不符合常规的编程习惯,并且HTML元素和js代码混杂在一块儿形成了很大的耦合性。

 

 

       那么,template和script标签能够帮助咱们将定义在JS中的HTML模板分离出来。

 

注意: 两种注册方式效果同样,官方建议用第一种。

 

(1)使用template标签注册组件:

 

 

(2)使用script标签注册组件:

 

 

注意:使用<script>标签时,type指定为text/x-template,意在告诉浏览器这不是一段js脚本,浏览器在解析HTML文档时会忽略<script>标签内定义的内容。

 

 

8、挂载选项data必须是函数

 

        使用组件时,大多数能够传入到 Vue 构造器中的选项能够在 Vue.extend() 或Vue.component()中注册组件时使用,但有一个重要前提: data 必须是函数

 

下面代码会出现的问题:

 

 

代码运行结果: 

 

 

正确的写法:

 

 Vue.component('my-component', {

        template: '#myTemplate',

        data: function () {

            return {

                message: '你好,中国'

            }

        }

    })

 

代码运行结果:

 

 

 注意:若是data选项指向某个对象,这意味着全部的组件实例共用一个data。

咱们应当使用一个函数做为 data 选项,让这个函数返回一个新对象。

 

 

 

运行结果,这三个组件共享了同一个 data , 所以增长一个 counter 会影响全部组件!

 

 

 

解决办法:为每一个组件返回新的 data 对象来解决这个问题!

 

data: function () {

            return {

                counter: 0

            }

        }

 

运行结果: 

 

 

相关文章
相关标签/搜索