Vue 单文件中的数据传递示例


Posted in Javascript onMarch 21, 2017

Vue 的单文件组件在使用 Vue 时非常常用,所以我们也会经常遇到组件之间需要传递数据的时候,大致分为三种情况:

  1. 父组件向子组件传递数据,通过 props 传递数据。
  2. 子组件向父组件传递数据,通过 events 传递数据。
  3. 两个同级组件之间传递数据,通过 event bus 传递数据。

文档中也已经详细的说明了各种情况下的解决方法,但是现在我在还没有阅读多少文档的情况下,没有找到有单文件组件方面的具体书写方式,智商和理解能力有限的情况下,自己尝试了一下,最后发现其实是一样的。所以这篇文章其实是废话,但是还是想记录一下,不枉自己花了一个多小时。

准备工作,我新建了 6 个文件,分别是:

  1. index.html
  2. main.js 「Vue 实例」
  3. app.vue 「根组件,包含 page 和 footer 组件」
  4. page.vue 「msg 的父组件,footer 的 同级组件」
  5. msg.vue
  6. footer.vue

父组件向子组件传递数据,通过 props 传递数据。

这里我以 page 向 msg 传递数据为例:page.vue 中

<template>
  <div class="page">
    page
    <msg :love="message"></msg>
  </div>
</template>

<script>
import msg from './msg.vue'

export default {
 name: 'page',
 components: { msg },
 data () {
  return {
   message: 'page-msg'
  }
 }
}
</script>

msg.vue 中

<template>
  <div class="msg">
    {{ love }}
 </div>
</template>

<script>
export default {
 name: 'msg',
 props: ['love']
}
</script>

这样以后就会发现,实现了把父组件 page 中的数据传递到子组件 msg 中了。

另外,需要强调一下的是,不要在子组件中修改 props 的值,当然修改是有效的,非常不推荐,而且 Vue 也会有警告提示。正确的做法是传递给 data 中的属性或者计算属性。props 中的值是可以通过 this.love 访问到的。

特别注意 props 值是引用类型时的情况,不可以进行简单的赋值,会影响到父组件,正确的做法是进行深拷贝。

子组件向父组件传递数据,通过 events 传递数据。

父组件 page.vue 中

<template>
  <div class="page">
    page
    <msg @passData="getData"></msg>
  </div>
</template>

<script>
import msg from './msg.vue'

export default {
 name: 'page',
 components: { msg },
 data () {
  return {
   message: 'hi'
  }
 },
 methods: {
  getData (data) {
   console.log(data)
  }
 }
}
</script>

子组件 msg.vue 中

<template>
  <div class="msg">
  {{ msg }}
  <button @click="pass">点击</button>
 </div>
</template>

<script>
export default {
 name: 'msg',
 data () {
   return {
     msg: 'hello'
   }
 },
 methods: {
   pass () {
   this.$emit('passData', 'success')
  }
 }
}
</script>

点击后就会发现 console 出了 'success'。

同级元素之间传递数据,通过 event bus 来传递。

需要引入一个 Vue 实例 作为中央总线。page 组件中

<template>
  <div class="page">
    page
    <button @click="changeMsg">click</button>
  </div>
</template>

<script>
import msg from './msg.vue'
import { bus } from '../bus.js'

export default {
 name: 'page',
 components: { msg },
 data () {
  return {
   message: 'hi'
  }
 },
 methods: {
  changeMsg () {
   bus.$emit('change', '666')
  }
 }
}
</script>

footer 组件中

<template>
  <div class="footer">
    footer
  </div>
</template>

<script>
import { bus } from '../bus.js'

export default {
 name: 'footer',
 data () {
  return {
   msg: 'hi'
  }
 },
 created () {
   bus.$on('change',(data)=>{
   console.log(data)
  })
 }
}
</script>

嗯,最后发现打印出来了 '666',这样就实现了。

最后总结一下:

父组件向子组件传递数据,通过 props 传递数据。具体做法只需要在父组件中绑定,在子组件中声明。

//父组件
<father>
  <child :love="msg"></child>
</father>

//子组件
export default {
  ...
  props: ['love']
}

