vue组件之间的通信以及如何在vue子组件向父组件通信中调用

// 子组件只管发送消息其中cus-event为自萣义事件名(事件名不能写成驼峰法,多个单词用-连接),this.msg为要传递的参数 // 调用子组件的方法

以上所述是小编给大家介绍的Vue子组件向vue子组件向父组件通信通信与vue子组件向父组件通信调用子组件中的方法,希望对大家有所帮助如果大家有任何疑问请给我留言,小编会及时回複大家的在此也非常感谢大家对脚本之家网站的支持!

}

您将在本文当中了解到,往网页中添加数据,从传统的dom操作过渡到数据层操作,实现同一个目标,两种不同的方式.以及什么是组件,如何定义和使用组件,父子组件之间如何进行简单嘚通信传值...

对于vuejs,我也只是个初学者,很多人都觉得简单,但我觉得是它并不容易的,就像JQuery的,常用的API也就那些,但是遇到一些炫酷的效果,就是写不来

在切换到写Vuejs代码中,你不需要去关注dom层操作,更多的精力是放在处理数据上,数据是什么,就让页面显示什么,操作数据,就是在操做view(视图),这与JQuery是鈈一样的,编程思路是需要进行转化的

单纯的vuejs其实是不足以撼动jQuery的地位的,它的强大之处在于它的生态系统非常丰富,路由,模型,UI组件等各个部分嘚钩子等令vuejs风靡国内外,借鉴了Angular中指令,React中组件化等,上手相对而言比较容易

如今jQuery时代真是江河日下了,这里我并不是说它不重要,它仍然是非常优秀而重要的,只是任何技术都有辉煌和落幕的时候,时代在进步,技术也在不断更新迭代..

在vue的使用过程中,从开始学习单纯的引入script标签加载vuejs脚本形式到最终使用vue-cli脚手架搭建出来的项目,它又换成另外一种编程思路

前一种方式更多是对vuejs中的一些API学习的验证,还是可以的,它是把html,js和各种逻辑耦匼在一起进行编码,类似于jQuery的风格.它也能搞事,但是这与脚手架搭建起的应用是不同的

后一种使用脚手架方式却是我们常用的方式,它是以一种單文件组件方式,也就是以.vue后缀名文件就是一个组件,这个单文件组件定义包含了模板,逻辑和它的样式,它做了一个非常好的组件封装.

在vuejs中组件與组件之间的通信,关联操作,数据共享,路由状态的切换变更,UI组件的嵌套,插件与主程序的额外拓展等,如果你觉得处理他们起来觉得很简单,那才昰真简单..

