Vue结合之前的知识,写的一个小案例

前提知识:

Hello,Vue–初体验

Vue生命周期简述

Vue-mustach,插入DOM操作

Vue一些用法

Vue V-model双向绑定

Vue组件化

直接贴代码吧!

<body>
<div id="app">
    <!-- cnumber1,cnumber2
        为子组件的属性名,把这个父组件属性名帮到子组件属性名,子组件就可以使用父组件的属性值
        父组件传值是用子组件中的props,即cnumber1在props中定义
        @number1change="finputNumber1"
        @为v-on,绑定子组件使用this.$emit(number1change,this.dcnumber1)传过来的自定义方法,dcnumber为传过来的值
        finputNumber1为父组件中定义的方法,没有‘()’则默认是$emit('',arg)中的arg值
        父组件传值给子组件使用$emit()
    -->
    <cpn :cnumber1="fnumber1"
         :cnumber2="fnumber2"
         @number1change="finputNumber1"
         @number2change="finputNumber2"></cpn>
</div>
<template id="cpn">
    <div>
        <!--cnumber为子组件属性名-->
        <h2>props:{{cnumber1}}</h2>
        <!--dcnumber为子组件中的data方法中的属性名,由于可能子组件被复用,所以使用data,而不用props比较安全-->
        <h2>data:{{dcnumber1}}</h2>
        <!--v-model为双向绑定,即更改dcnumber值在组件中会改变,在dom中显示的也会动态改变
            @input监听input输入框的状态,当输入的有变化时,触发子组件cinputNumber1方法,动态修改组件中的值
        -->
        <input type="text" v-model="dcnumber1"  @input="cinputNumber1">
        <h2>props:{{cnumber2}}</h2>
        <h2>data:{{dcnumber2}}</h2>
        <input type="text" v-model="dcnumber2" @input="cinputNumber2">
    </div>
</template>
<script src="../js/vue.js"></script>
<script>
    const app = new Vue({
        el: "#app",
        data: {
            //父组件的属性和值
            fnumber1:9,
            fnumber2:10
        },
        methods:{
            //父组件的方法,在<cpn>中调用
            finputNumber1(num){
                this.fnumber1=num;
            },
            finputNumber2(num){
                this.fnumber2=num;
            }
        },
        components:{
            cpn:{
                template:"#cpn",
                props:{
                    //定义属性,用于父组件传值给子组件
                    cnumber1:Number,
                    cnumber2:Number
                },
                data(){
                    return{
                        //初始化值,用于复用不会共用同样的cnumber,
                        dcnumber1:this.cnumber1,
                        dcnumber2:this.cnumber2
                    }
                },
                methods:{
                    cinputNumber1(){
                        console.log(this.dcnumber1);
                        //将更改后的number1传给父组件
                        this.$emit("number1change",this.dcnumber1);
                        //修改number2后传给父组件更改number2
                        this.dcnumber2=this.dcnumber1 * 100;
                        this.$emit("number2change",this.dcnumber2)
                    },
                    cinputNumber2(){
                        console.log(this.dcnumber2);
                        //将更改后的number2传给父组件
                        this.$emit("number2change",this.dcnumber2)
                        //修改number1后传给父组件更改number1
                        this.dcnumber1=this.dcnumber2 / 100;
                        this.$emit("number1change",this.dcnumber1)
                    }
                }
            }
        }
    });
</script>

</body>