资讯专栏INFORMATION COLUMN

父子组件传值及v-model实现通信

lwx12525 / 2864人阅读

摘要:子组件也属于当前实例。监听钩子函数的场景使用的不多,但是还是要知道的。可以获取到父组件传递的除和外的所有自定义属性。

一. 父组件向子组件传值

创建parent和child组件,并在parent中注册child组件

在父组件调用子组件标签中添加一个自定义属性(msg),

    
    

在子组件的props中将parent中自定义的属性(msg)添加进去,然后就可以像data中定义的属性一样使用

    
    
二. 子组件向父组件传值

在父组件中的子标签中监听该自定义事件(listenChildEvent)并添加一个响应该事件的处理方法(acceptMsgFromChild)

    
    

在子组件中创建一个按钮,给按钮绑定一个点击事件

在响应该点击事件的函数(sendMsgToParent)中使用$emit来触发父组件的自定义事件(listenChildEvent),并传递一个参数

    
    
三. 父子组件使用v-model实现组件通信

我们在使用别人的组件库的时候,经常是通过v-model来控制一个组件显示和隐藏的效果,例如:弹框,下面一步一步的解开v-model的什么面纱
提到v-model首先想到的就是我们对于表单用户数据的双向数据绑定,操作起来很简洁很粗暴,例如:



data () {            
    return {                
        msg: ""            
    }        
}

其实v-model是个语法糖,上面这一段代码和下面这一段代码是一样的效果:


data () {
    return {
        msg: "" 
    }        
}

由此可以看出,v-model="msg"实则是 :value="msg" @input="msg = $event.target.value"的语法糖。这里其实就是监听了表单的input事件,然后修改:value对应的值。除了在输入表单上面可以使用v-model外,在组件上也是可以使用的,这点官网有提到,但是介绍的不是很详细,导致刚接触的小伙伴会有一种云里雾里不知所云的感觉。既然了解了v-model语法糖本质的用法,那么我们就可以这样实现父子组件的双向数据绑定:

以上原理实现方法,写法1:

父组件用法:

子组件写法:

// 点击该按钮触发父子组件的数据同步


// 接收父组件传递的value值
// 注意,这种实现方法,这里只能使用value属性名
props: {            
    value: {                
        type: Boolean,                
        default: false            
    }        
},
methods: {            
    confirm () {                
        // 双向数据绑定父组件:value对应的值 
        // 通过$emit触发父组件input事件,第二个参数为传递给父组件的值,这里传递了一个false值 
        // 可以理解为最上面展示的@input="msg = $event.target.value"这个事件
        // 即触发父组件的input事件,并将传递的值‘false’赋值给msg             
        this.$emit("input", false)            
    }        
}

这种方式实现了父子组件见v-model双向数据绑定的操作,例如你可以试一下实现一个全局弹窗组件的操作,通过v-model控制弹窗的显示隐藏,因为你要在页面内进行某些操作将他显示出来,控制其隐藏的代码是写在组件里面的,当组件隐藏了对应的也要父组件对应的值改变。

以上这种方式实现的父子组件的v-model通信,虽可行,但限制了我们必须popos接收的属性名为value和emit触发的必须为input,这样就容易有冲突,特别是在表单里面。所以,为了更优雅的使用v-model通信而解决冲突的问题,我们可以通过在子组件中使用model选项,下面演示写法2:
父组件写法:

子组件写法:



// model选项用来避免冲突
// prop属性用来指定props属性中的哪个值用来接收父组件v-model传递的值
// 例如这里用props中的show来接收父组件传递的v-model值
// event:为了方便理解,可以简单理解为父组件@input的别名,从而避免冲突
// event的值对应了你emit时要提交的事件名,你可以叫aa,也可以叫bb,但是要命名要有意义哦!!!
model: {            
    prop: "show",            
    event: "changed"        
},
props: {
    // 由于model选项中的prop属性指定了,所以show接收的是父组件v-model传递的值            
    show: {                
        type: Boolean,                
        default: false            
    }        
},        
methods: {            
    confirm () {                
        // 双向数据绑定父组件传递的值
        // 第一个参数,对应model选项的event的值,你可以叫aa,bbb,ccc,起名随你 
        this.$emit("changed", false)            
    }        
}

这种实现父子组件见v-model绑定值的方法,在我们开发中其实是很常用的,特别是你要封装公共组件的时候。
最后,实现双向数据绑定的方式其实还有.sync,这个属性一开始是有的,后来由于被认为或破坏单向数据流被删除了,但最后证明他还是有存在意义的,所以在2.3版本又加回来了。

