2020/08/01 vue组件间数据传递

目录

 

一,父组件给子组件传递数据

 二:子组件使用父组件的方法  通过$emit() 触发

三,组件向父组件传递数据


一,父组件给子组件传递数据

  1. 我的理解是现在父组件中,找到需要数据的子组件
  2. 可以绑定固定数据,也可以是用v-bind绑定父组件可变的数据
  3. 如下 名字是give 数据是父组件的msg,有个坑命名最好用全部小写
  4. 将give 在子组件的props数组中定义下才能用,定义完了,才能在子组件中使用
  5. 父组件的数据msg一改对应的用到他数据的子组件也会改
<body>
    <div id="app">
        <com1 :giveson='msg'></com1>
        <reg :give='msg'></reg>
        <reg give='固定信息'></reg>
    </div>
    <!-- <template id="son">
    <h1>子组件信息---{{giveSon}}</h1>
</template> -->
</body>
<script>
    Vue.component("reg", {
        props: ['give'],
        template: "<h3>全局子组件{{give}}</h3>",
    })
    var vm = new Vue({
        el: '#app',
        data: {
            msg: "父组件数据"
        },
        components: {
            com1: {
                template: "<h1>子组件信息---{{giveson}}</h1>",
                props: ['giveson'],
            }

        }
    })
</script>

如果要用驼峰命名怎么办 注意要在DOM元素中用短横线来连接如下

<body>
    <div id="app">
        <com1 :give-son='msg'></com1>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            msg: "父组件数据"
        },
        components: {
            com1: {
                template: "<h1>子组件信息---{{giveSon}}</h1>",
                props: ['giveSon'],
            }

        }
    })
</script>

 那为什么是这样呢 因为DOM元素的属性是不区分大小写的 你写giveSon 其实就是giveson 他就会看props里面有没有giveson,一看只有giveSon 就报错,用下列程序可验证下上面的说法 

<body>
    <div id="app">
        <com1 :giveSon='msg'></com1>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            msg: "父组件数据"
        },
        components: {
            com1: {
                template: "<h1>子组件信息---{{giveson}}</h1>",
                props: ['giveson'],
            }

        }
    })
</script>

 二:子组件使用父组件的方法  通过$emit() 触发

<body>
    <div id="app">
        <com1 @fun='show'></com1>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {},
        methods: {
            show(data) {
                console.log(data);
            }
        },
        components: {
            com1: {
                template: "<button @click='useMethod'></button>",
                methods: {
                    useMethod() {
                        this.$emit('fun', this.sonmsg);
                    }
                },
                data() {
                    return {
                        sonmsg: "子组件调用show方法传递过去的数据"
                    }
                }
            },

        }
    })
</script>

三,组件向父组件传递数据

拿到父组件的数组后,来向数组添加数据 可以实现子组件向父组件添加数据,但是这不被推荐的

所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。

额外的,每次父级组件发生变更时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。

<body>
    <div id="app">
        <com1 :arr='arr'></com1>
    </div>
    <template id="com1">
        <div>
            <ul>
                <li v-for='(item,i) in arr' :key='i'>{{item}}</li>
            </ul>
            <button @click="add(arr)">添加</button>
        </div>
    </template>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            arr: ["aa", 'bb']
        },
        components: {
            com1: {
                template: '#com1',
                props: ['arr'],
                methods: {
                    add(arr) {
                        arr.push('cc');
                    }
                },
                data() {
                    return {
                        sonmsg: "子组件调用show方法传递过去的数据"
                    }
                }
            },

        }
    })
</script>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太想进步了

新人菜鸡一枚,相互学习进步啊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值