创建组件

组件是可以重复使用的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. ES6 数值类型常用方法

    ES6 数值类型常用方法 <script type="text/javascript"> // Number常用方法 /* Number.isFinite() 用来检查 ...

  2. python基础之os模块操作

    # os模块 目录相关内置库import os# . 当前目录 .. 返回上一级目录# 1. os.path.abspath() --获取当前文件的绝对路径(不包含os模块.py) pwd# path ...

  3. python基础之文件的读取

    #文件名 txt文件的读取#文件的读取 open("文件","读写方法") with open("文件","读写方法") ...

  4. 未开通js之前的纯css网页主题

    本主题修改自其他大佬:Rocket1184/MaterialCnblogs: Material Theme for cnblogs.com (github.com) 只需在博客后台选择"禁用 ...

  5. 一次搞懂JavaScript对象

    索引 目录 索引 1. 对象与类 2.对象使用 2.1 语法 2.2 属性 3.对象特性 4.对象的创建 4.1 字面量 4.2 工厂函数 4.3 构造函数 4.4 class类 4.5 对象与单例模 ...

  6. jenkens安装教程

    war包安装方式(linux和windows下) 具体参见:https://www.cnblogs.com/UncleYong/p/10742867.html

  7. OVERLAPPED 结构

    typedef struct _OVERLAPPED { ULONG_PTR Internal; ULONG_PTR InternalHigh; union { struct { DWORD Offs ...

  8. Clip Studio Paint EX 1.10.6安装破解教程

    clip studio paint是一款牛逼的绘图软件,简称csp.做动漫.漫画设计的同学的必备神器.本文教大家如何安装并破解 clip studio paint ex 1.10.6版本,文章教程提供 ...

  9. CSS中content属性的妙用

    前言 本文讲解CSS中使用频率并不高的content属性,通过多个实用的案例,带你由浅入深的掌握content的用法,让代码变得更加简洁.高效. 定义 W3school中这样定义: content 属 ...

  10. kivy八种布局方式学习

    kivy八种布局:FloatLayout.BoxLayout.AnchorLayout.GridLayout.PageLayout.RelativeLayout.ScatterLayout.Stack ...