VUE父子组件结合双向绑定小案例

160 阅读1分钟

props ——> properties 属性、特性

1、通过props向子组件传递数据

绑定属性时要用v-bind才会传递变量,不加传过来的是字符串

2、子组件通过自定义事件($emit)向父组件发送消息

父子组件结合双向绑定

body区域

<div id="app">
        <cpn :number1='num1' :number2='num2' @num1change='num1change' @num2change='num2change'></cpn>
    </div>

    <template id="cpn">
        <div>
            <h2>props:{{number1}}</h2>
            <h2>data:{{dnumber1}}</h2>
            <!-- <input type="text" v-model=' dnumber1 '> -->
            <input type="text" :value='dnumber1' @input='num1Input'>
            <h2>props:{{number2}}</h2>
            <h2>data:{{dnumber2}}</h2>
            <!-- <input type="text" v-model='dnumber2 '> -->
            <input type="text" :value='dnumber2' @input ='num2Input'>
        </div>

    </template>

js语句

var vm = new Vue({
        el: '#app',
        data: {
            num1: 0,
            num2: 1
        },
        methods: {
            num1change(value) {
                // console.log(value);
                this.num1 = Number(value)
            },
            num2change(value) {
                this.num2 = Number(value) 
            }
        },
        components: {
            cpn: {
                template: '#cpn',
                // 不建议子元素直接修改props里的值
                props: {
                    number1: Number,
                    number2: Number
                },
                // 修改的值建议放在data里面
                data() {
                    return {
                        dnumber1: this.number1,
                        dnumber2: this.number2
                    }
                },
                methods: {
                    num1Input(event) {
                        // 将input中的value值赋到dnumber中
                        this.dnumber1 = event.target.value;
                        // console.log(this.dnumber1);
                        // 让父组件修改值,发出一个事件
                        this.$emit('num1change', this.dnumber1);
                        // 同时修改dnumber2的值
                        this.dnumber2 = this.dnumber1 * 10;
                        this.$emit('num2change', this.dnumber2)
                    },

                    num2Input(event) {
                        this.dnumber2 = event.target.value;
                        this.$emit('num2change', this.dnumber2);

                        this.dnumber1 = this.dnumber2 / 10;
                        this.$emit('num1change', this.dnumber1)
                    },
                }
            }
        }
    })

watch父子组件结合双向绑定

body区域

<div id="app">
        <cpn :number1='num1' :number2='num2' @num1change='num1change' @num2change='num2change'></cpn>
    </div>

    <template id="cpn">
        <div>
            <h2>props:{{number1}}</h2>
            <h2>data:{{dnumber1}}</h2>
            <input type="text" v-model=' dnumber1 '>
            <!-- <input type="text" :value='dnumber1' @input='num1Input'> -->
            <h2>props:{{number2}}</h2>
            <h2>data:{{dnumber2}}</h2>
            <input type="text" v-model='dnumber2 '>
            <!-- <input type="text" :value='dnumber2' @input ='num2Input'> -->
        </div>

    </template>

js语句

var vm = new Vue({
        el: '#app',
        data: {
            num1: 0,
            num2: 1
        },
        methods: {
            num1change(value) {
                // console.log(value);
                this.num1 = Number(value)
            },
            num2change(value) {
                this.num2 = Number(value)
            }
        },
        components: {
            cpn: {
                template: '#cpn',
                props: {
                    number1: Number, 
                    number2: Number
                },
                data() {
                    return {
                        dnumber1: this.number1,
                        dnumber2: this.number2
                    }
                },
                methods: {

                },
                watch: {
                    dnumber1(newValue) {
                        this.dnumber2 = newValue * 10;
                        this.$emit('num1change', newValue)
                    },
                    dnumber2(newValue) {
                        this.dnumber1 = newValue / 10;
                        this.$emit('num2change', newValue)
                    },
                }
            }
        }
    })