Vue2.0笔记——组件

组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。
组件是自定义元素,Vue.js 的编译器为它添加特殊功能。

使用组件


组件的注册与使用

全局注册

我们需要通过一个全局的API来构造。
Vue.extend(options)
用法:使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象。
同时还需要一个API通过这个构造器来注册组件,之后才能使用。
Vue.component(id, [definition])
用法:注册或获取全局组件。注册还会自动使用给定的id设置组件的名称。注意:他仅仅是个构造器而已。
示例:

<div id="app">
    <my-global></my-global>
</div>

var myComponent = Vue.extend({
    template:‘<div><h2>This is the use of a global component</h2></div>‘
});
Vue.component(‘my-global‘,myComponent);

通过测试后,我们发现<my-global></myglobal>最终被渲染为:

<div>
    <h2>This is the use of a global component</h2>
</div>

<my-global></my-global>就可以使用组件。
template属性就是模板,该组件将被渲染后代替。
你可以写两个标签

<my-global></my-global>
<my-global></my-global>

但是注意:这两个组件是相互独立的,虽然是通过各构造器注册的,但各自独立,局部的注册也是一样的。
这样写,又定义构造器,又注册,再使用,未免有些麻烦,也不常用。可以简短点写。

//我们是直接可以这样写的,也是全局注册最常用的方式
Vue.component(‘my-global‘,{
    template:‘<div><h2>This is the use of a global component</h2></div>‘
});

局部注册

即在某个Vue实例中通过components选项中注册。
示例:

data:{
    msg:‘Hello Vue2.0‘
},
components:{
    ‘my-local‘:{
        data:function(){
            return {
                msg:‘Hello Vue2.0---Local‘
            }
        },
        template:‘<div><h2>{{msg}}</h2></div>‘
    }
}

好了,这就是局部的注册,我们这里在template属性里使用了模板语法{{}},而不过要在子组件中使用模板的到属性值得话,就必须使用子组件自己的data,虽然是子组件,但也不能直接使用父组件的data。需要定义data,注意,组件的data必须是一个函数,属性由函数返回,多个属性使用对象{}的方式。

官方原话:构造 Vue 实例时传入的各种选项大多数都可以在组件里使用。只有一个例外:data 必须是函数
如果这么做,那么 Vue 会停止运行,并在控制台发出警告,告诉你在组件实例中 data 必须是一个函数

所以此时,打印的语句为Hello Vue2.0---Local。
如果有Vue的开发工具插件vue-devtools,我们就可以看到。

应官方的要求,这个id,即组件定义的这个标签名不强制遵循 W3C 规则 (小写,并且包含一个短杠)。但是在vue-devtool中就被改成这种名字了,驼峰命名法吧。当然我们可以定义name属性,它是通过name属性来显示的,默认的值就是id变成驼峰,我们可以自己写name。依然是没问题的。

引用模板

如果我们的template属性中的内容太多,未免会造成麻烦,不仅影响美感,还容易出错,所以我们通过template标签定义引用。

//挂载元素div外定义的模板
<template id="templ">
    <ul>
        <li v-for="(val,key) in arr">{{val}}</li>
    </ul>
</template>
components:{
    ‘my-local‘:{
        name:‘MyLocal2‘,
        data:function(){
            return {
                msg:‘Hello Vue2.0---Local‘,
                arr:[‘what‘,‘are‘,‘you‘,‘doing‘]
            }
        },
        template:‘#templ‘
    }
}

我们在挂载元素div外定义模板元素template,然后添加一个id元素,在子组件template属性中,通过‘#templ‘对其引用。
然而有一中易错误现象,当在template元素中使用两个独立的标签时会出错。

<template id="templ">
    <ul>
        <li v-for="(val,key) in arr">{{val}}</li>
    </ul>
    <p>你好,你是谁</p><!-- 或是{{msg}} -->
</template>

此时它会给你一个错误,这个错误主要说的就是,“模板中有且仅有一个根元素”,就是说要么你template标签中有一个ul,要么有一个p,你只能在template中有一个根元素,所以你需要做的是添加一个div标签在所有标签的最外层作为根元素

DOM 模板解析注意事项

这篇就不写了,看官网的DOM 模板解析注意事项来详细看,最后的要求就是说尽可能使用字符串模板。

动态组件的渲染

有时候你可能由于一个if判断,根据数据该选择到底显示渲染哪个组件。此时就需要动态渲染。
动态渲染需要使用到内置的组件component,如果可能的话还有keep-alive
component的作用就是渲染一个“元组件”为动态组件。依 is 的值,来决定哪个组件被渲染。
我们需要做的就是设置这个is的值,值得内容是什么,就显示名字叫什么组件。

component

示例:

//我们再定义一个子组件
‘my-chen‘:{
    data:function(){
        return {
            msg:‘My name is Xiaoxiaochen Xiansen‘
        }
    },
    template:‘<p>{{msg}}</p>‘
}
//同时,为Vue实例添加一个currentView属性
data:{
    currentView:‘my-local‘
}
//Vue实例挂载处。:is就是v-bind:is的简写
<div id="app">
    <component :is="currentView"></component>
</div>

