创建组件

组件是可以重复使用的html容器,可以把它注册到全局的Vue或实例的vue对象上,使它成为全局组件或vue对象的子组件,然后可以将它的html标签插入html文档中。组件的html只能有一个root元素。

使用声明式的方法创建组件

//方式一
var tt=Vue.extend({
    template:"<div>hello vue</div>"
});

Vue.component("tt", tt); //参数1是组件的html标签名,参数2是组件对象名

//方式二
var tt = {
    template: "<div>hello vue</div>"
};

Vue.component("tt", tt);


//方式三
var vv = new Vue({
    el: ".box",
    components: {
        tt: {
            template: "<div>hello vue</div>"
        }
    }    
});

template指向的html还可以直接写在template标签里,然后通过id或class引入

<template id="template-box">
    <div>hello vue</div>
</template>
var tt=Vue.extend({
    template:"#template-box"
});

var tt = {
    template: "#template-box"
};

var vv = new Vue({
    el: ".box",
    components: {
        tt: {
            template: "#template-box"
        }
    }    
});

使用vue文件创建组件

创建一个components目录,在目录下创建一个html,把后缀名改为.vue,清空该文档,然后把template写进去。这种文件就是vue专用的组件文件,在template标签下可以写任何html标签,支持html、script、style标签。

<template>
    <div>
        <h1>{{msg}}</h1>
    </div>
</template>

<script>
    //此处可以使用ES6语法导入js、css文件

    //表示导出这个组件对象
    export default {
        //组件对象可以看成是一个特殊的vue对象,用法与在vue对象差不多,只是data必须是一个函数,它必须返回一个匿名的对象,而真正的data就放在匿名对象中
        data: function () {
            return {
                msg:"hello vue"
            }
        }
    }
</script>
<style></style>

然后导入这个组件对象,把它注册在vue对象上

import Vue from "vue";
import tt from "./components/tt.vue";

var vm = new Vue({
    el: ".box",    
    components: {
        tt: tt
    }    
});

现在可以在vue对象绑定的那个html中使用组件了

<div class="box">
    <tt></tt>
</div>

*组件的html名字如果是驼峰形式,那么插入html时,必须使用连字符:

var tt = {
    template:"<div>hello vue</div>"
}

Vue.component("myCom",tt);
<my-com></my-com>    
子父组件传值

子组件取父组件的数据、调用父组件的函数 $parent

var vm = new Vue({
    el: ".box",
    data: {
        msg:"test"      
    },
    methods: {
        getParentFunction: function () {
            alert("OK");
        }
    },
    components: {
        tt: tt
    }    
});
<template>
    <div>
        <button @click="getParentData">getParentData</button>
    </div>
</template>

<script>
    export default {     
        data: function () {
            return {
                msg:"hello vue"
            }
        },
        methods: {
            getParentData: function () {
                alert(this.$parent.msg);
                this.$parent.getParentFunction();
            }
        }
    }
</script>  

父组件取子组件的数据 $refs

使用vue的$refs对象可以获取为子组件定义的ref引用,通过这种方式获取子组件对象,然后得到子组件的数据或函数。ref只能用在子组件上,对父组件无效。

<template>
    <div></div>
</template>

<script>
    export default {
        data: function () {
            return {
                msg: "hello vue"
            }
        },
        methods: {
            getChildFunction: function () {
                alert("OK");
            }
        }
    }
</script>
<div class="box">
    <tt ref="mytt"></tt>
</div>
var vm = new Vue({
    el: ".box",
    methods: {
        getChildData: function () {
            alert(this.$refs.mytt.msg);
            this.$refs.mytt.getChildFunction();
        }      
    },
    components: {
        tt: tt
    }    
});
切换子组件

除了html标签:template,vue还提供了component标签,这个html标签用于装载组件,它的html属性:is用于指定装载的组件的名字(组件对象的名字),利用is属性可以实现在html标签component中动态切换组件。

<div id="box">
    <a href="#" @click="login">login</a>
    <a href="#" @click="register">register</a>
    <component :is="componentName"></component>
</div>

<script>
Vue.component("login", {
    template: "<h3>login区域</h3>"
});

Vue.component("register", {
    template: "<h3>register区域</h3>",
});  

var vm = new Vue({
    el: "#box",
    data: {
        componentName:null
    },
    methods: {
        login: function () {
            this.componentName = "login";
        },
        register: function () {
            this.componentName = "register";
        }
    }
});

渲染组件

vue提供render来将组件对象渲染到html文档,这样做会使组件直接替换掉绑定到vue上的那个html元素。

var tem = {
    template: "<h1>hello world</h1>"
};

var vm = new Vue({
    el: "#box",
   //不需要注册组件对象,直接替换即可
    render: function (create) {
        return create(tem);
    }
});
组件的生命周期

与vue对象的生命周期是一样的。

在vue组件文件中获取外部文件中的dom元素

通常情况下,一个页面会有N个组件,如果你使用.vue文件创建组件,那么在组件文件中如何访问在同一个页面上的其它组件里的html元素呢?答案是只要这些组件在同一个页面上,那就可以直接使用js原生方法document.querySelector获取其它组件里的html元素。

Javascript - 学习总目录

