Vue学习——组件、组件之间数据的传送

86 篇文章 0 订阅
67 篇文章 0 订阅

组件基础:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>组件</title>
    <script src="../js/vue.js"></script>
</head>

<body>
    <div id="app">
        <hello></hello>
        <br>
        <hi></hi>
        <br>
        <str></str>
    </div>
    <div id="box">
        <hello></hello>
    </div>
    <script>
        // 定义组件
        Vue.component("hello", {
            // 模板:组件内容

            data() {
                return {
                    msg: "我是子组件"
                }
            },
            // 使用模板字符串(``)可以格式化语句
            // 模板字符串必须要标签括起来,内容写在同一个根元素里面
            template: `
            <div>
                hello!我是一个新来的<span>{{msg}}</span>
            </div>`
        });
        // 全局组件
        Vue.component("hi", {
            // Vue里面有的,这里面也可以有
            // 模板:组件内容
            // 使用模板字符串(``)可以格式化语句
            data() {
                return {
                    msg: 12306
                }
            },
            methods: {
                fn() {
                    console.log(12306);
                }
            },
            template: `
            <div>
                <p @click="fn">{{msg}}</p>
            </div>`
        })
        let vm = new Vue({
            el: "#app",
            // 局部组件
            components: {
                "str": {
                    template: "<div>我是局部组件</div>"
                }
            }
        })
    </script>
</body>

</html>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.js"></script>
</head>

<body>
    <div id="app">
        <hi></hi>
    </div>
    <script>

        Vue.component("hi", {
            data() {
                return {
                    sum: 10
                }
            },
            methods: {
                fn() {
                    this.sum--;
                }
            },
            template: `<div><button @click="fn">还有{{sum}}秒</button></div>`,
        })
        let vm = new Vue({
            el: "#app",
        })
    </script>
</body>

</html>

注意事项:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>组件注意事项</title>
    <script src="../js/vue.js"></script>
</head>

<body>
    <div id="app">

        <h></h>
        <!-- 在普通标签就要用斜杠 -->
        <hello-world></hello-world>
    </div>
    <script>
        // 用驼峰法命名时
        Vue.component("helloWorld", {
            template: "<h1>中国欢迎你</h1>"
        });
        Vue.component("h", {
            // <HelloWorld></HelloWorld>在子组件可以照原样写也可以用斜杠法写
            template: "<div>你好啊,英雄<helloWorld></helloWorld><span>{{msg}}</span></div>",
            data() {
                return {
                    sum: 0
                }
            },
            methods: {
                fn() {

                }
            }
        })


        let vm = new Vue({

            el: "#app"
        })
    </script>
</body>

</html>

组件之间传值:

父组件传子组件:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>组件传值——父向子</title>
    <script src="../js/vue.js"></script>
</head>

<body>
    <div id="app">
        <!-- :msg的msg是属性,"msg"的msg是变量,这里的msg是父组件data中的msg -->
        <hello :msg="msg"></hello>
    </div>
    <script>
        // 子组件的内容,放在外面写
        var hello = {
            // template不能忘记
            // props是属性,这"msg"的msg是:msg的msg
            props: ["msg"],
            template: `<div>
            <h1>你好,中国,{{msg}}</h1>
            </div>`
        }
        let vm = new Vue({
            el: "#app",
            data: {
                msg: "我是父组件的数据"
            },
            components: {
                // "hello": helloText,
                // 若组件名跟字符串模板名一样,可这样写
                hello
            }
        })
    </script>

</body>

</html>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>父传子</title>
    <script src="../js/vue.js"></script>
</head>

<body>
    <div id="app">
        <!-- <hello :title="ptitle" :msg="pmsg"></hello> -->
        <txt :title="ptitle" :msg="pmsg"></txt>
    </div>


    <script>
        // Vue.component("hello", {
        //     props: ["title", "msg"],
        //     data() {
        //         return {
        //             cmsg: "我是子组件的数据"
        //         }
        //     },
        //     template: `
        //     <div>
        //         {{cmsg+"-"+title+"-"+msg}}

        //     </div>`
        // })
        var txt = {
            props: ["title", "msg"],
            data() {
                return {
                    cmsg: "我是子组件的数据"
                }
            },
            template: `
            <div>
                {{cmsg+"-"+title+"-"+msg}}
                
            </div>`
        };
        let vm = new Vue({
            el: "#app",
            data: {
                pmsg: "我是父组件的数据",
                ptitle: "父组件"
            },
            components: {
                txt
            }
        })
    </script>

</body>

</html>

子组件传给父组件:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>子传父</title>
    <script src="../js/vue.js"></script>
</head>

