blog

Vue(2.x) -- 组件

什么是vue组件: 组件(Component)是 Vue.js 最强大的功能之一。 组件可以扩展 HTML 元素,封装可重用的代码。

下面全部按照分开试写法讲解,分开与不分开写都一样, vue中组件同样具有三部分(template, script, style)组成以.vue结尾文件。

注册组件

全局注册

全局注册的组件可以用在其被注册之后的任何 (通过 new Vue) 新创建的 Vue 根实例,也包括其组件树中的所有子组件的模板中。

Vue.component("my-component",{
    template:"<p>test,hi i am a component</p>"
})

局部注册

<template>
    <div>
        <my-component></my-component>
    </div>
</template>
<script>
export default {
    name: 'index',
    components:{
        'my-component': { 
            template:'<p>hello this is part component</p>'
        }
    }
</script>

// 组件分离写法

<template>
    <div>
        <my-component></my-component>
    </div>
</template>
<script>
import myComponent from './myComponent';
export default {
    name: 'index',
    components:{
        'my-component': myComponent
    }
</script>

组件传参

下面讲述全部由局部注册为例,全局注册同理。

父子组件

父子组件的概念这里就不在解释,如有不懂请google.

prop 向子组件传参
// 父组件

<template>
    <div>
        <my-component :name="name"></my-component>
    </div>
</template>
<script>
import myComponent from './myComponent';
export default {
    name: 'index',
    data: () {
        return {
            name: '父子传参'
        }
    },
    components:{
        'my-component': myComponent
    }
</script>

// 子组件
<template>
    <div>
        {{name}}
    </div>
</template>
<script>
export default {
    name: 'sub',
    data: () {
        return {}
    },
    props: ['name']
    // props 可以为数组,可以为对象,如下:
    // 下面为第二种形式,对象写法
    props: {
        name: String, // 只进行类型检测
        age: {
            type: Number, // 类型
            default: 0, // 默认值
            required: true, // 必传
            // 检验方法
            validator: function (value) {
                return value >= 0
            }
        }
    }
</script>
$emit 向父组件传参
// 子组件

<template>
    <div>
        <button @click="convey">点击向父组件传参</button>
    </div>
</template>
<script>
export default {
    name: 'sub',
    data: () {
        return {}
    },
    methods: {
        convey: function () {
            this.$emit('parentEvent', '子组件数据');
        }
    }
</script>

// 父组件

<template>
    <div>
        <!-- 接受子组件参数方法事件 -->
        <my-component @parentEvent="receive"></my-component>
    </div>
</template>
<script>
import myComponent from './myComponent';
export default {
    name: 'index',
    data: () {
        return {
            child: ''
        }
    },
    methods: {
        receive: function (data) {
            this.child = data;
        }
    }
    components:{
        'my-component': myComponent
    }
</script>

事件总线

上面讲到了父子间的消息互动,那平级之家怎么互动的,下面将来用vue的事件总线完成平级之间的互动.

一、 创建事件总线 src/assets/下创建一个eventBus.js,

import Vue from 'Vue';
export default new Vue();

二、 分发事件

import eventBus from '../assets/eventBus';
export default new Vue({
    name: 'alert',
    mounted: function () {
        // 添加事件监听,$on(事件名称, 回掉函数)
        eventBus.$on('alert', (data) => {});
        // eventBus.$once('alert', (data) => {}); 只出发一次的事件监听
    },
    beforeDestroy: function () {
        // 移除事件监听
        eventBus.$off('alert', () => {});
    }
})

三、 事件

import eventBus from '../assets/eventBus';
export default new Vue({
    name: 'user',
    mounted: function () {
        // 事件,
        // 第一个参数是事件名称
        // 第二个参数是发送事件所携带的参数
        evenBus.$emit('alert', {});
    }
})

希望这篇文章会对你起到一定作用,如有问题请联系 newwjf@outlook.com/newwjf@163.com