正文

浅谈Vue不同场景下组件间的数据“交流”
Vue的官方文档可以说是很详细了。在我看来,它和react等其他框架文档一样,讲述的方式的更多的是“方法论”,而不是“场景论”,这也就导致了:我们在阅读完文档许多遍后,写起代码还是不免感到有许多困惑,因为我们不知道其中一些知识点的运用场景。这就是我写这篇文章的目的,探讨不同场景下组件间的数据“交流”的Vue实现
父子组件间的数据交流
父子组件间的数据交流可分为两种:
1.父组件传递数据给子组件
2.子组件传递数据给父组件
父组件传递数据给子组件——props
这是组件数据沟通中最常见的场景:你让父组件掌握了数据源,然后传递给子组件,供子组件使用
许多人会说,这很简单!用props嘛! 对,正因如此,它不是我要讲的主要内容,不过我们还是用代码简单过一遍:
父组件
<template>
<div id="father">
{{ '我是父组件' }}
<son :text = "text"></son>
</div>
</template>
<script>
import son from './son.vue'
export default {
data: function () {
return {
text: '从父组件传来的数据'
}
},
components: {
son: son
}
}
</script>
<style scoped>
</style>
子组件:
<template>
<div>
{{ '我是子组件,我接收了' + text }}
</div>
</template>
<script>
export default {
props: {
text: { type: String, default: '' }
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>
demo:
在这个demo里面,我们把“从父组件传来的数据”这一个字符串通过props传递给了子组件
如果我们希望在子组件中改变父组件的数据的话,可以在父组件中定义一个能改变父组件数据的函数,然后通过props将该函数传递给子组件,并在子组件在适当时机调用该函数——从而起到在子组件中改变父组件数据的效果
子组件传递数据给父组件
子组件传递数据给父组件 方式一:回调传参
父组件:
<template>
<div id="father">
{{ '我是父组件,名称是' + componentName }}
<son :changeComponentName = "changeComponentName"></son>
</div>
</template>
<script>
import son from './son.vue'
export default {
data: function () {
return {
componentName: '组件A'
}
},
methods: {
changeComponentName: function (newComponentName) {
this.componentName = newComponentName
}
},
components: {
son: son
}
}
</script>
<style scoped>
#father div{
padding: 10px;
margin: 10px;
border: 1px solid gray;
}
</style>
子组件:
<template>
<div>
<p>我是子组件:一个button</p>
<button @click="() => changeComponentName(newComponentName)">
把父组件的名称修改为:彭湖湾的组件
</button>
</div>
</template>
<script>
export default {
data: function () {
return {
newComponentName: '彭湖湾的组件'
}
},
props: {
changeComponentName: {
type: Function,
default: () => { }
}
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>
demo:
点击前:
点击后:
图解:
点击子组件(按钮)的时候,将父组件的名称从“A”修改为“彭湖湾的组件”
我们从父组件向子组件传递了一个函数(changeComponentName)。并在子组件调用这个函数的时候,以参数的形式传递了一个子组件内部的数据(newComponentName)给这个函数,这样,在父组件中定义的函数(changeComponentName)就可以取得子组件传来的参数了
【PS】 命名太长不好意思
子组件传递数据给父组件 方式二:自定义事件
父组件:
<template>
<div id="father">
<div>
{{ '我是父组件,我的名称是:' + fatherComponentName }}
<son v-on:changeComponentName = "changeComponentName"></son>
</div>
</div>
</template>
<script>
import son from './son.vue'
export default {
data: function () {
return {
fatherComponentName: 'A组件'
}
},
methods: {
changeComponentName: function (componentName) {
this.fatherComponentName = componentName
}
},
components: {
son: son
}
}
</script>
<style scoped>
#father div{
padding: 10px;
margin: 10px;
border:1px solid grey;
}
</style>
子组件:
<template>
<div>
<p>我是子组件:一个按钮</p>
<button @click="clickCallback">
修改父组件的名称为:彭湖湾的组件
</button>
</div>
</template>
<script>
export default {
data: function () {
return {
fatherComponentName: '彭湖湾的组件'
}
},
methods: {
clickCallback: function () {
this.$emit('changeComponentName', this.fatherComponentName)
}
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>
demo:
点击前:
点击后:
图解:
通过$emit(event, [...参数]),所有的参数将被传递给监听器回调,也就是我们在父组件中定义的changeComponentName方法,从而实现从子组件中给父组件传参
兄弟组件间的数据交流(有共同父组件的兄弟组件)
父组件:
<template>
<div id="father">
<div>
{{ '我是父组件:father' }}
<eldest-son :text = "text"></eldest-son>
<youngest-son :changeText="changeText"></youngest-son>
</div>
</div>
</template>
<script>
import eldestSon from './eldestSon.vue'
import youngestSon from './youngestSon.vue'
export default {
data: function () {
return {
text: '我是一行文本'
}
},
methods: {
changeText: function () {
this.text = '我是经过改动的一行文本'
}
},
components: {
eldestSon: eldestSon,
youngestSon: youngestSon
}
}
</script>
<style>
#father div{
border: 1px solid grey;
padding: 10px;
margin: 10px;
}
</style>
兄弟组件1:
<template>
<div>
<p>我是兄弟组件:eldestSon</p>
<p>我有一个可变数据text:{{ text }}</p>
</div>
</template>
<script>
export default {
props: {
text: {
type: String,
default: ''
}
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>
兄弟组件2:
<template>
<div>
<p>我是兄弟组件:youngestSon</p>
<button @click="changeText">更改eldestSon兄弟组件中的文本</button>
</div>
</template>
<script>
export default {
props: {
changeText: {
type: Function,
default: () => {}
}
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>
点击前:
点击后:
图解:
如果两个兄弟组件间存在这种数据关系的话,我们可以尝试寻找其共同的父组件,使数据和相关方法“提升”到父组件内部,并向下传给两个子组件
这样,其中一个子组件取得了数据,另外一个子组件取得了改变数据的方法,便可以实现上述的数据沟通
【注意】这种场景存在局限性,它要求两个组件有共同父组件。对于这种场景之外的处理方法,请看下文
全局组件间的数据交流——Vuex
我上述的许多场景里面,都运用到了props或者函数传参的方式去处理组件间的数据沟通。然而在稍大型的应用里面,它们都不约而同地给我们带来了很大的麻烦
例如:
1.通过props从父组件向子组件传递数据
对于直接的父子关系的组件,数据流显得很简洁明确,但在大型应用里面,我们上下嵌套许多个组件的时候,这就会导致我们的代码非常地繁琐,并难以维护
2.对于没有共同的父组件的兄弟组件,函数传参的数据传递方式也无能为力了,Vue文档里介绍到,你可以通过以$emit和$on函数为基础的“事件总线”沟通数据,但它无法应对更加大型的应用
这个时候Vuex就成为了实现全局组件间数据交流的最佳方案了
Vuex拥有一个包含全部顶层状态的单一数据源(state)
1.所有的组件都可以使用这个单一数据源里面的数据
2.所有的组件都可以通过派发 动作(actions)修改这个单一数据源里的数据
原本要“走很多弯路”才能实现沟通的数据流,一下子就找到了最短的捷径
实现View层的数据和model层的解耦
在1,2小节中处理的数据(Vue)和第三小节中处理的数据(Vuex),在很多时候是两种不同类型的数据,前者是属于View层,仅负责单纯的UI展示,而model层的大多是从后端取得后注入的数据。
一点建议:
1.Vue部分的代码负责构建View层
2.Vuex部分的代码负责构建model层
(上述的Vue指的是Vuex之外的框架体系)
以上述两点为基础,决定某部分的代码到底要写进Vue里面还是写进Vuex里面,并尽量将两者分开,从而实现View层和model层的解耦,提高前端代码的可维护性和扩展性
总结
以上所述是小编给大家介绍的Vue不同场景下组件间的数据交流,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# vue
# 组件间数据交流
# Vuejs 用$emit与$on来进行兄弟组件之间的数据传输通信
# vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
# vuejs动态组件给子组件传递数据的方法详解
# Vuejs第九篇之组件作用域及props数据传递实例详解
# 我是
# 文档
# 两种
# 并在
# 回调
# 小编
# 的是
# 取得了
# 这是
# 这一
# 我要
# 在这个
# 你可以
# 在此
# 但在
# 给我们
# 是从
# 一遍
# 我们可以
# 这也
相关文章:
如何获取免费开源的自助建站系统源码?
如何用wdcp快速搭建高效网站?
建站之星好吗?新手能否轻松上手建站?
,南京靠谱的征婚网站?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
导航网站建站方案与优化指南:一站式高效搭建技巧解析
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
如何通过PHP快速构建高效问答网站功能?
存储型VPS适合搭建中小型网站吗?
音响网站制作视频教程,隆霸音响官方网站?
如何在Windows环境下新建FTP站点并设置权限?
如何在香港免费服务器上快速搭建网站?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
css网站制作参考文献有哪些,易聊怎么注册?
建站主机功能解析:服务器选择与快速搭建指南
如何用IIS7快速搭建并优化网站站点?
建站之星在线版空间:自助建站+智能模板一键生成方案
网站制作企业,网站的banner和导航栏是指什么?
高防服务器租用首荐平台,企业级优惠套餐快速部署
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
制作营销网站公司,淘特是干什么用的?
宝塔新建站点报错如何解决?
建站之星如何优化SEO以实现高效排名?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
魔毅自助建站系统:模板定制与SEO优化一键生成指南
营销式网站制作方案,销售哪个网站招聘效果最好?
定制建站方案优化指南:企业官网开发与建站费用解析
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
建站之星伪静态规则如何设置?
如何快速生成凡客建站的专业级图册?
建站中国官网:模板定制+SEO优化+建站流程一站式指南
济南企业网站制作公司,济南社保单位网上缴费步骤?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
建站之星如何通过成品分离优化网站效率?
javascript基本数据类型及类型检测常用方法小结
建站主机类型有哪些?如何正确选型
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
制作网站的模板软件,网站怎么建设?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
济南专业网站制作公司,济南信息工程学校怎么样?
如何在服务器上配置二级域名建站?
Python如何创建带属性的XML节点
如何在IIS中新建站点并配置端口与物理路径?
如何优化Golang Web性能_Golang HTTP服务器性能提升方法
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
建站之星如何防范黑客攻击与数据泄露?
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
*请认真填写需求信息,我们会在24小时内与您取得联系。