父传子:靠自定义属性

方法一(接收数据):
①在父组件中,在子组件的模板中定义一个自定义属性,值是父组件对象中data的值
②在子组件对象中通过props来接收数据,type:~~
③接收数据后即可使用
方法二(接收方法):
①在父组件中,在子组件的模板中定义一个自定义属性
②在父组件中的methods中定义这个属性值
③在子组件对象的props中接收这个属性名
④在子组件中注册一个自带属性
⑤在子组件对象的methods中通过子的属性来触发来自父的属性

子传父:靠自定义事件

@hello="f"(父组件中的son");
②在父组件对象中methods调用方法 f(){}
③son组件内部定义个自带属性触发;例如:<button :click="g">点击</button >
④son组件对象method中执行g()函数来触发自定义事件hello;例如:g(){this.emit("hello",this.sondata)(并且可以带上数据);
⑤father组件对象中:f(msg){}msg表示hello事件触发时人家给你传递的数据;
⑥定义数据:data(){return{datafromson:""}}为空;
methods:{f(msg){this.datafromson=msg}}
⑧小胡子即可调用;

组件之间的传值:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app">
    <Father></Father>
</div>

<!--Father组件的模板-->
<template id="father">
    <div>
        <h3>Fahter组件---->{{ fatherData }}</h3>
        <Son></Son>
    </div>
</template>
<!--Son组件的模板-->
<template id="son">
    <div>
        <h3>Son组件---->{{ fatherData }}</h3>
    </div>
</template>
<script src="../js/vue-development.js"></script>
<script>
    // 定义Son组件
    let Son = {
        template:"#son",
    }

    // 定义Father组件
    let Father = {
        template:"#father",
        data(){ return { fatherData:"Father组件中的数据" } },
        components: {
            Son
        }
    }

    let vm = new Vue({
        el:"#app",
        components:{
            Father
        }
    });
</script>
</body>
</html>

----------------------------------------------------------------------------------------------------------------------------------------------

父传子:核心靠自定义属性。

步骤:

1)在父组件模板中使用子组件的位的属性位置绑定父组件中的数据
        <Son :abc="fatherData"></Son>  这里面的冒号的作用

    2)在子组件对象中通过props接收数据
        let Son = {
            template:"#son",
            props:{
                /* abc表示子组件接收的数据 String表示子组件期待的数据是一个字符串,如果不是字符串,就会警告*/
                abc:String
            }
        }

    3)接收完数据,就可以使用之,在子组件模板中使用
        <template id="son">
            <div>
                <h3>Son组件==>{{ abc }}</h3>
            </div>
        </template>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app">
    <Father></Father>
</div>

<!--Father组件的模板-->
<template id="father">
    <div>
        <h3>Fahter组件---->{{ fatherData }}</h3>

        <!--abc="fatherData"是自定义属性 属性名是abc  属性值是fatherData这个字符串-->
        <!--<Son abc="fatherData"></Son>-->

        <!--:abc="fatherData" 也是自定义属性节点 属性名是abc 属性值是fatherData这个数据-->
        <Son :abc="fatherData"></Son>
    </div>
</template>

<!--Son组件的模板-->
<template id="son">
    <div>
        <h3>Son组件---->{{ abc }}</h3>
    </div>
</template>

<script src="../js/vue-development.js"></script>
<script>
    // 定义Son组件
    let Son = {
        template:"#son",
        props:{
            /* abc表示子组件接收的数据 String表示子组件期待的数据是一个字符串,如果不是字符串,就会警告*/
            abc:String
        }
    }

    // 定义Father组件
    let Father = {
        template:"#father",
        data(){ return { fatherData:"Father组件中的数据" } },
        components: {
            Son
        }
    }

    let vm = new Vue({
        el:"#app",
        components:{
            Father
        }
    });
</script>
</body>
</html>

props的几写法(父传子):

1) props:{
            title:String
        }
    2) props:{
            title:{
                type:String,  // 期待是一个String
                required:true, // 要求父必须传递传递
            }
        }

    3)props:{
        title:{
            type:String,
            // required:true, // 要求父必须传递传递
            default:"这是一个默认值"
        }
     }
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="app">
    <Father></Father>
</div>

