Skip to content

父子组件的数据传递

父组件向子组件传值

通过属性传递

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<div id="root">
    <counter :count="2"></counter>
    <counter :count="1"></counter>
</div>
<script>
    var counter = {
        props: ['count'],
        template: '<div>{{ count }}</div>'
    }
    var vm = new Vue({
        el: "#root",
        components: {
            counter: counter
        }
    })
</script>

子组件不要去修改父组件传递过来的值(单向数据流),因为传过来的可能是一个引用

错误示范:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<div id="root">
    <counter :count="2"></counter>
    <counter :count="1"></counter>
</div>
<script>
    var counter = {
        props: ['count'],
        template: '<div @click="handleClick">{{ count }}</div>',
        methods: {
            handleClick: function() {
                this.count++
            }
        }
    }
    var vm = new Vue({
        el: "#root",
        components: {
            counter: counter
        }
    })
</script>

正确做法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<div id="root">
    <counter :count="2"></counter>
    <counter :count="1"></counter>
</div>
<script>
    var counter = {
        props: ['count'],
        data: function() {
            return {
                number: this.count,
            }
        },
        template: '<div @click="handleClick">{{ number }}</div>',
        methods: {
            handleClick: function() {
                this.number++
            }
        }
    }
    var vm = new Vue({
        el: "#root",
        components: {
            counter: counter
        }
    })
</script>

子组件向父组件传值

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<div id="root">
    <counter :count="2" @inc="handlerIncrease"></counter>
    <counter :count="3" @inc="handlerIncrease"></counter>
    <div>{{ total }}</div>
</div>
<script>
    var counter = {
        props: ['count'],
        data: function() {
            return {
                number: this.count,
            }
        },
        template: '<div @click="handleClick">{{ number }}</div>',
        methods: {
            handleClick: function() {
                this.number = this.number + 2;
                this.$emit("inc", 2);
            }
        }
    }
    var vm = new Vue({
        el: "#root",
        data: {
            total: 5
        },
        components: {
            counter: counter
        },
        methods: {
            handlerIncrease: function(step) {
                this.total += step;
            }
        }
    })
</script>