vue组件中的父子组件通信两种方式

子组件是不能引用父组件或者vue的实例数据的,但是在开发中一些数据需要从上层传递到下沉,比如在下面的页面中,我们从服务器请求到了很多的数据,其中一部分数据是需要子组件来进行展示的,这个时候,并不会让子组件在次发送网络请求,而是直接将大组件的数据传递给小组件

父子通信的两种方式

1,用props向子组件传递数据
(vue实例是根组件,最大的父组件)

num就是父传子的元素
<body>
    <div id="app">
        <cpn v-bind:cnum = "num"></cpn>
    </div>
    <template id = "cpn">
        <div>
            {{cnum}}
        </div>
    </template>
    <script>
        // 父传子
        const cpn = {
            template: '#cpn',
            //注意v-bind是不支持驼峰标志的所以下面的cnum不要写成cNum,或者写成驼峰改成v-bind:c-num
            props:{
                // 1,类型限制 type:
                // 2,是否必须传 require: 布尔值
                // 3,默认值 default: 如果是个数组和对象的话必须使用函数传如下

                cnum:{
                    type:Array,//要求是个数组类型
                    require: true,
                    default(){
                        return ['1']
                    }
                }
                
            //   
            },
            data(){
                return {

                }
            }

        }

        var vm = new Vue({
            el: '#app',
            data: {
                num: ['1','2','3']
            },
            components:{
                cpn,
            }
        });
    </script>
</body>

2,通过自定义事件向子组件传递数据

在子组件中通过$emit()来向父组件发送事件,
在父组件中,通过v-on来监听子组件事件

<body>
    <div id="app">
        <!-- 父组件v-on接收子组件发生的事件 -->
        <cpn v-on:itemclick = "cpnClick"></cpn>
    </div>

    <template id = "cpn">
        <div>
           <button v-for="item in categories" @click = "bCli(item)">
               {{item.name}}
            </button>
        </div>
    </template>

    <script>
        // 父传子
        // 子组件
        const cpn = {
            template: '#cpn',
            props:{
              
            },
            data(){
                return {
                    categories:[
                    {id:'1',name:'热门推荐'},
                    {id:'2',name:'手机推荐'},
                    {id:'3',name:'电脑推荐'}
                    ]
                }
            },
            methods:{
                bCli(item){
                    
                    // 子组件发射一个事件,item是参数
                    this.$emit('itemclick',item)
                    
                }
            }

        }

        var vm = new Vue({
            el: '#app',
            data: {
                num: ['1','2','3']
            },
            components:{
                cpn,
            },
            methods:{
                cpnClick(item){
                //表示接受到子组件传过来的参数
                    console.log(item);
                    
                }
            }
        });
    </script>
</body>
发布了159 篇原创文章 · 获赞 36 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43342105/article/details/105284885