Javascript - Vue - 组件的更多相关文章

  1. Javascript - Vue - webpack中的组件、路由和动画

    引入vue.js 1.cnpm i vue -S 2.在mian.js中引入vue文件 import Vue from "vue"//在main.js中使用这种方式引用vue文件时 ...

  2. vue组件

    分享出来让思路更成熟. 首先组件是 Vue.js 最强大的功能之一. 可以减少很多的工作量,提高工作效率. 编写一个可复用性的组件,虽然官网上也有.... 编写可复用性的vue组件 具备一下的几个要求 ...

  3. vue组件最佳实践

    看了老外的一篇关于组件开发的建议(强烈建议阅读英文原版),感觉不错翻译一下加深理解. 这篇文章制定一个统一的规则来开发你的vue程序,以至于达到一下目的. 1.让开发者和开发团队更容易发现一些事情. ...

  4. JS组件系列——又一款MVVM组件:Vue(二:构建自己的Vue组件)

    前言:转眼距离上篇 JS组件系列——又一款MVVM组件:Vue(一:30分钟搞定前端增删改查) 已有好几个月了,今天打算将它捡起来,发现好久不用,Vue相关技术点都生疏不少.经过这几个月的时间,Vue ...

  5. vue组件大集合 component

    vue组件分为全局组件.局部组件和父子组件,其中局部组件只能在el定义的范围内使用, 全局组件可以在随意地方使用,父子组件之间的传值问题等. Vue.extend 创建一个组件构造器 template ...

  6. 【Vue】详解Vue组件系统

    Vue渲染的两大基础方式 new 一个Vue的实例 这个我们一般会使用在挂载根节点这一初始化操作上: new Vue({ el: '#app' }) 注册组件并使用—— 全局注册 通过Vue.comp ...

  7. Vue组件模板形式实现对象数组数据循环为树形结构

    数据结构为数组中包含对象--树形结构,用Vue组件的写法实现以下的效果: 树形列表,缩进显示层级,第5级数据加底色,数据样式显色,点击展开折叠数据.本文为用Vue实现方式,另有一篇为用knockout ...

  8. canvas实现倒计时效果示例(vue组件内编写)

    前言: 此事例是在vue组件中,使用canvas实现倒计时动画的效果.其实,实现效果的逻辑跟vue没有关系,只要读懂canvas如何实现效果的这部分逻辑就可以了 canvas动画的原理:利用定时器,给 ...

  9. Vue (三) --- Vue 组件开发

    ------------------------------------------------------------------好心情,会让你峰回路转. 5. 组件化开发 5.1 组件[compo ...

随机推荐

  1. java面向对象(下)-抽象类

    抽象类和抽象方法 抽象类和抽象方法必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法 抽象类和抽象方法的规则如下 1.抽象类和抽象方法必须要用abstra ...

  2. Leetcode春季活动打卡第三天:面试题 10.01. 合并排序的数组

    Leetcode春季活动打卡第三天:面试题 10.01. 合并排序的数组 Leetcode春季活动打卡第三天:面试题 10.01. 合并排序的数组 思路 这道题,两个数组原本就有序.于是我们采用双指针 ...

  3. 【Javaweb】Cookie和Session

    会话技术 什么是会话 从浏览器访问服务器开始,到访问服务器结束,浏览器关闭为止的这段时间内容产生的多次请求和响应,合起来叫做浏览器和服务器之间的一次会话 会话管理作用 共享数据用的,并且是在不同请求间 ...

  4. 扩展中国剩余定理(exCRT)

    我 tm--CRT 没看懂 exCRT 却看懂了--emmmm-- 而且这名字完全就是国内的 OI 带师胡起的吧-- 考虑一次同余方程组 \[\begin{cases} x \equiv a_1\ ( ...

  5. 第1天 Mark Down 学习及DOS命令

    Markdown学习 标题 "#加空格"几个#就表示几级标题 字体 helloworld!一两个两个*号 helloworld!一边一个*号 helloworld! 一边三个号 h ...

  6. OpenSUSE Leap 42.1 KDE Ultmate Linux Distribution终极Linux系统试用与SSH连接

    系统安装环境: #一台旧笔记本电脑 #CPU Intel(R) Core(TM) i3 M 380 2.53GHz (4核) #内存 1G #硬盘存储 250G #系统型号 OpenSUSE Leap ...

  7. Python脚本:批量将.doc文件转化为.docx文件

    将.doc转换为.docx文件有几种常用的方法: Microsoft Word 和 WPS 自带.doc转换.docx功能,但只能一个文件一个文件转换,批量转换要会员 在线网页 Office-Conv ...

  8. mysql中的with rollup得到group by的汇总信息

    使用mysql中的with rollup可以得到每个分组的汇总级别的数据: 表如下: CREATE TABLE `test3` (  `id` int(5) unsigned NOT NULL AUT ...

  9. tp3常量

    __MODULE__ __CONTROLLER__

  10. Pdb— Python的调试器

    参考:Pdb- Python的调试器 pdb 模块定义了一个交互式源代码调试器,用于 Python 程序.它支持在源码行间设置(有条件的)断点和单步执行,检视堆栈帧,列出源码列表,以及在任何堆栈帧的上 ...