自学内容网 自学内容网

第二十四课 Vue中子组件调用父组件数据

Vue中子组件调用父组件数据

Vue是不建议在不同的组件直接传递值的,我们需要使用props方法来进行组件间的值传递

子组件调用父组件数据

父模板的数据,子组件是无法直接调用的

无法直接调用

1)组件调用顶级对象中的data

    <div class="vue">
        <per></per>
    </div>
    <script>
        new Vue({
            el: '.vue',
            data: {
                vals: 'Hello World !'
            },
            components: {
                'per': {
                    template: '<span>嵌套组件父 {{vals}}</span>',
                }
            }
        });      
    </script>

2)子组件中调用父组件的数据

无法直接调用

    <div class="vue">
        <per></per>
    </div>
    <script>
        new Vue({
            el: '.vue',
            components: {
                'per': {
                    data: function(){
                        return {
                            vals: "我是父组件中的数据"
                        }
                    },
                    template: '<span>嵌套组件父 {{vals}} : <son></son></span>',
                    components: { //嵌套子组件的根为 a
                        'son': {
                            template: '<strong>嵌套子组件</strong>'
                        }    
                    }
                }
            }
        });      
    </script> 

props接受数据

props类似于为子组件定义了属性名,用于接受父组件传递进来的值,通过v-bind将定义好的属性并绑定到子组件实例上进行参数绑定。

1)子组件接受父组件的传值

    <script>
        new Vue({
            el: '#app',
            components: {
                per: {
                    data: () => ({
                        val: 'Hello World !'
                    }),
                    template: `
                                <div>
                                    <h1>这是父组件的内容 {{val}}</h1>
                                    <son :getVal="val"></son>
                                </div>
                                `,
                    components: {
                        son: {
                            props: ['getVal'],
                            template: '<h1>这是子组件的内容 {{getVal}}</h1>'
                        }
                    } 
                }
            }
        })
    </script>  

2)子组件介绍父组件的多值传递

props对应的数组对象,可以接受多值传递

    <div id="app">
        <per></per> 
    </div>
    <script>
        new Vue({
            el: '#app',
            components: {
                per: {
                    data: () => ({
                        val: 'Hello World !',
                        nums: 1000
                    }),
                    template: `
                                <div>
                                    <h1>这是父组件的内容 {{val}}</h1>
                                    <son :getVal="val" :getMore="nums"></son>
                                </div>
                                `,
                    components: {
                        son: {
                            props: ['getVal', 'getMore'],
                            template: '<h1>这是子组件的内容 {{getVal}}  {{getMore}}</h1>'
                        }
                    } 
                }
            }
        })
    </script>    

props数据过滤

props后的属性也可以是obj格式的对象,方便针对接受的参数进行过滤操作

1)字符过滤(接受的值是否为字符)

    <div id="app">
        <per></per> 
    </div>
    <script>
        new Vue({
            el: '#app',
            components: {
                per: {
                    data: () => ({
                        val: 'Hello World !'
                    }),
                    template: `
                                <div>
                                    <h1>这是父组件的内容 {{val}}</h1>
                                    <son :getVal="val"></son>
                                </div>
                                `,
                    components: {
                        son: {
                            props: {
                                'getVal': [String]
                            },
                            template: '<h1>这是子组件的内容 {{getVal}}</h1>'
                        }
                    } 
                }
            }
        })
    </script>

2)多数据类型过滤

当前传递进来的数据,只允许是数值或者字符

    <div id="app">
        <per></per> 
    </div>
    <script>
        new Vue({
            el: '#app',
            components: {
                per: {
                    data: () => ({
                        val: 'Hello World !'
                    }),
                    template: `
                                <div>
                                    <h1>这是父组件的内容 {{val}}</h1>
                                    <son :getVal="val"></son>
                                </div>
                                `,
                    components: {
                        son: {
                            props: {
                                'getVal': [String, Number]
                            },
                            template: '<h1>这是子组件的内容 {{getVal}}</h1>'
                        }
                    } 
                }
            }
        })
    </script>

3)多种过滤方式

a)为当前空值传递赋默认值
b)类型检测
c)自定义验证函数

官方示例:

Vue.component('example', {
  props: {
    // 基础类型检测 (`null` 意思是任何类型都可以)
    propA: Number,
    // 多种类型
    propB: [String, Number],
    // 必传且是字符串
    propC: {
      type: String,
      required: true
    },
    // 数字,有默认值
    propD: {
      type: Number,
      default: 100
    },
    // 数组/对象的默认值应当由一个工厂函数返回
    propE: {
      type: Object,
      default: function () {
        return { message: 'hello' }
      }
    },
    // 自定义验证函数
    propF: {
      validator: function (value) {
        return value > 10
      }
    }
  }
})

原文地址:https://blog.csdn.net/weixin_44010641/article/details/145269144

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!