美文网首页让前端飞Java 核心技术Vue.js
Vue数据传递--教你特殊的实现技巧

Vue数据传递--教你特殊的实现技巧

作者: a333661d6d6e | 来源:发表于2018-12-13 17:49 被阅读3次

最近碰到了比较多的关于vue的eventBus的问题,之前定技术选型的时候也被问到了,vuex和eventBus的使用范围。所以简单的写一下。同时有一种特殊的实现方案。
有这么几种数据传递方式,vuex、props、eventBus和特殊的eventBus。

vuex

不介绍,数据量和复杂度达不到不用它你才会向下看。

props
demo

父子组件传值,官方api,只写个demo。

1.父组件

<son :info="info" @update="updateHandler"/>
// data
info: 'sendToSon'
// methods
updateHandler (newVal) {
 this.info = newVal
}

2.子组件

// props
props: ['info']
// 向上传值,某个方法中使用
this.$emit('update', 'got')

父向子传值-->props 子向父传值-->子组件绑定事件回调定义在父组件,子组件触发此事件。 因不推荐子组件内直接修改父组件传入的props,需使用自定义事件。
限制
父子组件。
eventBus
demo
bus皆为导入的bus实例

// bus
const bus = new Vue()
// 数据接收组件
// 当前组件接收值则
bus.$on('event1', (val)=>{})
// 数据发出组件
// 当前组件发出值则
bus.$emit('event1', val)
\//欢迎加入前端全栈开发交流圈一起学习交流:864305860

可以看出本质是一个vue实例充当事件绑定的媒介。 在所有实例中使用其进行数据的通信。
双(多)方使用同名事件进行沟通。

问题

$emit时,必须已经 $on,否则将无法监听到事件,也就是说对组件是有一定的同时存在的要求的。(注:路由切换时,新路由组件先 created,旧路由组件再destoryed,部分情况可以分别写入这两个生命周期,见此问题)。
$on在组件销毁后不会自动解除绑定,若同一组件多次生成则会多次绑定事件,则会一次 $emit,多次响应,需额外处理。
数据非“长效”数据,无法保存,只在 $emit后生效。
所以是否有一种更适用的方案呢?
特殊的eventBus?

demo

我们先来看个代码,线上代码。 bus皆为导入的bus实例。

// bus
const bus = new Vue({
 data () {
  return {
   // 定义数据
   val1: ''
  }//欢迎加入前端全栈开发交流圈一起学习交流:864305860
 },
 created () {
  // 绑定监听
  this.$on('updateData1', (val)=>{
   this.val1 = val
  })
 }
})
// 数据发出组件
import bus from 'xx/bus'
// 触发在bus中已经绑定好的事件
bus.$emit('update1', '123')
// 数据接收组件
 
{{val1}}
// 使用computed接收数据
computed () {
 val1 () {
  // 依赖并返回bus中的val1
  return bus.val1
 }
}//欢迎加入前端全栈开发交流圈一起学习交流:864305860
  • 不同
    正统的eventBus只是用来绑定和触发事件,并不关心数据,不与数据发生交集。而这个方案多一步将数据直接添加在bus实例上。且事件监听与数据添加需提前定义好。
    数据接收方不再使用$on来得知数据变化,而是通过计算属性的特征被动接收。
    解决的问题
    通信组件需同时存在?数据在bus上存储,所以没有要求。
    多次绑定?绑定监听都在bus上,不会重复绑定。
    数据只在$emit后可用?使用计算属性直接读取存在bus上的值,不需要再次触发事件。
  • 探讨
    为什么使用计算属性
    其实应该是为什么不能直接添加到data上,如 data1: bus.data1?我们可以再看一段代码,线上代码。 将bus修改为
data () {
 return {
  // 多一层结构
  val: {
   result: 0
  }//欢迎加入前端全栈开发交流圈一起学习交流:864305860
 }
},
created () {
 this.$on('update1', val => {
  console.log('触发1', i1++)
  this.val.result = val
 })
}