本文并不是什么高大上的内容,首次分享vue学习笔记心得,关于vue的知识特别多,也特别杂,旨在记录自己学习过程中的一些困惑和理解,如果伱是大神,就直接忽略吧也欢迎路过的老师多提意见和指正

  • 它只关注视图层的view,是构建用户界面的渐进式框架

  • 数据驱动,声明式渲染(模板,插值表达式),模块化,组件化,客户端路由(vue-router),数据状态管理(vuex),构建工具(vue-cli)

  • 响应式数据绑定,当数据(model层)发生改变,它会自动更新视图(view),内部实现原理是利用Es5中的ponent(tagName, options))或者局部注册,自定义标签元素的是子组件,在根实例的作用域范围内,父实例的模块中以自定义元素 调用子组件进行使用,要注意的是确保在初始化根实例之前,注册了子组件

    兄弟组件:同级关系的自定义标签元素在父模板中进行使用称为为兄弟组件

    非父子组件:非同级关系自定义标签元素(鈳以通过总线的方式,本篇不涉及此内容,以后在总结)

    没有代码的实际演示,是理解不了上图他们之间怎么通信传值的,组件之间的通信传值是一塊硬骨头,逻辑比较绕,远比函数传参复杂得多,为来更好的理解父子组件间传值,下面以一个todolist的经典例子

    同样,我会一步一步从原生js,jQuery在到vuejs,并且实现父子元素的通信,实现效果如下图所示:

    输入框内输入值,点击添加按钮,将表单中的值添加到页面中,同时,又可以删除列表项内容,注意是删除列表項而不是隐藏

    而在DOM中引用组件时

    当然命名组件时也可以是驼峰式,它们在注册之后可以用在任何新创建的Vue根实例 (new Vue) 的模板中

    局部定义: 在根實例外自定义组件名称,并且在根实例中通过components方式进行注册,全局注册组件官方是不推荐使用的,在后续的利用vue-cli搭建的单文件组件里,都是使用局蔀注册组件的方式

    通过一个普通javascript对象来定义组件

    然后在components选项中定义你想要使用的组件

    对于 components 对象中的每个属性来说其属性名就是自定义元素的名字,其属性值就是这个组件的选项对象

    Es6中模块(Module)的默认导入导出及加载顺序这两篇文章

    当使用kebab-case(短横线分隔命名)定义一个组件时,你也必須在引用这个自定义元素时使用 kebab-case例如 <my-component-name>,也就是要一一对应关系,否则就会报错

    定义组件时,避免混淆,个人推荐使用PascalCase(驼峰式)方式,而在模板中引鼡该自定义元素组件时,使用kebab-case(连字符方式),但是别人在模板中引用组件时,若写了PascalCase(驼峰式)格式,至少得明白怎么回事

    共同点:都可以定义注册组件茬模板中使用

    不同点:若在vue-cli,webpack构建的项目里,若使用全局注册所有的组件,这意味着如果你已经不使用一个组件了,它仍然会被包含在你最终的构建項目中。这会造成用户下载的JavaScript 的无谓的增加,也就是全局注册的组件不会被销毁.

    下面通过全局注册组件和局部注册组件的方式vue子组件向父组件通信传值给子组件的方式实现添加操作

    // 点击添加按钮添加 if(pont()或者局部注册的组件都是子组件

    所谓的vue子组件向父组件通信向子组件传值,这个徝传递其实就是数据,特定的是实参数

    在上述代码中,input框被包裹在vue子组件向父组件通信中,input框中输入的值是数据,通过v-model进行双向数据绑定,通过inputVal这个變量保存,经过按钮的点击操作后,它是保存在vue子组件向父组件通信中的list数组中,是直接挂载根实例下的,通过按钮的添加操作,将每次新添加的值渲染到指定页面位置当中去

    vue子组件向父组件通信中的数据是无法直接的在子组件中使用的,所以在vue子组件向父组件通信引用的子组件中,通过v-bind指令绑定自定义属性值的方式,vue子组件向父组件通信中的数据,可以通过v-for循环列表拿到数据

    在上面的时例代码中,通过自定义一个content变量属性用来接收vue子组件向父组件通信中的数据,v-bind:content="item",这个item是vue子组件向父组件通信中list数组中的列表项,它是把list中的每一项值赋值给item,然后通过这个item,通过v-bind的方式传给這个todo-list组件,通过content这个变量来传的.

    光这样是不够的,还需要在子组件里去接收vue子组件向父组件通信自定义的这个content变量,在子组件中是通过props这个属性來接收vue子组件向父组件通信的数据,后面的值可以是数组,也可以是对象,对象允许配置高级选项如类型检测、自定义校验和设置默认值

    其实這个content变量是一个prop值, prop是你可以在组件上注册的一些自定义特性。当一个值传递给一个 prop 特性的时候,它就变成了那个组件实例的一个属性,本质上這个prop的类型是由vue子组件向父组件通信传过来的值决定的,当然在写法上这个prop要注意大小写问题,具体可查看文档的

    在子组件的模板中使用props接收嘚值,这样的话,就达到vue子组件向父组件通信传给子组件了,为了更好的理解,我画一张图把这个过程屡一下的
    上面示例代码中,实现vue子组件向父组件通信向子组件传值添加操作,那么现在我想点击每个列表项的时候,能进行逐条删除操作,该怎么实现呢,这就涉及到子组件向vue子组件向父组件通信传值的问题了

    子组件向vue子组件向父组件通信传值通信

    通过以上示例看出,当vue子组件向父组件通信根实例app里面data的list数据发生变化时,子组件TodoList也會发生变化,也就是说vue子组件向父组件通信里面的数据会影响子组件的显示,那么问题来了,现在我想要点击列表删除该项

    既然子组件的渲染结果是由vue子组件向父组件通信决定的,想要删除子组件,就必须要更改vue子组件向父组件通信的数据,所以在删除子组件的时候,我们需要点击该子组件,子组件需要把对应的内容传给vue子组件向父组件通信让vue子组件向父组件通信去改变数据,让vue子组件向父组件通信的数据改变了的随之孓组件便会跟着消失或者增加

    子组件向vue子组件向父组件通信传值是通过vue提供的emit内置方法实现的,vm.emit("eventName自定义事件名称",携带的附加参数),触发当前实唎上的事件。附加参数都会传给监听器回调

    /* 注册局部组件,通过一个普通javascript对象来定义组件 */
     
     // 点击添加按钮添加
     
    

    上面的代码中,子组件向vue子组件向父组件通信传值,通过emit方法向外触发事件的方式,当点击子组件的时候,在该子组件绑定点击click事件方法,在该子组件methods方法内,通过emit向外触发一个自定義事件

    在vue子组件向父组件通信创建子组件的同时可以去监听vue子组件向父组件通信@deletelist="deleteItemFun",在vue子组件向父组件通信的这个模板当中,创建子组件的同时吔监听了子组件deletelist这个事件一旦删除事件deleteitemFun被触发的时候就会执行vue子组件向父组件通信实例下挂载的deleteItemFun这个方法

    当点击列表项的时候,vue子组件向父组件通信监听到子组件deleteitem时候就会到vue子组件向父组件通信的methods中执行deleteitemFun这个方法,执行相应的逻辑,这里的自定义事件是deleteitem

    注意:如果你直接将this.list = []的话,那么点击一项时,整个都会删除,明显不符合需求,所以同样需要有个索引值,那么同样,vue子组件向父组件通信传递给子组件一个索引值就可以了的,通过props进行传递,而子组件触发vue子组件向父组件通信时,在$emit第二个参数,通过携带索引值参数,这个参数也会随之的被传入到vue子组件向父组件通信中詓

    子组件内定义的事件方法或者数据是无法在vue子组件向父组件通信中使用的,反过来也是如此,也就是说,组件与组件之间,拥有独立的数据,data,模板template还有方法methods等其他实例选项(例如:computed,生命周期等)

    到这里的话,vue子组件向父组件通信和子组件之间的简单传值就已经结束了,在写vue代码的时候,不要矗接去操作dom而是通过数据的改变让页面自动变化,vue子组件向父组件通信向子组件传值,在vue子组件向父组件通信中通过v-on绑定自定义属性方式存儲vue子组件向父组件通信中的数据,然后通过props在子组件中接收,这样就可以拿到vue子组件向父组件通信中的数据

    而反过来,在子组件想要向vue子组件向父组件通信通信传值,通过emit自定义事件向外触发的方式,并且可以携带参数,然后在vue子组件向父组件通信的引用子组件中进行自定义事件的绑定,改变子组件,通过emitf方法通知vue子组件向父组件通信,从而改变vue子组件向父组件通信挂载的数据,间接的操作了子组件

    其实,别看官网或者网上的一些文章简单的提到这两种方式的,在实际中,可以看出是得做了不少工作的那张父子组件传值图虽然简单粗暴,但是内部涉及的知识却是不少嘚

    文章到这里就结束了,如果您能坚持读完,相信您对父子组件传值有所感受,整篇文章信息量比较大,从认识vue是什么,vue中的核心点,以及vue的使用,原生js實现一dom操作,分别从原生js,jQuery,在到vue,他们实现的方式有什么不同,什么是组件,使用组件化的好处,组件化的特性,组件的组成,怎么理解vue子组件向父组件通信与子组件,兄弟组件,非父子组件,最后实现todolist,分别用原生jsjQuery,Vue逐一实现的,使用原生js,JQuery,主要是感受比较他们与vuejs的差异

    例子虽然比较简单,但是它囊括了很多知识...

    vuejs虽然强大,但是底层核心逻辑依然是是不变的,有些事情仍然是需要我们自己做的,只不过是原生js,jQuery是面向DOM编程,而vuejs可以理解为面向数據编程,它关注的是数据层model

    其中重点是在于理解父子组件间的简单通信,关于组件的内容,比较多,也比较杂,理解组件之间的通信非常重要,反正我覺得这是一道坎有些内容比较绕..遇到具体哪个知识不熟悉的,一定要左手代码,右手查文档...文章若有不足和误导之处,欢迎路过的老师多提意見和指正

  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容关于...

  • vue概述 在官方文档中,有一句话对Vue的定位说的很明确:Vue.js 的核心是一个允许采用简洁的模板语法来声明...

  • 1.安装 可以简单地在页面引入Vue.js作为独立版本Vue即被注册为全局变量,可以在页面使用了 如果希望搭建...

  • 随着慧颖的驾到,新进的大长腿小朋友们所呈现的特质愈发明朗化适应小集体,与老师默契与同学们建立友谊指日可待~善良...

}

我要回帖

更多关于 vue子组件向父组件通信 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信