十九、Vue组件化开发-一看就懂的详解父子组件数据通信之父传子

作者: 温新

分类: 【Vue.js】

阅读: 2023

时间: 2020-12-05 07:52:18

每一个组件都有自己的属性与方法,父子组件中的数据无法相互使用。Vue组件中,data必须是一个函数其必须有一个返回值,且该返回值必须是一个对象。

组件无法直接访问Vue实例中的data数据,同理父子组件也是如此

下面通过案例来演示组件之间数据无法相互使用。

<div id="app">
    <child></child>
</div>
<script>
    var app = new Vue({
        el:"#app",
        data:{
            ptitle:'我是父组件的标题'
        },
        components:{
            // 子组件
            child: {
                template:`<div>{{ pptitle }}</h2><p>我是子组件的内容</p></div>`,
                data:function(){
                    return {}
                }
            },
        }
    });
</script>

1)上述案例,在Vue实例中定义了一个局部组件child,该组件有自己的数据、属性、方法等;

2)在child子组件中使用父组件(也就是Vue实例,即根组件)的ptitle,此时,子组件是无法访问父组件的数据的,且报错,如下

vue.js:616 [Vue warn]: Property or method "ptitle" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property.

3)我们需要在子组件中使用父组件的数据,该怎么办?父组件将其数据传给子组件。

父组件通过props属性将数据传递给子组件

父组件将数据传递给子组件需要注意的事项:

1)父传子,通过props属性将数据传递给子属性

2)props定义在子组件中,格式为 props:自定义子组件变量名,(此格式为简单的举例说明,props接收的类型有很多)

3)视图上使用子组件时,在子组件身上通过v-bind:自定义子组件变量名="父组件中需要传递的数据变量名"将数据传递的子组件;

4)子组件模板中必须含有一个根组件

下面通过案例演示:

<div id="app">
    <!-- v-bind:pptitle绑定属性名与子组件中的数据变量名一致 -->
    <!-- ptitle为父组件的数据-->
    <child v-bind:pptitle="ptitle"></child>
</div>
<script>
    var app = new Vue({
        el:"#app",
        data:{
          ptitle:'我是父组件的标题'
        },
        components:{
            // 子组件
            child: {
                // 1)子组件内通过props属性接收父组件传递来的数据
                // 2)pptitle为子组件内定义的数据变量名
                // 3)该pptitle变量名需要使用使用组件时v-bind绑定属性一致
                props:['pptitle'],
                template:`<div><h1>{{ pptitle }}</h1>我是子组件的内容</div>`,
                data:function(){
                    return {}
                }
            },
        }
    });
</script>

总结:父组件传数据给子组件,子组选渲染时,通过在子组件本身使用v-bind绑定将父数据传递子组件;子组件中通过props属性接收来自父组件的火数据。

父向子传递数据,数据的类型

传递的数据类型有StringNumberBooleanArrayObjectDateFunctionSymbol

<div id="app">
    <child v-bind:pptitle="ptitle" :author="author"></child>
</div>
<script>
    var app = new Vue({
        el:"#app",
        data:{
            ptitle:'我是父组件的标题',
            author:"小白",
        },
        components:{
            child: {
                props:{
                    pptitle: {
                        // 类型必须是字符串
                        type:String
                    },
                    author:{
                        type:String,
                        default:'自如初'
                    }
                },
                template:`<div><h1>{{ pptitle }}</h1><b>{{author}}</b>我是子组件的内容</div>`,
                data:function(){
                    return {}
                }
            },
        }
    });
</script>

上述案例中,父组件向子组件所传的数据必须是字符串类型;除了验证之外还可以使用默认值,如当父组件没有给子组件传递author时,那么子组件就会显示它所定义的默认值。

<!--author显示子组件中的默认值-->
<child v-bind:pptitle="ptitle" :author="author"></child>

2020-12-05

请登录后再评论