<body>
    <div id="app">
        <!-- 这里的形参只能放$event -->
        <hello @send="send($event)"></hello>
    </div>
    <script>
        Vue.component("hello", {
            data() {
                return {
                    msg: "我是子组件的数据",
                    num: 2021
                }
            },
            // $emit('send',[msg,num])传的参可以是单个(msg),也可以是一个数组([msg,num])
            template: `
            <div>
            {{msg}}<button @click="$emit('send',[msg,num])">传送数据</button>
            </div>
            `
        })
        let vm = new Vue({
            el: "#app",
            data: {
                msg: "我的是父组件的数据"
            },
            methods: {
                send(data) {
                    this.msg = data[0];
                    this.num = data[1];
                    console.log(this.msg);
                    console.log(this.num);

                }
            }
        })
    </script>
</body>

</html>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>子传父</title>
    <script src="../js/vue.js"></script>
</head>

<body>
    <div id="app">
        <!-- @send是$emit()的第一个参数,sended()是父组件的方法(函数),$event是固定不能改的,是传送的数据-->
        <hi @send="sended($event)"></hi>
        <p>{{msg}}</p>
        <p>{{num}}</p>

    </div>
    <script>
        Vue.component("hi", {
            data() {
                return {
                    cmsg: "我是子组件的数据",
                    cnum: 20
                }
            },
            // $emit('send',[cmsg,num])里面的第一个参数(send)是自定义事件的名称,第二个参数是传送的数据,可以是单个数据,也可以是多个数据,以数组[]的形式传送
            template: `
            <div>
                {{cmsg}}{{cnum}}
                <br>
                <button @click="$emit('send',[cmsg,cnum])">点我传送数据</button>
            </div>`
        })
        let vm = new Vue({
            el: "#app",
            data: {
                msg: "",
                num: ""
            },
            methods: {
                // data传过来的是一个数组形式,所以使用下标来获取值
                sended(data) {
                    // console.log(data);
                    this.msg = data[0];
                    this.num = data[1]
                    console.log(this.msg);
                    console.log(this.num);
                }
            },

        })
    </script>
</body>

</html>

同级组件之间:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>同级组件互传</title>
    <script src="../js/vue.js"></script>
</head>

<body>
    <div id="app">
        <hi></hi>
        <hello></hello>
    </div>
    <script>
        // 提供事件中心
        let hub = new Vue();
        // 传递方
        Vue.component("hi", {
            data() {
                return {
                    sendData: "我是传送的数据"
                }
            },
            template: `
            <div>
            <button @click="send">传送数据</button>
                </div>`,
            methods: {
                send() {
                    // 传送的事件:toHello
                    hub.$emit("toHello", this.sendData)
                }
            }
        });
        // 接收方
        Vue.component("hello", {
            data() {
                return {
                    msg: ""
                }
            },
            template: `<div>{{msg}}</div>`,
            // 自动执行(生命周期的已挂载阶段)钩子函数
            mounted() {
                console.log(123456);
                // 接收的事件:toHello
                hub.$on("toHello", (v) => {
                    // console.log("是hi传过来的数据" + v);
                    this.msg = v;
                })
            }
        });
        let vm = new Vue({
            el: "#app"
        });
    </script>
</body>

</html>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>兄弟互传</title>
    <script src="../js/vue.js"></script>
</head>

<body>
    <div id="app">
        <send></send>
        <br>
        <get></get>

    </div>
    <script>
        // 兄弟组件之间的传送必须要有一个事件中心(hub)
        var hub = new Vue();
        // 传递方
        Vue.component("send", {
            data() {
                return {
                    smsg: "我是传送数据的",
                    sendMsg: "干饭啦干饭啦"
                }
            },
            template: `
            <div>
                {{smsg}}<br>
                <button @click="sendData">发送</button>
            </div>`,
            // 传送方的hub.$emit()是写在methods里面的
            methods: {
                sendData() {
                    // 传递数据方方法里要有这个才行hub.$emit()
                    // hub.$emit()的第一个参数是传送的事件名称,第二个参数是传送的数据
                    hub.$emit("send-data", this.sendMsg);
                }
            }
        })
        // 接收方
        Vue.component("get", {
            data() {
                return {
                    gmsg: "我是接收数据的",
                    getMsg: ""
                }
            },
            // mounted(钩子函数)是Vue生命周期中的已挂载阶段,是自动执行的
            // 接收方的hub.$emit()是写在mounted() {}里面的
            mounted() {
                // hub.$on()的第一个参数是传送的事件名称,与传送方的事件名一致,第二个参数是个方法
                // data是传送过来的数据
                hub.$on("send-data", (data) => {
                    // console.log(data);
                    this.getMsg = data;
                })
            },
            template: `<div>{{gmsg}}<br>接收到的数据为:{{getMsg}}</div>`,

        })



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

</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值