当前位置: 首页 > news >正文

Vue组件的一些底层细节

Vue组件的本质与Vue.extend方法

ButtonCounter 确实只是一个 组件配置对象 ,而不是一个组件本身。当你将这个配置对象注册到Vue实例的 components 选项中时,Vue内部会自动调用 Vue.extend() 方法来处理这个配置对象。

Vue.extend()的作用 :

- 它接收一个组件配置对象作为参数
- 返回一个 VueComponent构造函数 (本质是一个函数)
- 这个构造函数继承自Vue构造函数

当你在Vue实例中注册组件时,Vue内部会执行类似这样的操作:

components: {'button-counter': Vue.extend(ButtonCounter)
}

所以注册的实际上是 Vue.extend() 返回的构造函数,而不是你原始的配置对象。

组件实例化过程
当Vue模板中遇到 <button-counter></button-counter> 标签时:

1. Vue会使用之前通过 Vue.extend() 创建的构造函数
2. 创建一个该构造函数的实例对象
3. 这个实例对象与Vue实例类似,但有一些特定的组件行为

为什么组件本质是函数(构造函数)
1. 组件的注册形式 :注册的是构造函数,这样Vue才能根据需要多次实例化组件
2. 实例化过程 :使用 new VueComponent(options) 的方式创建组件实例
3. 复用性考虑 :作为构造函数可以创建多个独立的组件实例


Vue实例和组件实例的关系
- Vue实例 :通过 new Vue() 创建,是根实例
- 组件实例 :通过 new VueComponent() 创建,是子实例
- 继承关系 : VueComponent.prototype.__proto__ === Vue.prototype ,所以组件实例可以访问Vue原型上的方法

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="../vue.js/vue.js"></script>
</head><body><div id="app"><!-- 使用组件 button-counter --><button-counter></button-counter></div><script>// 定义一个名为 button-counter 的新组件,同时注册为全局组件const ButtonCounter = {data: function () {return {count: 0}},template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'}console.log('原始配置对象:', ButtonCounter) // 普通对象// 手动调用Vue.extendconst ButtonCounterConstructor = Vue.extend(ButtonCounter)console.log('Vue.extend返回:', ButtonCounterConstructor) // 构造函数console.log('是否是函数:', typeof ButtonCounterConstructor === 'function') // true// 创建组件实例const componentInstance = new ButtonCounterConstructor()console.log('组件实例:', componentInstance) // 对象const vm = new Vue({el: '#app',data: {message: 'hello vue'},components: {'button-counter': ButtonCounter}})console.log(vm)</script></body></html>

http://www.dtcms.com/a/519612.html

相关文章:

  • 2. =>的用法 C#例子 WPF例子
  • 在C#中出现WinForm原控件Chart卡顿问题
  • Spring Boot 3零基础教程,WEB 开发 内嵌服务器底层源码分析 笔记48
  • 网站开发案例分析成都制作网页
  • 导入的 Google(Chrome)书签默认不会自动显示在「书签栏」,而是放在一个文件夹里。下面是详细步骤,帮你把 导入的全部书签添加到书签栏
  • 一小时内使用NVIDIA Nemotron创建你自己的Bash计算机使用智能体
  • Chrome开发者工具
  • 虚拟机 Ubuntu 中安装 Google Chrome 浏览器
  • Docker/K8s部署MySQL的创新实践与优化技巧大纲
  • 网站建设管理流程避免网站侵权
  • 如何在Visual Studio中配置C++环境?
  • 珠海翻译公司高效翻译服务 2025年10月
  • 网站后台管理系统怎么登陆鄂州网站建设与设计
  • 建设系统网站企业密信下载app下载官网
  • 算法面经常考题整理(1)机器学习
  • 使用java如何进行接口测试
  • 机器学习-方差与偏差
  • 甘肃省网站建设咨询seo最好的网站源码
  • 3.序列式容器-heap
  • Module JDK is not defined 警告解决
  • 柞水县住房和城乡建设局网站网站建设客户分析调查表文档
  • html`contenteditable`
  • 【语音识别】语音识别的发展历程
  • 【C++ 类与对象 (下)】:进阶特性与编译器优化的深度实战
  • 加速智能体开发:从 Serverless 运行时到 Serverless AI 运行时
  • 怎么在服务器建立网站wordpress getcategorylink
  • uniapp textarea标签 在ios真机上出现高度拉长问题
  • cpp language 语法
  • uni-app 入门学习教程,从入门到精通,uni-app 企业项目实战:鲁嗑瓜子项目开发知识点(9)
  • uni-app小程序往飞书多维表格写入内容(包含图片)