例如:父组件:



data () {
    return {
        msg: ""
    }
}


props: {            
    oneprop: {                
        type: String,                
        default: "hello world"
    }        
},        
methods: {            
    changeMsg () {                
        // 双向数据流
        this.$emit("update:msg", "helow world")           
    }        
}        

这样,便可以在子组件更新父组件的数据。由于v-model只使用一次,所以当需要双向绑定的值有多个的时候,.sync还是有一定的使用场景的。.sync是下面这种写法的语法糖,旨在简化我们的操作:

掌握了组件的v-model写法,在封装一些公共组件的时候就又轻松一些了吧。
这里再提一下:

m.$emit(event ,[...args])这个api,其主要作用就是用来触发当前实例上的事件。附加参数都会传给监听器回调。子组件也属于当前实例。第一个参数:要触发的事件名称。后续的参数可选:即作为参数传递给要触发的事件。文档

监听当前实例上的自定义事件,事件可以有$emit触发,也能通过hook监听到钩子函数

vm.$on( event, callback ):一直监听;文档

vm.$once( event, callback ):监听一次;文档

vm.$off( [event, callback] ):移除监听;文档
监听$emit触发的自定义事件,上面已经有过用法了,监听钩子函数,在上面的定时器那块也有演示到。监听钩子函数的场景使用的不多,但是还是要知道的。

vm.$attrs:可以获取到父组件传递的除class和style外的所有自定义属性。

vm.$listeners:可以获取到父组件传递的所有自定义事件

例如:父组件:

就可以在子组件中获取父组件传递的属性和事件,而不用在props中定义。子组件简单演示如下:

created() {            
    const msg = this.$attrs.msg; // 获取父组件传递的msg
    this.$listeners.confirm && this.$listeners.confirm(); //若组件传递事件confirm则执行
},

这在我们写一些高级组件时候,会有用到的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/104263.html

相关文章

  • Vue父子组件通信的三两事(prop、emit)

    摘要:的单向数据传递直接作为一个本地变量下面是我的子组件这是父组件给我传的数据运行结果如下图子组件向父组件传递数据基本使用子组件向父组件传递数据,不能像上面一样实时的传递数据,必须通过事件触发。 组件是Vue核心功能之一,合理的组件化,可以减少我们代码的冗余,提高项目的可维护性。下面,我将由浅入深的讲Vue的组件在讲之前,首先我们先了解一下组件的命名。 HTML是对特征名不敏感的语言,他...

    darcrand 评论0 收藏0
  • 巧妙运用v-model实现父子组件传值

    摘要:如何巧妙利用实现父子组件传值通常子组件某个变量更新,并需要告知父组件时,需要子组件触发事件并父组件监听该事件。但是熟悉上面的实现原理后,我们可以巧妙地运用这一原理在内部使用不同的属性为不同的输入元素并抛出不同的事件。 v-model介绍 熟悉Vue的小伙伴们都知道 v-model 是Vue的一个很大的特色,可以实现双向数据绑定。但本质上呢,它不过是语法糖,它负责监听用户的输入事件以更新...

    张金宝 评论0 收藏0
  • 微信小程序之购物车和父子组件值及calc的注意事项

    摘要:在做微信小程序时,觉得小组里对购物车的实现不是很完美,就自己尝试的写了下,然后用到了父子组件传值,父子组件传值的话,和框架上是非常相似的,以及这个函数,有个注意点,自己不怎么用,一时间有差点忘了,这里记录下效果图子组件实现要实现图中删除的效 在做微信小程序时,觉得小组里对购物车的实现不是很完美,就自己尝试的写了下,然后用到了父子组件传值,父子组件传值的话,和vue框架上是非常相似的,以...

    helloworldcoding 评论0 收藏0
  • vue总结系列--组件

    摘要:触发事件可以携带数据,这些数据被用于传递给绑定了事件的其它组件的回调函数上,进而被传递给其它组件。父组件可以在回调函数里做任何事情,颇有灵活性。一般情况下,父组件会在回调函数中更新自己的状态数据。 上一篇博文梳理了vue的数据驱动和响应式相关的特性,这一篇博文就来梳理vue的一个很重要的特性,组件化。自定义组件之于vue,其意义不亚于函数之于C,java之类的编程语言。函数是计算机科学...

    cuieney 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<