码迷,mamicode.com
首页 > 其他好文 > 详细

父子组件间的数据传递

时间:2019-07-11 22:00:18      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:counter   function   引用类型   字符串   rop   流的概念   cfile   r++   temp   

vue当中有个单向数据流的概念,也就是:父组件可以向子组件传递/修改参数(通过属性的方式传),但子组件不可以反过来修改父组件传递过来的参数!(因为怕子组件改了父组件引用类型的数据,可能会影响到其他组件)。那怎样解决这个问题?可以复制给子组件自己的变量,然后子组件修改自己的变量啊!
这是父组件向子组件传递数据:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script src="./vue.js"></script>
    <!-- <script src="http://cdn.staticfile.org/vue/2.6.10/vue.common.dev.js"></script> -->
</head>
<body>
<div id="root">
    //加了:后引号里的内容就不是字符串了,而是js表达式,所以,就是数字类型了 <br>
    <counter :count="1"></counter>
    <counter :count="2"></counter>
</div>
<script type="text/javascript">
    //父组件是通过属性的方式向子组件传递数据的

    //局部组件,需要注册
    var counter = {
        props: ["count"], //子组件接收父组件传过来的内容
        data: function() {
            return {
                number: this.count //从父组件接收count数据,复制到子组件自己data的变量number里
            }
        },
        /*template: "<div @click=‘handleClick‘>{{count}}</div>",*/

        //既然子组件不应该修改父组件传过来的值,那就修改自己的咯
        template: "<div @click=‘handleClick‘>{{number}}</div>",
        methods: {
            handleClick: function() {
                /*//这种方式虽然可以实现,但会警告:不要直接修改父组件传递过来的属性!
                this.count++ */

                //所以给子组件自己的number++,而不是父组件的count++
                this.number++
            }
        }
    }
    var vm = new Vue({
        el: "#root",
        components: {
            counter: counter
        }
    })
</script>
</body>
</html>

子组件向父组件传递数据:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script src="./vue.js"></script>
    <!-- <script src="http://cdn.staticfile.org/vue/2.6.10/vue.common.dev.js"></script> -->
</head>
<body>
<div id="root">
    //加了:后引号里的内容就不是字符串了,而是js表达式,所以,就是数字类型了 <br>
    //这个模版属于根组件,所以handleInc方法也要写在根组件 <br>
    <counter :count="3" @change="handleInc"></counter>
    <counter :count="2" @change="handleInc"></counter>
    <div>{{total}}</div>
</div>
<script type="text/javascript">
    //父组件是通过属性的方式向子组件传递数据的

    //局部组件,需要注册
    var counter = {
        props: ["count"], 
        data: function() {
            return {
                number: this.count 
            }
        },

        //既然子组件不应该修改父组件传过来的值,那就修改自己的咯
        template: "<div @click=‘handleClick‘>{{number}}</div>",
        methods: {
            handleClick: function() {
                this.number++
                //点击子组件,触发change事件,告诉父组件,自己增加了1(可以自己命名事件,不一定要是change)
                this.$emit("change", 1)
            }
        }
    }
    var vm = new Vue({
        el: "#root",
        components: {
            counter: counter
        },
        data: {
            total: 5
        },
        methods: {
            //接收到子组件中的参数step(这里是this.$emit("change", 1)中的1),参数可以随意命名的,不一定要叫step
            handleInc: function(step) { 
                this.total += step
            }
        }
    })
</script>
</body>
</html>

父子组件间的数据传递

标签:counter   function   引用类型   字符串   rop   流的概念   cfile   r++   temp   

原文地址:https://blog.51cto.com/5660061/2419379

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!