vue 组件及组件间的通信


一、组件component

1、什么是组件

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

组件是自定义的元素(对象)

2、定义组件的方式

方式1:先创建组件的构造器,由组件构造器创建组件
注释:麻烦

全局构造器
a)、使用 Vue.extend() 创建一个组件构造器
var MyComponent=Vue.extend({
    template;"<h2>hello Word</h2>"
 })
            b)、使用Vue.component(标签名,组件构造器):根据组件构造器来创建组件
Vue.component('hello',MyComponent)

使用:<hello></hello>


方式2:直接创建组件

注释:方便 推荐使用

Vue.component('world',{
                template:`<h2>hello Word</h2>`,
                data:function(){//在组件中存储数据时,必须以函数形式,函数返回一个对象
                    return {
                        name:"小零"
                    }
                }
             })

3、组件的分类

分类:全局组件、局部组件

4、引用模板
将组件内容放到模板<template></template>中并引用

<template id="wbs">
            <div><!-- template:有且只有一个根元素 -->
                <h3>{{msg}}</h3>
                <ul><li v-for="(k,i) in arr">{{k}}</li></ul>
            </div>
         </template>

         new Vue({
            el:"#container",
            data:{
                msg:"Holle Word"
            },
            computed:{},//计算属性必须是个函数
            methods:{},
            components:{
                template:"#wbs",
                data(){
                    return{
                        msg:"哈哈",
                        arr:["白小白","玥甄","小零","小智","小媚","小卷卷"]
                    }
                }
            }

        })

5、动态组件

多个组件同时使用一个挂载点,然后动态的在它们之间切换、
     <component :is="flag"></component> 

 new Vue({
            el:"#container",
            data:{
                flag:"组件名"
            },
            computed:{},//计算属性必须是个函数
            methods:{},
            components:{
                'my-hello':{
                    template:`<h2>我是hello组件</h2>`,
                    data:function(){
                        return {
                            name:"小零"
                        }
                    }
                },
                'my-world':{
                    template:`<h2>我是world组件</h2>`,
                    data:function(){
                        return {
                            name:"小零"
                        }
                    }
                }
            }

  })

 <keep-alive>  使用 keep-alive 组件缓存非活动组件,可以保留状态,避免重新渲染,默认每次都会销毁非活动组件并且重新创建

6、组件间数据的传递
1、父子组件
在一个组件内部定义另一个组件,称之为父组件
子组件只能在父组件内部使用
默认情况下,子组件无法访问父组件中的数据,每个组件实例的的作用域是独立的

2、组件之间数据传递(通信)

2.1、子组件访问父组件的数据

a)、在调用组件时,绑定想要的父组件中的数据
:数据名="数据变量"

b)、在子组件内部,使用props选项声明获取的数据,即接收来自父组件的数据

    props:['数据名1','数据名2'], 

总结:父组件通过props向下传递数据给子组件

注释:组件中的数据共有三种形式: data 、 props 、 computed (计算属性)

2.2父组件访问子组件的数据

a)、在子组件中使用 vm.$emit(事件名,数据) ;  this.$emit('事件名',参数1,参数2) 

b)、父组件在使用的地方监听触发事件,并且在父组件中定义方法,用来获取数据
<child @事件名="事件名(注:在父组件中定义的事件)"></child>
<child @事件名="getData"></child>
例:
                        methods:{
                            getData(参数1,参数2){
                                console.log(参数1,参数2)
                            }
                        }

总结:子组件通过 events 给父组件触发事件,并且父组件中定义方法,用来获取数据

3、单项数据流

props是单向绑定的,当父组件的属性变化时,将传递给子组件,但是不会反过来
而且不允许子组件直接修改父组件中的数据,报错

解决方法:
方式1:如果子组件想把它变成局部变量来使用,可以将数据存入另一个变量中再进行操作,不影响父组件中的数据
方式2:如果子组件想修改数据并且同步更新到父组件中,两个方法:
a)、使用.sync(1.0 版本中支持,2.0版本中不支持,2.3 版本又开始支持了)
需要显示的触发一个更新事件

b)、可以将父组件中的数据包装成对象,然后在子组件中修改对象的属性(因为对象是引用类型的,指向同一个类型空间)


4、非父子组件之间的通信
非父子组件之间的通信,可以通过一个空的Vue实例作为中央时间总线(事件中心),用它触发事件和监听事件
先创建一个空的vue实例
           var Event=new Vue(); 
            发送数据方式为:
 Event.$emit('事件名',参数1,参数2) 

接收数据方式为:

  Event.$on('事件名',(参数1,参数2)=>{ console.log(参数1,参数2) }) 

二、slot内容分发

猜你喜欢

转载自www.cnblogs.com/yuezhen/p/10407829.html