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

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

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

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

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

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

  • index.html

  • main.js 「Vue 实例」

  • app.vue 「根组件,包含 page 和 footer 组件」

  • page.vue 「msg 的父组件,footer 的 同级组件」

  • msg.vue

  • 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><style></style>

msg.vue 中

<template><div class="msg">{{ love }}</div>
</template><script>
export default {name: 'msg',props: ['love']
}
</script><style></style>

  这样以后就会发现,实现了把父组件 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><style></style>

子组件 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><style></style>

点击后就会发现 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><style></style>

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><style></style>

嗯,最后发现打印出来了 '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) => {//...})}
}

嗯,废话较多,毫无干货。作为刚进入前端行业,刚开始写博客的新人,缺点和不足麻烦大家指出。转载请注明出处。

Vue 单文件中的数据传递相关推荐

  1. Vue单文件中引入背景图片时,四周有空白的问题

    Vue单文件中引入背景图片时,四周有空白的问题 问题背景 初始引入背景图 更新后的背景图设置 问题背景 近期公司有个管理系统前后端分离,但是前端人员不够,只能我们后端来凑,而在前端的开发过程中总是遇到 ...

  2. Vue之单文件组件的数据传递,axios请求数据及路由router

    1.传递数据 例如,我们希望把父组件的数据传递给子组件. 可以通过props属性来进行传递. 传递数据三个步骤: 步骤1:在父组件中,调用子组件的组名处,使用属性值的方式往下传递数据 <Menu ...

  3. Vue 单文件组件||Vue 单文件组件的基本用法||webpack 中配置 vue 组件的加载器|| 在 webpack 项目中使用 vue

    Vue 单文件组件 传统组件的问题和解决方案 1. 问题 1. 全局定义的组件必须保证组件的名称不重复 2. 字符串模板缺乏语法高亮,在 HTML 有多行的时候,需要用到丑陋的 \ 3. 不支持 CS ...

  4. vue组件穿方法_vue组件中的数据传递方法

    Vue 的组件作用域都是孤立的,不允许在子组件的模板内直接引用父组件的数据.必须使用特定的方法才能实现组件之间的数据传递.组件之间传递数据大致分为三种情况: 父组件向子组件传递数据,通过 props ...

  5. mysql 导入tsv文件_HBase数据迁移(2)- 使用bulk load 工具从TSV文件中导入数据

    英文原文摘自:<HBase Administration Cookbook>??编译:ImportNew?-?陈晨 本篇文章是对数据合并的系列文章之二(共三篇),针对的情景模式就是将现有的 ...

  6. vue单文件props写法_详解Vue 单文件组件的三种写法

    详解Vue 单文件组件的三种写法 JS构造选项写法 export defaul { data, methods, ...} JS class写法 @Component export default c ...

  7. Python读取excel文件中的数据,绘制折线图、散点图

    https://www.cnblogs.com/liulinghua90/p/9935642.html https://blog.csdn.net/qq_32458499/article/detail ...

  8. VSCode环境下配置ESLint 对Vue单文件的检测

    本文介绍了在VSCode环境下如何配置eslint进行代码检查,并介绍了如何对.vue单文件进行支持. ESLint 安装 1.在工程根目录下,安装eslint及初始化 $ npm install e ...

  9. python文件读取方法read(size)的含义是_在Python中可使用read([size])来读取文件中的数据,如果参数size省略,则读取文件中的()。...

    [单选题]李明在他所属的公司工作五年,每天都很认真地处理繁杂的事情,同事们都夸他认真,但是依然没有建树,这是因为: [多选题]品牌标志的作用表现在 [单选题]新产品开发的第一个阶段是_______. ...

最新文章

  1. 零基础小白如何学习好UI设计
  2. linux -bash: ipconfig: command not found 解决方法
  3. java开发前的准备工作_三、开发java程序前的准备工作
  4. 分布式计算第四章 RMI
  5. 解决Windows 10 CPU占用高风扇吵问题
  6. 苹果手机输入屏保后锁屏_修一块手机屏幕要7080元?
  7. android WebView通过js方法与原生交互
  8. jQuery源码分析 Callbacks
  9. 48个国际音标发音图解暨口形及发音方法
  10. 策略模式和工厂模式的区别_设计模式系列 — 策略模式
  11. Bootstrap 3.2.0 源码试读 2014/08/14
  12. windows如何根据句柄hwnd显示和隐藏窗口
  13. python编译成可执行文件 发布 win_[PYTHON]_ELVE_Python源代码文件编译成可执行文件(支持macOS High Sierra和window 10)...
  14. struts标签+jstl标签之国际化实例
  15. ps cc2019版为什么做图一复制图层就卡死_你所不知道的十个被藏起来的PS功能,超级实用!...
  16. Android-App的设计架构经验谈,系列篇
  17. Java常用加密解密算法全解
  18. 用标准遗传算法求函数最大值
  19. xsd文件 -- 伤痛
  20. 教你竖屏视频上下黑边添加图片的剪辑技巧

热门文章

  1. Python 基础起步(一)写在开篇的话,写给同为小白的你
  2. Python 中的 10 个常见安全漏洞,以及如何避免(上)
  3. 一双木棋chess[九省联考2018]
  4. UML 10 种常见的域建模错误
  5. 兼容iOS 10 资料整理笔记
  6. .net IntPtr ==interoperable pointer
  7. Android仿美团加载数据、小人奔跑进度动画对话框(附顺丰快递员奔跑效果)
  8. Failed to execute request because the App-Domain could not be created
  9. Serial Old收集器和Parallel Old收集器
  10. RabbitMQ(三) HelloWorld 单生产者单消费者示例实现