Vue 组件通信 - 中间人模式

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue组件通信 - 中间人模式

目录

中间人模式

兄弟组件间通信

设置页面元素和事件

封装组件

组件间通信

增加详情按钮

增加监听事件

子组件触发

详情组件

封装详情组件

总结


中间人模式

兄弟组件间通信

数据来源于某小说网站,可以根据这个格式自行设置假数据。

点击按钮获取数据,示例如下:

 

设置页面元素和事件

设置按钮和渲染列表及按钮点击事件后,进行渲染列表。

示例如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .item img {
            width: 60px;
        }
    </style>
    <script src="../lib/vue.js"></script>
</head>
<body>
<div id="box">
    <button @click="handleAjax">点击</button>
    <data-item v-for="item in datalist" :key="item.book_id" :mydata="item"></data-item>
</div>
<script>
    let vm = new Vue({
        el:"#box",
        data: {
            datalist: []
        },
        methods: {
            handleAjax() {
                fetch("./json/ebook.json")
                .then(res => res.json())
                .then(res => {
                    console.log(res.data.data)
                    this.datalist = res.data.data
                })
            }
        }
    })
</script>
</body>
</html>

 

封装组件

对列表渲染内容进行封装为组件,示例如下:

Vue.component("dataItem", {
    props: ["mydata"],
    template:`<div class="item">
    <img :src="mydata.cover" />
    {{mydata.title}}
    </div>`
})

效果:

点击后,渲染列表,效果如下:

 

组件间通信

为了展示组件间如何通信,增加原有列表需求,可以互动查看小说详情简介。

增加详情按钮

在原有列表组件中增加详情按钮和点击按钮触发的事件。

在事件内打印获取到的该小说简介内容。

示例如下:

Vue.component("dataItem", {
    props: ["mydata"],
    template:`<div class="item">
    <img :src="mydata.cover" />
    {{mydata.title}} <button @click="handleDetail">详情</button>
    </div>`,
    methods : {
        handleDetail() {
            console.log(this.mydata.info)
        }
    }
})

 

增加监听事件

给子组件增加监听事件,这样就可以在子组件中触发父组件的事件,进行通信。

父组件增加触发事件处理,在父组件中赋值全局变量。

示例如下:

<div id="box">
    <button @click="handleAjax">点击</button>
    <data-item v-for="item in datalist" :key="item.book_id" :mydata="item" @event="handleEvent"></data-item>
</div>
<script>
    Vue.component("dataItem", {
        props: ["mydata"],
        template:`<div class="item">
        <img :src="mydata.cover" />
        {{mydata.title}} <button @click="handleDetail">详情</button>
        </div>`,
        methods : {
            handleDetail() {
                console.log(this.mydata.info)
            }
        }
    })
    let vm = new Vue({
        el:"#box",
        data: {
            datalist: [],
            info : ""
        },
        methods: {
            handleAjax() {
                fetch("./json/ebook.json")
                .then(res => res.json())
                .then(res => {
                    console.log(res.data.data)
                    this.datalist = res.data.data
                })
            },
            handleEvent(info) {
                console.log("父组件定义", info)
                this.info = info
            }
        }
    })
</script>

 

子组件触发

把详情内容传递给父组件-通过父监听事件。

示例如下:

Vue.component("dataItem", {
    props: ["mydata"],
    template:`<div class="item">
    <img :src="mydata.cover" />
    {{mydata.title}} <button @click="handleDetail">详情</button>
    </div>`,
    methods : {
        handleDetail() {
            this.$emit("event", this.mydata.info)
        }
    }
})

 

详情组件

设置详情组件渲染

示例如下:

<div id="box">
    <button @click="handleAjax">点击</button>
    <data-item v-for="item in datalist" :key="item.book_id" :mydata="item" @event="handleEvent"></data-item>

    <data-info :info="info"></data-info>
</div>

封装详情组件

示例如下:

Vue.component("dataInfo", {
    props: ["info"],
    template:`<div class="info">
    {{info}}
    </div>`
})

效果:

总结

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue组件通信 - 中间人模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JSON_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值