前端开发系列052-基础篇之数据流和组件通信(Vue)
本文是早期学习Vue整理的一些阶段性总结,内容主要关于Vue框架中组件间通信和数据流。
一、组件中的数据
Vue组件中的数据主要有两种,一种是组件内部提供的,一种是组件外部传入的。
组件内部提供的数据,在组件注册时候由选项对象中的data函数返回(返回的是一个对象字面量,所有的数据以键值对的方式组织)。
组件外部传入的数据,在组件注册的时候由选项对象中的props属性来进行指定,props属性对应的值通常为字符串数组。
所谓组件内部的数据,即组件本身自带的,该组件在任何地方使用不论使用多少次都一定拥有的数据,如窗户这个组件中一定要使用(铝合金)和(高强度)玻璃。
所谓组件外部传入的数据,即在组件具体使用的时候传入的用于对组件本身的数据进行个性化处理和配置的数据,如1楼窗户使用12块玻璃,2楼的窗户是落地窗只有1块玻璃。
二、组件内部的数据
<body>
<div id="demoID">
<my-component></my-component>
<hr>
<my-component></my-component>
</div>
<template id="my_div">
<div>
<div>组件内部的数据1 message:{{message}}</div>
<div>组件内部的数据2 className:{{className}}</div>
<a :href="srcURL">我是a标签,我的链接地址为:{{srcURL}}</a>
</div>
</template>
<script>
//实例化组件
Vue.component("my-component",{
template:"#my_div",
data:function () {
return {
message:"也许你没留意,也许你不相信!",
className:"等风来001",
srcURL:"http://www.wendingding.com"
}
}
});
//创建Vue实例并挂载到页面中指定的标签
new Vue({
el:"#demoID"
})
</script>
上面的代码中我们注册了一个组件(my-component),组件内部拥有两个数据,分别是message和className,在页面中我们两次使用到了该组件,每次使用该组件的时候渲染后的内容都是一样的。需要注意的是,如果是要用组件内的数据来设置模板中标签的属性节点,那么需要通过v-bind指令来进程绑定。
另外,组件内部的数据也可以通过计算属性来进行处理,下面对之前的示例进行简单的调整,模板中a标签内容中的数据我们通过计算属性的方式来进行获取。
<body>
<div id="demoID">
<my-component></my-component>
</div>
<template id="my_div">
<div>
<div>组件内部的数据1 message:{{message}}</div>
<div>组件内部的数据2 className:{{className}}</div>
<a :href="src">我是a标签,我的链接地址为:{{srcURL}}</a>
</div>
</template>
<script>
//实例化组件
Vue.component("my-component",{
template:"#my_div",
data:function () {
return {
message:"也许你没留意,也许你不相信!",
className:"等风来001",
src:"http://www.wendingding.com"
}
},
computed:{
//通过计算属性的方式来得出a标签中srcURL的值为wendingding.com
srcURL:function () {
return this.src.substr(11);
}
}
});
//创建Vue实例并挂载到页面中指定的标签
new Vue({
el:"#demoID"
})
</script>
</body>
代码运行的结果为:
组件内部的数据1 message:也许你没留意,也许你不相信!
组件内部的数据2 className:等风来001
我是a标签,我的链接地址为:wendingding.com
三、组件外部传入的数据
我们知道组件其实就是以一定的方式把多个标签和数据组织在一起,以方便代码的复用和管理。这样每次在实现某个特定(相似)功能(UI)的时候就不必总是从头开始,而只需要以"自定义标签"的方式来使用组件就可以了。
假设我们是一个第三方的汽车制造工厂,因为制造一台比亚迪秦和比亚迪宋的生产线基本上是一样的,这个生产线就好比是组件,相当于我们把这个汽车的生产线封装成了组件,每次需要一辆汽车的时候只需要开启对应的生产线生产就可以了。
在这里要知道,因为不同类型的汽车其配置等信息是不一样的,所以需要个性化处理,这部分的数据需要在使用组件的时候具体的传递进去。组件在使用的时候其实也一样,组件中除固定不变的内部数据外,有时候还需要外部传入进行个性化配置。
<body>
<div id="demoID">
<my-component msg1="外部消息1" msg2="外部消息2"></my-component>
<hr>
<my-component msg1="{key:value}" msg2="[1,2,3]"></my-component>
</div>
<template id="my_div">
<div>
<div>组件内部的数据1 message:{{message}}</div>
<div>组件内部的数据2 className:{{className}}</div>
<a :href="src">我是a标签,我的链接地址为:{{srcURL}}</a>
<hr>
<div>组件外部传入的数据1 msg1:{{msg1}}</div>
<div>组件外部传入的数据2 msg2:{{msg2}}</div>
<div>组件外部传入的所有数据为 {{text}}</div>
<div>组件内部的数据 + 组件外部的数据 {{AllText}}</div>
</div>
</template>
<script>
//实例化组件
Vue.component("my-component",{
template:"#my_div",
data:function () {
return {
message:"也许你没留意,也许你不相信!",
className:"等风来001",
src:"http://www.wendingding.com"
}
},
props:["msg1","msg2"],
computed:{
srcURL:function () {
return this.src.substr(11);
},
text:function () {
return "msg1 :" + this.msg1 + " msg2:" + this.msg2;
},
AllText:function () {
return "外部数据" + this.text + "内部数据" + "message:" + this.message + "className:" +this.className;
}
}
});
//创建Vue实例并挂载到页面中指定的标签
new Vue({
el:"#demoID"
})
</script>
</body>
代码说明 在上面的代码中msg1和msg2为外部传入组件的数据,在传递数据的时候使用的形式是为自定义标签(组件)设置属性节点,在组件内部处理的时候key渲染的时候会被替换为对应的值。需要注意的是,设置传入数据的时候,接收到的数据类型都是字符串,而在组件中无论是内部的数据还是外部传入的数据都能够以相同的方式使用,在访问的时候需要使用this前缀。这里贴出上面代码执行的结果:
组件内部的数据1 message:也许你没留意,也许你不相信!
组件内部的数据2 className:等风来001
我是a标签,我的链接地址为:wendingding.com
组件外部传入的数据1 msg1:外部消息1
组件外部传入的数据2 msg2:外部消息2
组件外部传入的所有数据为 msg1 :外部消息1 msg2:外部消息2
组件内部的数据 + 组件外部的数据 外部数据msg1 :外部消息1 msg2:外部消息2内部数据message:也许你没留意,也许你不相信!className:等风来001
----------------------------------------------------------------
组件内部的数据1 message:也许你没留意,也许你不相信!
组件内部的数据2 className:等风来001
我是a标签,我的链接地址为:wendingding.com
组件外部传入的数据1 msg1:{key:value}
组件外部传入的数据2 msg2:[1,2,3]
组件外部传入的所有数据为 msg1 :{key:value} msg2:[1,2,3]
组件内部的数据 + 组件外部的数据 外部数据msg1 :{key:value} msg2:[1,2,3]内部数据message:也许你没留意,也许你不相信!className:等风来001
组件外部传入数据-属性节点的命名规范问题
> 向组件传入数据
>❒ 在组件内部的props属性中注明"这些数据"是从组件的外部传入的
>❒ 使用组件的时候通过设置`"自定义标签"[组件]`的属性节点来传入数据 形式为:key="value"
>❒ 在组件内部通过key来访问对应的值,得到的总是字符串
特别注意 在传入数据的时候需要注意因为HTML本身不区分大小写的关系,所以如果props中注明的数据是驼峰标识的,那么在设置属性节点的时候应该把单词拆分后使用-分隔。举例现在我们在组件中需要接受外部传入的数据名称为"myMessage",那么应该做对应的调整。
//Vue组件实例化的部分代码...
props:["msg1","msg2","myMessage"]
//Vue组件中template中使用到指定数据的部分代码
<div>组件外部传入的数据3 myMessage:{{myMessage}}</div>
//传入数据的部分代码(把myMessage拆分为 my-message)
<my-component msg1="外部消息1" msg2="外部消息2" my-message="我的-消息"></my-component>
特别说明 如果传递到组件中的数据的值并不是固定不变的,而需要动态绑定,那么在使用组件的时候需要使用v-bind指令。
<body>
<div id="demoID">
<!--msg1的值是固定不变的,传递的是普通的字符串-->
<!--msg2的值不确定,需要根据Vue实例对象(这里为app)中data属性对象中msg2Text键值对来确定,使用v-bind指令-->
<!--src的值也不确定,需要根据Vue实例对象(这里为app)中data属性对象中srcT键值对来确定,使用v-bind指令-->
<!--src的值因为需要作为插值语法和属性的value值来进行设置,因此在a标签中也需要使用v-bind指令来动态绑定-->
<my-component msg1="msg1:我是msg1" :msg2="msg2Text" :src="srcT"></my-component>
</div>
<template id="templateID">
<div>
<div>外部传入数据 {{msg1}}</div>
<div>外部传入数据 {{msg2}}</div>
<a :href="src">外部传入数据 {{src}}</a>
</div>
</template>
<script>
//实例化组件
Vue.component("my-component",{
template:"#templateID",
//外部传入组件的三个数据分别为:msg1 msg2 src
props:["msg1","msg2","src"]
});
//实例化Vue
var app = new Vue({
el:"#demoID",
data:{
msg2Text:"msg2:我是msg2 (动态绑定)",
srcT:"http://www.wendingding.com"
}
})
</script>
</body>
上述代码的执行情况如下
外部传入数据 msg1:我是msg1
外部传入数据 msg2:我是msg2 (动态绑定)
外部传入数据 http://www.wendingding.com
前端开发系列052-基础篇之数据流和组件通信(Vue)的更多相关文章
- 从0到1用react+antd+redux搭建一个开箱即用的企业级管理后台系列(基础篇)
背景 最近因为要做一个新的管理后台项目,新公司大部分是用vue写的,技术栈这块也是想切到react上面来,所以,这次从0到1重新搭建一个react项目架子,需要考虑的东西的很多,包括目录结构.代码 ...
- 前端开发:css基础知识之盒模型以及浮动布局。
前端开发:css基础知识之盒模型以及浮动布局 前言 楼主的蛮多朋友最近都在学习html5,他们都会问到同一个问题 浮动是什么东西? 为什么这个浮动没有效果? 这个问题楼主已经回答了n遍.今天则是把 ...
- ESP8266开发之旅 基础篇① 走进ESP8266的世界
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 基础篇② 如何安装ESP8266的Arduino开发环境
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 基础篇③ ESP8266与Arduino的开发说明
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- openlayers5-webpack 入门开发系列一初探篇(附源码下载)
前言 openlayers5-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载 ...
- leaflet-webpack 入门开发系列一初探篇(附源码下载)
前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...
- 【Windows10 IoT开发系列】配置篇
原文:[Windows10 IoT开发系列]配置篇 Windows10 For IoT是Windows 10家族的一个新星,其针对不同平台拥有不同的版本.而其最重要的一个版本是运行在Raspberry ...
- ESP8266开发之旅 基础篇④ ESP8266与EEPROM
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 基础篇⑥ Ticker——ESP8266定时库
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
随机推荐
- 【跟K8S学设计】Informer全分析-Reflector(上)
鉴于Informer架构及其处理逻辑蕴含了丰富的实战技术,本文将分为上下两章进行深入探讨. 上篇将专注于解析Informer中的Reflector组件,而下篇则会详尽分析Indexer模块.通过这种结 ...
- VSCode输出框中文乱码问题
vscode输出中文的时候,总是出现乱码.找了一个一劳永逸解决问题的方法,转载的,原教程地址:https://blog.csdn.net/a19990412/article/details/90270 ...
- apisix~ApisixPluginConfig的使用
1. ApisixPluginConfig 的作用 插件配置复用:将插件配置定义为独立的资源,供多个路由或服务引用. 解耦插件与路由:修改插件配置时,只需更新 ApisixPluginConfig,无 ...
- symfony4.4加密密码时报错Libsodium is not available. You should either install the sodium extension, upgrade
报错: "Libsodium is not available. You should either install the sodium extension, upgrade to PHP ...
- 通用型产品发布解决方案(SpringBoot+SpringCloud+Spring CloudAlibaba+Vue+ElementUI+MyBatis-Plus+MySQL+Git+Maven)03
通用型产品发布解决方案(基于分布式微服务技术栈:SpringBoot+SpringCloud+Spring CloudAlibaba+Vue+ElementUI+MyBatis-Plus+MySQL+ ...
- Uniapp-DeepSeek跨三端AI助手|uniapp+vue3+deepseek-v3流式ai聊天模板
原创AI实战uniapp+deepseek+vue3跨三端仿DeepSeek/豆包app流式ai对话助手. uniapp-vue3-deepseek 实战2025对话ai大模型,基于Uniapp+Vu ...
- xl2411p 显示器分辨率问题 IPS\TN
本来是想玩游戏来着,后来也没能玩起: 留下了个显示器明基xl2411p,昨天扒出来用起来吧. 玩游戏没毛病的,毕竟都是图片不存在文字的渲染问题,日常办公用起来就难受了,TN屏真是难受的了. 本来24寸 ...
- SQL 日常练习 (十四)
最近的项目都比较忙, 没太有时间来做练习, 不过 sql 这块, 还是始终要保持良好的手感, 我已经渐渐感觉到, 随着写得越来越多, 当然不只是在这里, 更多是在工作中, 不过涉及信息安全不能共享. ...
- DeepSeek+Coze实战:从0到1搭建小红书图文改写智能体(喂饭级教程)
大家好,我是汤师爷,专注AI智能体分享~ 还在为小红书笔记创作发愁吗? 每天都要绞尽脑汁想文案,看着别人的爆款笔记却不知道如何模仿? 今天,我就教你如何利用AI智能体,轻松实现小红书图文改写,让创作效 ...
- Pytorch之线性回归
从零开始实现 %matplotlib inline import torch import numpy as np import random 生成数据集 设训练数据集样本数为1000,特征数为2,使 ...