最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 组件通信的8种方式,你搞清楚了吗? - 掘金

    正文概述 掘金(东东吖)   2021-10-23   712

    本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励。

    我们都知道vue是组件化开发思想,所以组件通信就是vue的基本功,在讲组件通信之前,我们先来回答几个问题,验证一下你在日常的工作中是否具备组件化开发思想。

    1.父组件如何向子组件传值?

    2.子组件如何向父组件传值?

    3.任意组件之间如何传值?

    4.父组件如何调用子组件里面的方法?

    5.子组件如何调用父组件里面的方法?

    6.任意组件之间如何调用组件里面的方法?

    验证方式:

    ①如果每个问题你都能至少回答出一种方式,说明你在日常的开发工作中,基本具备了组件化开发思想。

    ②如果每个问题你能回答出多种方式,并能说出每种方式的的优缺点,说明你完全具备了组件化开发思想。

    ③如果你部分问题回答不上来,或者模糊不清,那说明你在日常工作中欠缺组件化开发思想。

    我知道有的人一定不服!东东吖,你怎么就能通过这几个问题来判断我是否具备组件化开发思想呢?

    别急,这么说吧,我说的组件化开发思想不是简单的从UI框架上复制代码全部堆在一个文件哦,虽然那也是一个组件,但我并不认为那是真正的组件化开发思想,如果你非要说那就是组件化开发,那打扰了!!!

    组件分为页面级组件、项目公共组件、模块公共组件,甚至可以封装成button级别的组件。

    如果你在日常的开发中具备组件化开发思想,那么你一定会遇到上面6个问题。

    先来看这张图,大家都经常看需求文档,这张图不需要我讲解了吧。

    组件通信的8种方式,你搞清楚了吗? - 掘金

    下面,我将来回答上面的6个问题,也是我自己最常用的方式。

    1.父组件如何向子组件传值?

    父组件通过props向父组件传值。

    前置条件:index代表父组件,Children代表子组件。

    父如何传?

    父组件里面的data定义了一条数据msg,通过熟悉msg传给子组件。=前面的属性是传给子组件的,=后面的值是data里面引用过来的。

    组件通信的8种方式,你搞清楚了吗? - 掘金

    子如何接收?

    子组件通过props接收父组件传过来的值,用法和在data里面一样,在temple里面直接可以{{}},在方法直接用this.属性。

    组件通信的8种方式,你搞清楚了吗? - 掘金

    效果:

    组件通信的8种方式,你搞清楚了吗? - 掘金

    2.子组件如何向父组件传值?

    子组件通过$emit触发自定义事件。

    子如何传?

    子组件通过$emit触发定义在父组件里面的自定义事件,他可以传两个值,第一个是自定义事件名,第二个是要传递的值。

    组件通信的8种方式,你搞清楚了吗? - 掘金

    父如何接收?

    父组件在自定义的事件里面就可以接收到子组件传过来的值,并把他赋值给data里面,渲染到页面上。

    组件通信的8种方式,你搞清楚了吗? - 掘金

    效果:

    组件通信的8种方式,你搞清楚了吗? - 掘金

    3.任意组件传值?

    任意组件传值通过中央事件总线$bus

    前置条件:AA组件叫A组件,BB组件叫B组件,虽然这里是兄弟关系,其实A组件和B组件之间没有任何关系也可以用这种方式。

    定义中央事件总线,挂载到vue实例上。

    组件通信的8种方式,你搞清楚了吗? - 掘金

    A组件如何发送?

    通过this.$bus.$emit发送

    组件通信的8种方式,你搞清楚了吗? - 掘金

    B组件如何接收?

    通过this.$bus.$on接收

    组件通信的8种方式,你搞清楚了吗? - 掘金

    父组件调子组件里面的方法?

    ref:如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例,可以通过实例直接调用组件的方法或访问数据 通过ref绑定组件,通过this.$refs.组件名.方法名,调用子组件里面的方法

    父组件:

    组件通信的8种方式,你搞清楚了吗? - 掘金

    子组件:

    组件通信的8种方式,你搞清楚了吗? - 掘金

    效果:

    组件通信的8种方式,你搞清楚了吗? - 掘金

    子组件调用父组件的方法?

    子传父其实干了两件事:第一:把这个事件踢给父组件,第二:把数据传给父组件。第一个参数对应事件,第二个参数对应数据,第二个参数可以不传。

    子组件:

    组件通信的8种方式,你搞清楚了吗? - 掘金

    父组件:

    组件通信的8种方式,你搞清楚了吗? - 掘金 效果:

    组件通信的8种方式,你搞清楚了吗? - 掘金

    然而,组件通信远远不止这些,上面的6个场景仅仅用到了如下3种方式:

    一:props/$emit(父传子,子传父,子调父)

    二:$bus(任意组件传值,任意组件调方法)

    三:ref/resf(父调子)

    下面我将来讲组件通信剩余的5种方式。

    四:$parent/ $children

    来看看官方介绍,其实你知道了上面的三种方式,这种是不需要掌握的,官方也不推荐用。但是我们还是了解哈呗。

    组件通信的8种方式,你搞清楚了吗? - 掘金 1.父传子?

    我们在子组件里面打印一下$parent

    组件通信的8种方式,你搞清楚了吗? - 掘金

    打开控制台发现这是组件实例,这说明什么,这说明这可以访问组件上的所有属性和方法,我们可以看见我子组件的msg.

    组件通信的8种方式,你搞清楚了吗? - 掘金

    在A组件里使用子组件,触发这个事件,打印的就是A组件实列。

    组件通信的8种方式,你搞清楚了吗? - 掘金

    为了性能优化,建议同学们使用这种方法

    组件通信的8种方式,你搞清楚了吗? - 掘金

    2.子传父? 我们打印父组件里面打印一下$children

    打开控制台

    组件通信的8种方式,你搞清楚了吗? - 掘金

    这刚好和我们在父组件里面使用子组件的顺序一致。

    组件通信的8种方式,你搞清楚了吗? - 掘金

    我们打开其中一个子组件看一下

    组件通信的8种方式,你搞清楚了吗? - 掘金

    比如我们要使用第三个子组件AA里面的属性。

    组件通信的8种方式,你搞清楚了吗? - 掘金

    打开控制台,验证一下。

    组件通信的8种方式,你搞清楚了吗? - 掘金

    五:provide/reject

    这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在其上下游关系成立的时间里始终生效。如果你熟悉 React,这与 React 的上下文特性很相似。

    提示:provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的 property 还是可响应的

    父组件index里面有子组件A,在子组件里面有孙组件c

    在父组件index里面:

    组件通信的8种方式,你搞清楚了吗? - 掘金 在子组件A里面:

    组件通信的8种方式,你搞清楚了吗? - 掘金

    在孙组件C里面:

    组件通信的8种方式,你搞清楚了吗? - 掘金

    页面效果:

    组件通信的8种方式,你搞清楚了吗? - 掘金

    六:Vuex

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

    Vuex各个模块:
    state:用于数据的存储,是store中的唯一数据源
    getters:如vue中的计算属性一样,基于state数据的二次包装,常用于数据的筛选和多个数据的相关性计算
    mutations:类似函数,改变state数据的唯一途径,且不能用于处理异步事件
    actions:类似于mutation,用于提交mutation来改变状态,而不直接变更状态,可以包含任意异步操作
    modules:类似于命名空间,用于项目中将各个模块的状态分开定义和操作,便于维护\

    vueX其实这块的内容比较多,一时半会儿讲不完,也讲不清楚,咱们下次单独讲。这次就先敷衍敷衍你们,谅解一下,哈哈哈哈。

    在main.js里面注册vuex

    组件通信的8种方式,你搞清楚了吗? - 掘金

    在storex下的index里面。

    组件通信的8种方式,你搞清楚了吗? - 掘金

    此时数据处于共享状态,在任意一个页面都可以直接访问:

    组件通信的8种方式,你搞清楚了吗? - 掘金

    七:localStorage/sessionStorage

    本地存储也非常简单,没有什么好讲的,他常搭配vuex管理一些项目公共基础数据,这块我就简单给大家分享几种写法吧,废话少说,直接看图。

    存储字符串:

    写法介绍:

    组件通信的8种方式,你搞清楚了吗? - 掘金

    打开本地存储:

    组件通信的8种方式,你搞清楚了吗? - 掘金

    打开控制台:

    组件通信的8种方式,你搞清楚了吗? - 掘金

    以上方法只能存储字符串,不能存储对象,要存储对象,要用JSON.stringify()进行转换成字符串。 取要用JSON.parse进行还原成对象。

    存储数组对象:

    写法介绍:

    组件通信的8种方式,你搞清楚了吗? - 掘金

    打开本地存储:

    组件通信的8种方式,你搞清楚了吗? - 掘金

    打开控制台:

    组件通信的8种方式,你搞清楚了吗? - 掘金

    八:$attrs/$listeners

    $attrs:包含了父作用域中不作为 prop 被识别 (且获取) 的 attribute 绑定 (class 和 style 除外)。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过 v-bind="$attrs" 传入内部组件——在创建高级别的组件时非常有用。

    父组件

    组件通信的8种方式,你搞清楚了吗? - 掘金

    子组件:

    inheritAttrs:默认情况下父作用域的不被认作 props 的 attribute 绑定 (attribute bindings) 将会“回退”且作为普通的 HTML attribute 应用在子组件的根元素上。当撰写包裹一个目标元素或另一个组件的组件时,这可能不会总是符合预期行为。通过设置 inheritAttrs 到 false,这些默认行为将会被去掉。而通过 (同样是 2.4 新增的) 实例 property $attrs 可以让这些 attribute 生效,且可以通过 v-bind 显性的绑定到非根元素上。

    注意:这个选项不影响 class 和 style 绑定。

    组件通信的8种方式,你搞清楚了吗? - 掘金

    孙组件:

    组件通信的8种方式,你搞清楚了吗? - 掘金

    页面效果:

    组件通信的8种方式,你搞清楚了吗? - 掘金**

    $listeners:包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件——在创建更高层次的组件时非常有用。

    父组件:

    组件通信的8种方式,你搞清楚了吗? - 掘金 子组件:

    组件通信的8种方式,你搞清楚了吗? - 掘金

    孙组件:

    组件通信的8种方式,你搞清楚了吗? - 掘金 打开控制台查看结果:

    组件通信的8种方式,你搞清楚了吗? - 掘金

    总结:

    一:props/$emit(父传子,子传父,子调父)
    二:$bus(任意组件传值,任意组件调方法)
    三:ref/resf(父调子)
    四:$parent/ $children(父子组件)
    五:provide/reject(跨级组件)
    六:Vuex(任意组件)
    七:localStorage/sessionStorage(任意组件)
    八:$attrs/$listeners(跨级组件)

    好了,大家多理解理解,本期文章到此结束。最好自己动手敲一敲效果更好哦!

    笔者往期文章:

    第二期:手把手教你利用XSS攻击体验一次黑客

    第一期:我在工作中是如何使用git的?

    本文因能力有限,有的地方写得可能比较粗糙,如果有疑问可以添加我的微信一起交流学习哦,请备注:掘金


    起源地下载网 » 组件通信的8种方式,你搞清楚了吗? - 掘金

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元