美文网首页
Vue.js的组件化思想 —上

Vue.js的组件化思想 —上

作者: 雪妮爸爸 | 来源:发表于2019-01-15 21:58 被阅读0次

一、Vue中的组件

Vue视图层的灵魂 — 组件化

image

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

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

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

二、全局组件的创建和注册

image

案例代码:

image

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

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

Vue.extend() 和 Vue.component():由于 Vue 本身是一个构造函数,Vue.extend() 是一个类继承方法,它用来创建一个 Vue 的子类并返回其构造函数;

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

三、局部组件的创建和注册

案例代码:

image

运行结果:

image

四、另一种组件创建和注册方式

直接通过Vue.component注册或获取全局组件,主要体现在以下几种方式:

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

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

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

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

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

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

4.1 自定义全局组件

image

4.2 自定义局部组件

image

五、父子组件

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

最简单的父子组件:

image

运行结果:

image

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

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

<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标签,会被浏览器过滤掉。

六、在组件上绑定Class和Style

数据绑定一个常见需求是操作元素的 class 列表和它的内联样式。因为它们都是属性 ,我们可以用v-bind 处理它们:只需要计算出表达式最终的字符串。
而且,把 v-bind 用于 class 和 style 时,表达式的结果类型除了字符串之外,还可以是对象或数组。

案例代码:

image

七、template和script标签

尽管在上面组件的组件注册的方式已经很简单,但是在template选项中拼接HTML的标签还是不符合常规的编程习惯,而且HTML元素和js代码混杂在一起造成了很大的耦合性。
那么,template和script标签可以帮助我们将定义在JS中的HTML模板分离出来。

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

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

image

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

image

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

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

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

  • 下面代码会出现的问题:
image

代码运行结果:

image

正确的写法:

Vue.component('my-component', {

    template: '#myTemplate',

    data: function () {

        return {

            message: '你好,中国'

        }

    }

})

代码运行结果:

image

注意:如果data选项指向某个对象,这意味着所有的组件实例共用一个data。

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

image

运行结果,这三个组件共享了同一个 data , 因此增加一个 counter 会影响所有组件!

image

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

data: function () {

        return {

            counter: 0

        }

    }

运行结果:

image

相关文章

  • 组件化之创建组件Vnode

    Vue.js 另一个核心思想是组件化。所谓组件化,就是把页面拆分成多个组件 (component),每个组件依赖的...

  • Vue(2.6.11)源码阅读——组件化

    Vue.js 另一个核心思想是组件化。所谓组件化,就是把页面拆分成多个组件 (component),每个组件依赖的...

  • Vue.js的组件化思想 —上

    一、Vue中的组件 Vue视图层的灵魂 — 组件化 组件(Component)是 Vue.js 最强大的功能之一...

  • Vue源码分析—组件化(一)

    Vue.js另一个核心思想是组件化。所谓组件化,就是把页面拆分成多个组件,每个组件依赖的CSS、JavaScrip...

  • vue学习笔记

    一、思想介绍 设计思想MVVM,数据绑定原理:Vue.js:轻量高效的前端组件化方案-CSDN.NET 入门介绍文...

  • vue修改对象属性,视图不更新this.$set和Vue.nex

    vue.js是以数据驱动和组件化的思想构建的,相比于其他库,Vue.js提供了更加简洁、更易于理解的API,使得我...

  • Vuejs之开发环境搭建

    Vue.js Vue.js是目前很火的一个前端框架,采用MVVM模式设计,它是以数据驱动和组件化的思想构建的。相比...

  • iOS组件化-私有podSpecs

    最近在学习vue.js的时候发现,vue的组件化的思想对于编写代码是一个非常有用的事情。 首先为什么需要组件化? ...

  • iOS组件化实践

    最近在学习vue.js的时候发现,vue的组件化的思想对于编写代码是一个非常有用的事情。 首先为什么需要组件化? ...

  • 基础知识-第三节:从组件到页面

    在vue.js中核心的一点就是组件化的思想,也就说说页面上的所有东西都可以看作是一个组件.组件也可以嵌套组件.由众...

网友评论

      本文标题:Vue.js的组件化思想 —上

      本文链接:https://www.haomeiwen.com/subject/gppudqtx.html