数据接收组件改为

// template
data中获取直接修改值:{{dataResult}}
data中获取直接修改值的父层:{{dataVal}}
computed中依赖直接修改值:{{computedResult}}
// js//欢迎加入前端全栈开发交流圈一起学习交流:864305860
data () {
  return {
   // 获取直接修改值
   dataResult: bus.val.result,
   // 获取直接修改值的父层
   dataVal: bus.val
  }
 },
 computed: {
  computedResult () {
   // 依赖直接修改值
   return bus.val.result
  }
 }//欢迎加入前端全栈开发交流圈一起学习交流:864305860

可以看到,data中获取直接修改值值的数据是无法动态响应的。

为什么要用事件

其实不用$emit触发,使用 bus.val = 1直接赋值也是可以的,那么为什么不这么做呢?
简化版的vuex
其实这种eventBus就是简化版的vuex。 vue文档中有这样一段话:
组件不允许直接修改属于 store 实例的 state,而应执行 action 来分发 (dispatch) 事件通知 store 去改变,我们最终达成了 Flux 架构。这样约定的好处是,我们能够记录所有 store 中发生的 state 改变。
store对应 bus实例,state对应 dataaction对应 事件, dispatch对应$emit。 同时vuex中组件获取数据的方式正是通过计算属性,那么其实vuex和Flux架构的理解和使用也没有那么难不是吗。

结语

感谢您的观看,如有不足之处,欢迎批评指正。

本次给大家推荐一个免费的学习群,里面概括移动应用网站开发,css,html,webpack,vue node angular以及面试资源等。
对web开发技术感兴趣的同学,欢迎加入Q群:864305860,不管你是小白还是大牛我都欢迎,还有大牛整理的一套高效率学习路线和教程与您免费分享,同时每天更新视频资料。
最后,祝大家早日学有所成,拿到满意offer,快速升职加薪,走上人生巅峰。

相关文章

  • Vue数据传递--教你特殊的实现技巧

    最近碰到了比较多的关于vue的eventBus的问题,之前定技术选型的时候也被问到了,vuex和eventBus的...

  • vue组件间通信

    vue组件间通信 1.父组件向子组件传递数据--props 在vue2.0中使用props实现向子组件传递数据: ...

  • Vue-自定义事件

    在父组件使用prop 传递数据给子组件,子组件则是通过事件传递数据给父组件的。 Vue实例都会实现事件接口: 1....

  • 学会开发灵活的网页(Javascript)

    3.7、使用 JSON 和 AJAX传递api数据(使用vue和reqwest实现用其它网站获取数据并传入本网站(...

  • Vue基本使用

    数据传递 数据的单向传递把数据交给vue实例对象,实例对象将数据交给界面 vue中数据双向绑定可以用 v-mode...

  • Vue<分享功能>

    今天分享一个小技巧,教你如何一分钟内学会用vue实现分享功能。 H5无法实现直接调用手机App并实现分享功能,如果...

  • Vue组件间数据传递

    前言 总结vue组件间的数据传递 路由传参 父组件传递数据给子组件---props 子组件传递数据给父组件---$...

  • vue 双向数据绑定

    Vue实现数据双向绑定的原理:Object.defineProperty()vue实现数据双向绑定主要是:采用数据...

  • vue父子组件传递数据方法

    标签(空格分隔): vue 父组件向子组件传递数据 Vue中父组件向子组件传递数据用props 举个例子 父组件中...

  • Vue笔记——父子组件的双向数据绑定

    Vue项目中经常使用到组件之间的数值传递,实现的方法很多,但是原理基本上大同小异。子组件向父组件出传递数据,使用自...

网友评论

    本文标题:Vue数据传递--教你特殊的实现技巧

    本文链接:https://www.haomeiwen.com/subject/yutfhqtx.html