关于vue.js组件数据流的问题

发布时间 - 2026-01-11 02:31:29    点击率:

一、组件

组件,可以说是现代前端框架中必不可少的组成部分。使用组件,不仅能极大地提高代码的复用率和开发者的开发效率,对于代码后期的维护也有着非常重要的意义。前端开发,由于历史遗留原因,WebComponent 虽然好用,但其发展情况却受到极大地限制,和很多新兴的前端技术一样,可望而不可即。基于这样的情况,聪明的开发者们尝试通过框架内部集成相应的功能来完成组件化,各种现代前端框架基本上都有各自的实现。这里我们来分析一下 vue 的组件,重点关注数据的流向。

二、vue 组件

vue 的组件,创建模板的时候是基于普通的 html 的,不需要学习 jsx、handlebars 等的特殊语法,所以相对来说,学习成本比较低,更容易上手。使用 vue 组件的时候,一般分为组件注册和组件调用两个部分。

(一)组件注册

Vue.component('pop-box', {
  template:  '<div class="component-box">\
    <div class="component-content">\
    ..........
    </div>\
  </div>',

  props: [...],

  data: function () {
    return ...;
  },

  methods: {
    ...
  },

  mounted () {
    ...
  },

  ...
});

利用 Vue.component 方法我们可以很轻松的创建一个全局可用的组件,当然也可以在实例或组件内部注册局部组件,但原理大同小异。Vue.component 的第一个参数是组件的名字,或者说唯一标识符(id),后续调用它将通过这个名字进行调用;第二个参数是一个对象,通常它包含了模板(template)、组件内维护的数据(data、computed)、方法(methods)、钩子函数(created 、 mounted...)等关键信息。

值得注意的是:

  1. 组件内的 data 必须是一个函数,它的返回值将作为实际的 “data”;
  2. vue1.x 和 vue2.x 的钩子函数略有不同,如果发现钩子函数不生效,记得确认 vue 的版本。

(二)组件调用

(1)开始标签 + 结束标签模式

<pop-box text="200" v-bind:number="200"></pop-box>

(2)无结束标签模式

<pop-box text="200" v-bind:number="200" />

调用 vue 组件有以上两种模式。两种模式上,如果没有使用 slot 那么实际上并没有任何区别,但如果需要使用 slot 的时候,便只能使用同时包含开始标签和结束标签的模式。

值得注意的是,上面绑定数据的时候,直接采用 property="value" 的形式,不管 value 是数字还是字符串,property 最终都是字符串类型。如果想让其变成数字类型,请使用 v-bind:property="value" 的形式,或者简写为 :property="value" 。

三、vue 组件数据流

vue 遵循了典型的单向数据流的原则,即数据总是由父组件传递到子组件,子组件在其内部可以有自己维护的数据,但它无权修改父组件传递给它的数据,当开发者尝试这样做的时候,vue 将会报错。这样做的好处是,防止多个子组件都尝试修改父组件状态时,让这一行为变得难以追溯。vue 中具体实现方式如下:


父组件通过绑定 props 的方式,将数据传递给子组件,但是子组件自己并没有权利修改这些数据,如果要修改,只能把修改这一个行为通过 event 的方式报告给父组件,由父组件本身决定改如何处理数据。

(一)简单实例

<div id="app">
  <my-counter @inc="increase" :counter="counter"></my-counter>
</div>
...
Vue.component('my-counter', {
  template:  '<div class="counter">\
    <div>{{counter}}</div>\
    <button @click="inc">increase</button>\
  </div>',

  props: ['counter'],

  methods: {
    inc: function () {
      this.$emit('inc');
    }
  }
});

var app = new Vue({
  el: '#app',
  data: {
    counter: 0
  },
  methods: {
    increase () {
      this.counter ++;
    }
  }
});

为了显得更简单这里只创建了一个 my-counter 组件作为子组件,我们可以姑且将 vue 的实例认为是一个父组件。

(二)分析数据流向分析

(1)我们在父组件中定义了一个数据叫 counter;
(2)调用组件的时候,通过 :counter="counter" 的方式,将父组件的 counter 以 prop 的方式传递到子组件中;
(3)子组件读取到 counter,并将其展示在模板中;
(4)用户点击按钮,counter 需要增加;
(5)子组件监听到这个事件,但它并不直接修改 counter,而是通过 this.$emit('inc'); 以自定义事件的形式,将需要增加的这一个事件报告给父组件;
(6)父组件中,由于通过执行过 @inc="increase" ,能够监听到子组件报告过来的事件,并在自己的 increase 方法中,实现 counter 的增加;
(7)父组件里的数据更新了,子组件里的数据也将自动更新,同时也将更新界面内容,这一过程由框架自动完成。

(三)总结

上面这一个示例,基本完整展示了 vue 主要的数据流向,但是这种基于 prop/evnet 的方式仅适用于存在直接的父子关系的组件,兄弟组件或者大量组件的数据流向如果再基于这种方式将会变得非常麻烦,这时可以考虑使用更加强大的状态管理模式。

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


# vue.js组件数据流  # vue.js  # 组件  # 数据流  # Next.js搭建Monorepo组件库文档实现详解  # jsoneditor二次封装实时预览json编辑器组件react版  # JS实现一个文件选择组件详解  # JS前端画布与组件元信息数据流示例详解  # 这一  # 是一个  # 的是  # 将会  # 两种  # 我们可以  # 也将  # 这样做  # 但它  # 绑定  # 自己的  # 都是  # 可望而不可即  # 都有  # 第一个  # 多个  # 极大地  # 不需要  # 是由  # 适用于 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 专业商城网站制作公司有哪些,pi商城官网是哪个?  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  如何彻底卸载建站之星软件?  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  如何在IIS管理器中快速创建并配置网站?  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  PythonWeb开发入门教程_Flask快速构建Web应用  如何快速搭建虚拟主机网站?新手必看指南  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  北京网站制作公司哪家好一点,北京租房网站有哪些?  微信h5制作网站有哪些,免费微信H5页面制作工具?  Laravel如何记录自定义日志?(Log频道配置)  网站建设保证美观性,需要考虑的几点问题!  如何快速上传建站程序避免常见错误?  如何在万网开始建站?分步指南解析  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  如何快速查询网址的建站时间与历史轨迹?  使用Dockerfile构建java web环境  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  如何快速登录WAP自助建站平台?  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  如何在Ubuntu系统下快速搭建WordPress个人网站?  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  详解Oracle修改字段类型方法总结  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  Android自定义listview布局实现上拉加载下拉刷新功能  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  北京企业网站设计制作公司,北京铁路集团官方网站?  Python文件流缓冲机制_IO性能解析【教程】  Java垃圾回收器的方法和原理总结  魔方云NAT建站如何实现端口转发?  高防服务器:AI智能防御DDoS攻击与数据安全保障  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  如何用5美元大硬盘VPS安全高效搭建个人网站?  如何快速生成高效建站系统源代码?  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  微信小程序 scroll-view组件实现列表页实例代码  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  js实现获取鼠标当前的位置  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  如何在云主机上快速搭建多站点网站?  如何在Windows环境下新建FTP站点并设置权限?  iOS UIView常见属性方法小结  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  Laravel如何优化应用性能?(缓存和优化命令)  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  如何在云服务器上快速搭建个人网站?