vue组件的数据传递

    vue的一个重要特征就是组件化开发。那么如何实现组件之间的消息传递就显得尤为重要。vue给出了以下几种方式:

  • 利用props实现父组件向子组件传递信息
  • 子组件内利用$emit方法触发父组件的一个事件,同时可以传入参数实现子组件向父组件的数据传递。

    下边以一个具体的例子做详细说明,这个例子中父组件利用props向子组件传递一个字符串,同时子组件设置相应的按钮,点击按钮实现子组件向父组件传递一个数据,以此改变父组件的fontSize值。具体代码如下:

<body>
    <div id="app1" :style="{ fontSize: size + 'px' }">
        <demo-props :message='message' @enlarge-text='enlargeText'></demo-props>       
    </div>
    <script>
        Vue.component('demo-props', {
            props: ['message'],
            template: `
            <div>               
                <button @click="$emit('enlarge-text',2)">2倍放大</button>
                <button @click="$emit('enlarge-text',4)">4倍放大</button>
                <p>{{message}}</p> 
            </div>`
        })
        var app1 = new Vue({
            el: "#app1",
            data: {
                size: 10,
                message: 'Hello world'
            },
            methods: {
                enlargeText: function (scale) {
                    this.size = this.size * scale;
                }
            }
        })
    </script>
</body>

以上代码有几点需要具体说明:

  1. 注册组件时,template后边不是单引号,而是键盘上数字键1左边的那个符号。
  2. 点击子组件的button,会执行$emit函数,该函数的第一个参数是在父级组件监听的事件名称,后边的参数都是子组件需要向父组件传递的数据。
  3. 注册组件时,props是一个数组,需要从父组件传递值的属性,都应该放在该数组内。当然vue也提供了一种方式让我们对props中的值做一些简单验证。此时props变成一个对象而不是一个存放字符串的数组。举例如下:
 Vue.component('my-component', {
            props: {
                propA: Number,           //propA的值必须是Number类型的
                propB: [Number, String],  //propB的值必须是Number类型或者String类型
                propC: {                 //propC的值是必须填写的字符串类型的
                    type: String,
                    required: true
                },
                propD: {                 //propD的值是一个Number的,且默认值是100
                    type: Number,
                    default: 100
                },
                propE: {                  //propE的值是一个有默认值的对象                 
                    type: Object,
                    default: function () {
                        return { message: 'Hello world' }
                    }
                },
                propF: {                  //propF有自自定义的验证方式,其值必须是'success', 'warning', 'danger'中的一个
                    validator: function (value) {
                        return ['success', 'warning', 'danger'].indexOf(value) !== -1;
                    }
                }
            }
        })


猜你喜欢

转载自blog.csdn.net/u013910340/article/details/80305718