<template id="father">
    <div>
        <h3>Fahter组件---->{{ fatherData }}</h3>
        <!--<Son :title="fatherData"></Son>-->

        <!--没有传递数据-->
        <Son></Son>
    </div>
</template>

<template id="son">
    <div>
        <h3>Son组件---->{{ title }}</h3>
    </div>
</template>

<script src="../js/vue-development.js"></script>
<script>
    let Son = {
        template:"#son",
        /*props:{
            title:String
        }*/
        props:{
            title:{
                type:String,
                // required:true, // 要求父必须传递传递
                default:"这是一个默认值"
            }
        }
    }

    let Father = {
        template:"#father",
        data(){ return { fatherData:"Father组件中的数据" } },
        components: {
            Son
        }
    }

    let vm = new Vue({
        el:"#app",
        components:{
            Father
        }
    });
</script>
</body>
</html>

----------------------------------------------------------------------------------------------------------------------------------------------

子传父:靠自定义事件

自定义事件:
    <button click="alert(123)">登录</button>
        click="alert(123)"  html标签中天生的事件   DOM中的事件绑定
    <button @click="alert(123)">登录</button>
        @click="alert(123)"  html标签中天生的事件   vue中的事件绑定
    <button @abc="alert(123)">登录</button>
        @abc="alert(123)"  html标签中的自定义事件   vue中的事件绑定   事件名就是abc
    <Father @click="alert(123)"></Father>
        @click="alert(123)" 组件中自自定义事件 事件名是click
    <Father @abc="alert(123)"></Father>
        @abc="alert(123)" 组件中自自定义事件 事件名是abc
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="app">
    <Father></Father>
</div>

<template id="father">
    <div>
        <h3>Fahter组件---->{{ fatherData }}</h3>
        <!--<Son :title="fatherData"></Son>-->

        <!--没有传递数据-->
        <Son></Son>
    </div>
</template>

<template id="son">
    <div>
        <h3>Son组件---->{{ title }}</h3>
    </div>
</template>

<script src="../js/vue-development.js"></script>
<script>
    let Son = {
        template:"#son",
        /*props:{
            title:String
        }*/
        props:{
            title:{
                type:String,
                // required:true, // 要求父必须传递传递
                default:"这是一个默认值"
            }
        }
    }

    let Father = {
        template:"#father",
        data(){ return { fatherData:"Father组件中的数据" } },
        components: {
            Son
        }
    }

    let vm = new Vue({
        el:"#app",
        components:{
            Father
        }
    });
</script>
</body>
</html>

子传父:

$emit表示触发一个自定义事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="app">
    <Father></Father>
</div>

<template id="father">
    <div>
        <h3>Fahter组件---->{{ dataFromSon }}</h3>
        <!-- @hello="f" 组件上面的自定义事件  事件名叫hello -->
        <!-- 当hello事件发生时,就调用f监听器 -->
        <!-- 现在是在father这个模板中,f监听器就需要写在Faher组件对象中 -->
        <!-- 给Son上面绑定了一个自定义事件,在son组件内部就可以触发自定义事件-->
        <!--如何触发hello事件,需要我们写代码来触发-->
        <Son @hello="f"></Son>
    </div>
</template>

<template id="son">
    <div>
        <h3>Son组件---->{{ sonData }}</h3>
        <!--@click="g" vue中绑定天生的点击事件(需要鼠标去点击就会触发天生的点击事件)-->
        <button @click="g">点我</button>
    </div>
</template>

<script src="../js/vue-development.js"></script>
<script>
    let Son = {
        template:"#son",
        methods:{
            g(){
                // this表示Son组件对象
                // $emit表示触发一个自定义事件
                // this.$emit("hello");

                // 在使用$emit触发hello事件时,可以带上数据
                this.$emit("hello",this.sonData)
            }
        },
        data(){ return { sonData:"Son组件中的数据" } },
    }

    let Father = {
        template:"#father",
        data(){ return { dataFromSon:"" } },
        methods:{
            f(msg){ // msg是就是指当hello事件触发时,触发时人家给你传递的数据
                console.log(msg)
                this.dataFromSon = msg;
            }
        },
        components: {
            Son
        }
    }

    let vm = new Vue({
        el:"#app",
        components:{
            Father
        }
    });
</script>
</body>
</html>