本文是早期学习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)的更多相关文章

  1. 从0到1用react+antd+redux搭建一个开箱即用的企业级管理后台系列(基础篇)

    背景 ​ 最近因为要做一个新的管理后台项目,新公司大部分是用vue写的,技术栈这块也是想切到react上面来,所以,这次从0到1重新搭建一个react项目架子,需要考虑的东西的很多,包括目录结构.代码 ...

  2. 前端开发:css基础知识之盒模型以及浮动布局。

    前端开发:css基础知识之盒模型以及浮动布局 前言 楼主的蛮多朋友最近都在学习html5,他们都会问到同一个问题 浮动是什么东西?  为什么这个浮动没有效果?  这个问题楼主已经回答了n遍.今天则是把 ...

  3. ESP8266开发之旅 基础篇① 走进ESP8266的世界

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  4. ESP8266开发之旅 基础篇② 如何安装ESP8266的Arduino开发环境

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  5. ESP8266开发之旅 基础篇③ ESP8266与Arduino的开发说明

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  6. openlayers5-webpack 入门开发系列一初探篇(附源码下载)

    前言 openlayers5-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载 ...

  7. leaflet-webpack 入门开发系列一初探篇(附源码下载)

    前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...

  8. 【Windows10 IoT开发系列】配置篇

    原文:[Windows10 IoT开发系列]配置篇 Windows10 For IoT是Windows 10家族的一个新星,其针对不同平台拥有不同的版本.而其最重要的一个版本是运行在Raspberry ...

  9. ESP8266开发之旅 基础篇④ ESP8266与EEPROM

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  10. ESP8266开发之旅 基础篇⑥ Ticker——ESP8266定时库

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

随机推荐

  1. 国产的 Java Solon v3.2.0 发布(央企信创的优选)

    Solon 框架! Solon 是新一代,Java 企业级应用开发框架.从零开始构建(No Java-EE),有灵活的接口规范与开放生态.采用商用友好的 Apache 2.0 开源协议,是" ...

  2. 小白也能行【手撕ResNet代码篇(附代码)】:详解可复现

    目录 前言 model BasicBlock 和Bottleneck ResNet ResNet18\34\50\101\152 data train test 代码运行以及测试结果 前言 之前已经给 ...

  3. 【工具】you-get + ffmpeg|视频下载+音频提取

    一.原理: you-get下载,ffmpeg音视频分离. 这两个都是命令行工具. you-get安装(无python环境请参考python详细安装教程): pip3 install --upgrade ...

  4. 遇到的问题之“Parameter 'item' not found. ”

    一.问题 Parameter 'item' not found. 参数item找不到 二.原因 这里的值没有写对,#{item}的item应是改为productSku,改后就不会报错了 三.解决方案 ...

  5. cf记录

    cf2107D \(Question:\)给定一个节点为\(n(1 \leq n \leq 2e5)\)的树,定义三元组\((d,u,v)\)为从点\(u\)到点\(v\)的路径长度\(d\),每次选 ...

  6. QuickSort之C#实现

    /// <summary> /// 快速排序中的切分 /// lIndex已经是基准值,i记录基准值的大小值的边界,j记录目前遍历的边界: /// i值必须从lIndex+1开始,因为基准 ...

  7. C# 利用反射模拟多态效果

    public class A { } public class B : A { } public class C : A { } public static class Extension { pub ...

  8. Windows平台调试器原理与编写01.调试框架

    调试器原理与编写01.调试框架-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net 调试框架 调试器最基本功能: 断点,单步 断点分为三类 软件断点 硬件断点 内存断点 ...

  9. python3里面比较两个字符串的不同【difflib】

    一.difflib库的用法 a = '/Users/melon/Desktop/odoo14/myaddons/watermark_design/fonts/SimSun.ttf' b = '/Use ...

  10. Linux 统计活跃线程和线程数

    摘要:使用Linux命令ps -eT动态查看进程中,以指定字符串打头的活跃线程和线程数. 动态查看进程的线程数及活跃线程数 实现方案   在Linux系统中,可以使用以下命令来动态查看进程中名字包含& ...