子组件向父组件传递数据,通过 events 传递数据。具体做法时在父组件中监听,在子组件中触发。

<father>
  <child @passData="getData"></child>
</father>

//子组件
export default {
  ...
  methods: {
    pass () {
      this.$emit('passData', 'hi')
    } 
  }
}

两个同级组件之间传递数据,通过 event bus 传递数据。

import { bus } from './bus.js'//两个组件都要引入

//触发事件
export default {
  ...
  methods: {
    passData () {
      this.$emit('communicate', 'hello')
    } 
  }
}

//监听事件
export default {
  ...
  mounted: {
    this.$on('communicate', (data) => {
      //...
    })
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
原生javascript实现图片轮播效果代码
Sep 03 Javascript
JS模拟面向对象全解(一、类型及传递)
Jul 13 Javascript
jquery 插件学习(四)
Aug 06 Javascript
文本域中换行符的替换示例
Mar 04 Javascript
JS实现的车标图片提示效果代码
Oct 10 Javascript
jquery中取消和绑定hover事件的实现代码
Jun 02 Javascript
BootStrap智能表单demo示例详解
Jun 13 Javascript
微信端开发--登录小程序步骤
Jan 11 Javascript
JS滚动到指定位置导航栏固定顶部
Jul 03 Javascript
Vue-input框checkbox强制刷新问题
Apr 18 Javascript
layui的布局和表格的渲染以及动态生成表格的方法
Sep 18 Javascript
JavaScript实现浏览器网页自动滚动并点击的示例代码
Dec 05 Javascript
js实现颜色阶梯渐变效果(Gradient算法)
Mar 21 #Javascript
详解Vue 实例中的生命周期钩子
Mar 21 #Javascript
十大热门的JavaScript框架和库
Mar 21 #Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
Mar 21 #Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
Mar 21 #Javascript
Omi v1.0.2发布正式支持传递javascript表达式
Mar 21 #Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
Mar 21 #jQuery
You might like
利用PHP扩展vld查看PHP opcode操作步骤
2013/03/04 PHP
Laravel中如何增加自定义全局函数详解
2017/05/09 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
Alliance vs Liquid BO3 第一场2.13
2021/03/10 DOTA
jquery获取input的value问题说明
2010/08/19 Javascript
jquery remove方法应用详解
2012/11/22 Javascript
JS中创建函数的三种方式及区别
2016/03/13 Javascript
Jquery+ajax+JAVA(servlet)实现下拉菜单异步取值
2016/03/23 Javascript
在localStorage中存储对象数组并读取的方法
2016/09/24 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
用Vue.extend构建消息提示组件的方法实例
2017/08/08 Javascript
vue-cli项目中使用公用的提示弹层tips或加载loading组件实例详解
2018/05/28 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
2020/05/31 Javascript
Vue数组响应式操作及高阶函数使用代码详解
2020/08/01 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
2020/11/05 Javascript
Python中的zipfile模块使用详解
2015/06/25 Python
Python操作mysql数据库实现增删查改功能的方法
2018/01/15 Python
python中实现将多个print输出合成一个数组
2018/04/19 Python
Python单元测试unittest的具体使用示例
2018/12/17 Python
Python中一些深不见底的“坑”
2019/06/12 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
2019/08/30 Python
手把手教你Python yLab的绘制折线图的画法
2019/10/23 Python
实例讲解Python 迭代器与生成器
2020/07/08 Python
python 动态绘制爱心的示例
2020/09/27 Python
python pymysql库的常用操作
2020/10/16 Python
美国新兴城市生活方式零售商:VILLA
2017/12/06 全球购物
安全标准化汇报材料
2014/02/03 职场文书
教师个人鉴定材料
2014/02/08 职场文书
小学评语大全
2014/04/22 职场文书
销售目标责任书
2014/07/23 职场文书
庆国庆国旗下讲话稿2014
2014/09/21 职场文书
预备党员群众路线思想汇报2014
2014/10/25 职场文书
成品仓管员岗位职责
2015/04/01 职场文书
在redisCluster中模糊获取key方式
2021/07/09 Redis
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技
如何Tomcat中使用ipv6地址
2022/05/06 Servers