然后测试,默认显示的就是my-local组件的模板内容,通过按钮点击的方式改变currentView的值就可以动态的改变组件了。

keep-alive

如果你想把切换出去的组件保留在内存中,可以保留它的状态或避免重新渲染,那么你就可以使用keep-alive内置组件了。
<keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。
只需要把这个标签套在component标签的外边就好了。

<keep-alive>
    <component :is="currentView">
        <!-- 非活动组件将被缓存! -->
    </component>
</keep-alive>

2.它有两个属性可以设置“include”和“exclude”,值为字符串或正则表达式,只有匹配的组件才会被缓存或不缓存。
示例:

<!-- 逗号分隔字符串 -->
<keep-alive include="a,b">
  <component :is="view"></component>
</keep-alive>

<!-- 正则表达式 (使用 `v-bind`) -->
<keep-alive :include="/a|b/">
  <component :is="view"></component>
</keep-alive>

<!-- 数组 (使用 `v-bind`) -->
<keep-alive :include="[‘a‘, ‘b‘]">
  <component :is="view"></component>
</keep-alive>

匹配首先检查组件自身的 name 选项,如果 name 选项不可用,则匹配它的局部注册名称 (父组件 components 选项的键值)。匿名组件不能被匹配。

<keep-alive> 不会在函数式组件中正常工作,因为它们没有缓存实例。

原文地址:http://blog.51cto.com/zouzhelu/2106177

时间: 2024-10-03 07:45:25

Vue2.0笔记——组件的相关文章

Vue2.0笔记——组件2

组件组合 父子组件的通信 组件 A 在它的模板中使用了组件 B.它们之间必然需要相互通信:父组件可能要给子组件下发数据,子组件则可能要将它内部发生的事情告知父组件. 首先,需要在Vue实例里定义一个组件,设置data,然后在这个组件里再添加一个conponents选项,注意不要添错位置.示例: <div id="app"> <my-father></my-father> </div> //父组件的模板 <template id=&q

Vue2.0笔记——Vue实例

Vue实例 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的: var vm = new Vue({ // 选项 }) 当创建一个 Vue 实例时,你可以传入一个选项对象,就如前面所提到的如:data,methods,computed,watch等等.一个 Vue 应用由一个通过 new Vue 创建的根 Vue 实例,以及可选的嵌套的.可复用的组件树组成.举个例子,一个 todo 应用的组件树可以是这样的: 根实例Root └─ TodoList ├─ TodoIte

vue2.0 父子组件通信 兄弟组件通信

父组件是通过props属性给子组件通信的来看下代码: 父组件: <parent> <child :child-com="content"></child> //注意这里用驼峰写法哦 </parent> data(){ return { content:'sichaoyun' }; } 子组件通过props来接受数据 第一种方法 props: ['childCom'] 第二种方法 props: { childCom: String //这里

vue2.0父子组件通信的方法

vue2.0组件通信方法:props传值和emit监听.(.sync方法已经移除.详情请点击)(dispatch-和-broadcast方法也已经废弃) props方法传值:Props 现在只能单项传递.为了对父组件产生反向影响,子组件需要显式地传递一个事件而不是依赖于隐式地双向绑定.props方法传值比较简单,缺点是属性会比较多. (1)父传子 [ props传值 ] <template>  <div> <input type="text" v-mode

vue2.0子组件修改父组件props数据的值

从vue1.0升级至2.0之后 prop的.sync被去除 因此直接在子组件修改父组件的值是会报错的如下: 目的是为了阻止子组件影响父组件的数据那么在vue2.0之后 如何在子组件修改父组件props传过来的值呢?思路是通过子组件$emit发射一个方法  如下: this.$emit('imgDataCallback', callbackUrl); 在父组件使用子组件的地方用v-on绑定这个自定义事件 如下: 然后在父组件定义这个方法 //获取imgurl        getImgData:

Vue2.0笔记——{{}}模板与自定义过滤器

模板语法 让我们回到最开始 <div id="app"> <h1>{{message}}</h1> </div> <script> var vm = new Vue({ el:'#app', data:{ message:'HelloWorld' } }) </script> 这是一个HelloWorld,简单的通过模板输出.我们称之为数据绑定,而最常见的就是"Mustache"语法 (双大括号

vue2.0 父子组件 通信

一.父组件传递数据给子组件 (  parent  ==> children  ) props 属性 >parent 组件 parent.vue <parent> <child :child-msg="msg"></child> //这里必须要用 - 代替驼峰 </parent> data(){ return { msg: [1,2,3] }; } >child 组件 child.vue 写法一 props: ['chil

vue2.0全局组件之pdf

目的:像elementUI那样注册全局组件 预览pdf文件 技术支持:使用火狐的pdf.js http://mozilla.github.io/pdf.js/ 准备:新建一个CPdf.vue文件,把火狐demo里面的build里面的pdf.js下载来,并且依赖了elementUI开发的其实就是用了<el-button> 编写: template <template> <div class="cpdf"> <div class="cen

超简单的vue2.0分页组件

1.组件代码 <template> <div class="pagination_comment_style" style="width: 100%;overflow: hidden"> <ul class="pagination"> <li @click="goPage(pageIndex-1)" v-bind:class="{ 'no-allow': 1 == pageI