Vue组件

375 阅读1分钟

组件基本概念

vue组件都是vue实例 ,只有当组件被使用的时候才能被当作组件 ,不然都只是一份普通的对象.

  • 全局组件:Vue.component(组件名,{})
  • 局部组件: 1.声明 2.注册(在哪用就在哪注册) 3.使用

自定义组件中的data是一个函数,返回值是一个对象 ,这个对象里面放的才是我们组件内部的数据 ,这样做是为了保证组件之间的独立性

组件之间关系

子父组件跟全局组件局部组件没有任何关系 . A组件用了B组件 那么 A就是父组件 B就是子组件

子父组件之间的数据交互

父传子: 让子组件使用父组件的数据

  • $parent 通过获取组件的方式
  • 自定义属性 + props (type default required validator) 官方推荐
  • $attrs 可以获取没有被props接收的剩余的属性
  • provide/inject
  • $children + 索引
  • $refs

子传父: 通过让子组件告诉父组件要执行什么代码

  • $parent
  • 自定义事件 + $emit : 所有再组件上边的事件都是自定义事件
  • $listeners 获取传给子组件的所有的自定义事件
  • provide/inject provide(){return {name:this.name}}

兄弟组件之间数据交互 EventBus

<body>
    <div id="app">
        <bro1></bro1>
        ------------------------
        <bro2></bro2>
    </div>
</body>
<template id="bro1">
    <div>
        <h1 :style="{color:col1}">hello brother1</h1>
        <button @click="fn1">改变bro2的字体颜色</button>
    </div>
</template>
<template id="bro2">
    <div>
        <h1 :style="{color:col2}">hello brother2</h1>
        <button @click="fn2">改变bro1的字体颜色</button>
    </div>
</template>

</html>
<script src="../node_modules/vue/dist/vue.js"></script>
<script>
    Vue.component('bro1',{
        template:'#bro1',
        data(){
            return {
                col1:'blue'
            }
        },
        created(){
            //
            bus.$on('change1',(val)=>{
                this.col1 = val
            })
        },
        methods:{
            fn1(){
                bus.$emit('change2','green')
            }
        }
    })
    Vue.component('bro2',{
        template:'#bro2',
        data(){
            return {
                col2:'red'
            }
        },
        created(){
            //
            bus.$on('change2',(val)=>{
                this.col2= val
            })
        },
        methods:{
            fn2(){
                bus.$emit('change1','pink')
            }
        }
    })
    const bus = new Vue();
    // console.log(bus.$event)
    let vm = new Vue({
        el: '#app',
        data: {
            name: "polikesen"
        }
    })
</script>

vuex能够实现所有类型的数据交互传递

简单的实现下:

<body>
    <div id="app">
        <h1>{{name}}</h1>
        <show></show>
        <btn></btn>
        {{$store.state.count}}
    </div>
</body>
</html>

<template id='btn'>
    <div>
        <button @click="$store.commit('add')">+</button>
        <button  @click="$store.commit('sub')">-</button>
        {{$store.state.count}}
    </div>
</template>

<template id='show'>
    <div>
        <h1>当前的数字是{{$store.state.count}}</h1>
    </div>
</template>

<script src="../node_modules/vue/dist/vue.js"></script>
<script src="../node_modules/vuex/dist/vuex.js"></script>
<script>
    Vue.component('btn',{
        template:'#btn',
        created(){
            console.log(this)
        }
    })
    Vue.component('show',{
        template:'#show',
        created(){
            console.log(this)
        }
    })
    let store = new Vuex.Store({
        state:{
            count:100,
        },
        mutations:{
            add(n){
                //n就是上边的state
                n.count++
            },
            sub(state){
                state.count--
            }
        }
    })
    let vm = new Vue({
        el:'#app',
        store,
        data:{
            name:"polikesen"
        }
    });
</script>