【Vue】自定义事件实现组件之间的通信(案例讲解)

一、前言

    这是部分哔哩哔哩上跟着一个博主【遇见狂神说】学习的,当然自己也是才开始学习的vue,在学到这个Vue的自定义事件的时候,虽然知识点很绕,但是在理解后又觉得很意思,觉得Vue真的很强大。这里博主将自己学习到的知识以博客的内容进行记录,采用大白话来描述吧,希望对大家有所帮助!

二、Vue的自定义事件

1、采用的语法:

this.$emit(自定义事件名,参数)

2、案例讲解

这里我们就通过一个点击事件的案例来理解如何实现组件之间的通信。

①:问题引出

这是一个源码,我们的案例会从这个源码讲起走

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


<div id="app">
    <todo>
        <todo-title slot="todo-title" :title="title"></todo-title>
        <todo-items slot="todo-items" v-for="item in todoItems" :item="item"></todo-items>
    </todo>
</div>
<!--导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
    Vue.component("todo",{
        template:
        '<div>\
         <slot name="todo-title"></slot>\
            <ul>\
            <slot name="todo-items"></slot>\
            </ul>\
         </div>'
    });
    Vue.component("todo-title",{
        props:['title'],
        template: '<div>{{title}}</div>'
    });
    Vue.component("todo-items",{
        props:['item','index'],
        //只能绑定当前组件的方法
        template: '<li>{{index}}---{{item}}<button @click="Remove">删除</button></li>',
        methods: {
            Remove:function (index) {
                this.$emit('remove',index);
            }
        }
    });
    var vm=new Vue({
        el:"#app",
        data:{
            title:"书籍列表",
            todoItems:['Java','C++','Php']
        }
    });
</script>
</body>
</html>

效果:

68daa4d4583b491ebb353508db79bdaf.png

    这个代码的意思是我们的这些数据都是通过todo-items组件显示的,但是我们的数据data在Vue对象里面,我们现在想要做的是,通过todo-items组件里面的点击事件,删除Vue对象中的数据,在这之前我们要知道组件里面的事件只能绑定当前组件的方法,所以要直接通过组件调用Vue对象中的方法,删除对应数组中的数据是行不通的,这时就需要使用我们的自定义事件了。

②:思路梳理

f7ed9f5ae4f244328e76f90ccfb101f1.png

   如图所示,Vue是有 双向绑定的特点的,Vue实例可以与前端进行绑定,而todo-items组件可以根据我们自定义事件与前端绑定,这样一来前端作为中间键,就可以将参数通过组件传递到Vue实例,这样一来就实现了组件间的通信。

③:代码实现

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


<div id="app">
    <todo>
        <todo-title slot="todo-title" :title="title"></todo-title>
        <todo-items slot="todo-items" v-for="(item,index) in todoItems"
                    :item="item" :index="index" v-on:remove="RemoveItem(index)"></todo-items>
    </todo>
</div>
<!--导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
    Vue.component("todo",{
        template:
        '<div>\
         <slot name="todo-title"></slot>\
            <ul>\
            <slot name="todo-items"></slot>\
            </ul>\
         </div>'
    });
    Vue.component("todo-title",{
        props:['title'],
        template: '<div>{{title}}</div>'
    });
    Vue.component("todo-items",{
        props:['item','index'],
        //只能绑定当前组件的方法
        template: '<li>{{item}}<button @click="Remove">删除</button></li>',
        methods: {
            Remove:function (index) {
                this.$emit('remove',index);
            }
        }
    });
    var vm=new Vue({
        el:"#app",
        data:{
            title:"书籍列表",
            todoItems:['Java','C++','Php']
        },
        methods:{
            RemoveItem:function (index) {
                this.todoItems.splice(index,1);
            }
        }
    });
</script>
</body>
</html>

ps:这段代码中运用了之前讲解过的v-for、v-on、v-bind等事件,如果是小白阅读起来可能不是很容易,可以先看看博主之前的一些vue相关的基础知识,再来理解。

效果:

17b478ee774f42eca2b2fb9cd1a7ab88.png

点击“Java删除”后效果:

04e3e4435a5c4af6b0f7459810395a89.png

其它情况一次类推。

三、总结

   到此来个总结吧,我们都是知道Vue是组件化开发,像这样的自定义事件在组件中的通信肯定是会经常遇到的,到后期如果博主在做项目中遇到相同的情况,到时候会结合项目做相关案例。最后,如果这篇博客对屏幕前的小伙伴有所帮助,不要忘点赞、评论、收藏支持一波哦~

 

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Vue实现自定义组件的双向绑定(v-model),你可以使用`model`选项。下面是一个简单的例子,演示如何创建一个自定义组件并将其包装在v-model中使用: ```html <!-- 父组件 --> <template> <div> <custom-input v-model="message"></custom-input> <p>Message: {{ message }}</p> </div> </template> <script> import CustomInput from './CustomInput.vue'; export default { components: { CustomInput }, data() { return { message: '' } } } </script> ``` ```html <!-- CustomInput.vue --> <template> <input :value="value" @input="$emit('input', $event.target.value)"> </template> <script> export default { props: ['value'] } </script> ``` 在上面的例子中,父组件通过`v-model="message"`将`message`作为属性传递给子组件`CustomInput`。子组件接收该属性作为`value`,并在输入事件触发时通过`$emit('input', $event.target.value)`将新的值传递回父组件。 这样,当用户在子组件中输入文本时,父组件的`message`属性会自动更新,实现了双向绑定。 请注意,使用`v-model`时,子组件内部的属性名必须为`value`,而不是其他名字。这是因为`v-model`默认会使用`value`作为属性名来传递值,并使用`input`事件来更新值。如果你想要使用不同的属性名,可以在子组件中使用`model`选项来自定义。 ```html <!-- CustomInput.vue --> <template> <input :value="internalValue" @input="updateValue($event.target.value)"> </template> <script> export default { model: { prop: 'customValue', event: 'customInput' }, props: { customValue: String }, computed: { internalValue: { get() { return this.customValue; }, set(newValue) { this.$emit('customInput', newValue); } } }, methods: { updateValue(value) { this.internalValue = value; } } } </script> ``` 通过在子组件中使用`model`选项,你可以自定义属性名和事件名,以实现更灵活的双向绑定。在上面的例子中,父组件可以这样使用: ```html <custom-input v-model="message"></custom-input> ``` 这会将父组件的`message`属性传递给子组件的`customValue`属性,并使用`customInput`事件来更新值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值