系统性学习vue-vue组件化编程

news2025/2/25 1:58:47

vue组件化编程

    • 对组件的理解
    • 使用组件
      • 创建组件
      • 注册组件
      • 编写组件标签
      • 注意
    • 组件的嵌套
    • VueComponent构造函数
    • Vue实例与组件实例(vm与vc)
    • 一个重要的内置关系
    • 单文件组件(项目使用)

对组件的理解

就是将可以复用的模块提取为独立个体, 解决依赖关系混乱,复用率不高的问题
组件: 实现应用中局部功能代码和资源的集合

使用组件

分三步

创建组件

  • 组件不需要写el配置项,因为最终所有组件都要被vm管理,有vm决定服务于哪个容器
  • data配置项必须写成函数式, 因为如果是对象格式那这个组件多次使用数据会互相影响
  • 其他内容和vm其实一样
const comp = Vue.extend({
	template:``,
	data(){
		return {
		}
	},
	methods:{}
// 组件内容
})

注册组件

  • 局部注册
new Vue({
	el:"#root",
	components:{
		comp,
		//或
		zujian: comp
	}
})
  • 全局注册
// Vue.component(组件名称,组件文件位置)
Vue.component("comp",comp)

编写组件标签

<ele></ele>
<!--或-->
<zujian></zujian>

注意

  • 官方推荐注册时组件名如果是多个单词可以'my-comp':comp或者MySchool:comp(第二种需要脚手架)
  • 尽可能回避HTML已有的标签名,无论大写还是小写
  • 当创建组件时配置了name,那无论注册和使用时写的是什么名字,最终在Vue开发者工具中都是配置的name(一般都是些大型项目时使用,防止多个组件注册为相同名字容易混乱)
  • 使用组件便签也可以使用自闭和方式<comp/>,但需要在脚手架环境下
  • 简写组件方式const comp = {}

组件的嵌套

就是套娃
注意: 子组件需要在父组件前创建,不然会报错找不到

const compChild = Vue.extend({
//...
})

const compParent = Vue.extend({
//...
	components:{
		compChild,
	}
})

开发中通常会创建一个app组件,他管理着所有下级组件, 而由vm来控制他

VueComponent构造函数

  1. 组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的
  2. 我们只需要写<school></school>,Vue解析时就会帮我们创建school组件的实例对象, 即Vue帮我们执行的new VueComponent(options)
  3. 特别注意: 每次调用Vue.extend, 返回的都是一个全新的VueComponent
  4. 关于this指向:
    (1). 组件配置中:
    data函数,methods中的函数,watch中的函数,computed中的函数 他们的this均是VueComponent实例对象
    (2). new Vue()配置中:
    data函数,methods中的函数,watch中的函数,computed中的函数 他们的this均是Vue实例对象
  5. VueComponent的实例对象,以后简称vc(也可以称之为: 组件实例对象)
    Vue的实例对象,以后简称vm

创建了一个school组件,将组件输出到控制台

// school组件
const school = Vue.extend({
  name: 'school',
  template: `<h1>My school is {{name}}</h1>`,
  data() {
    return {
      name: '天津科技大学',
    }
  },
})

console.log('@', school)
<!--使用两个school组件-->
<div id="root">
  <school></school>
  <school></school>
</div>

可以看到下面内容
在这里插入图片描述
来到vue.js找到VueComponent函数,添加一个输出

var Sub = function VueComponent(options) {
  console.log('调用了VueComponent')
  this._init(options)
}

可以看到,因为使用了两个school组件,所以掉了两边VueComponent
在这里插入图片描述
再输出vm到控制台,可以看到vm.$children下有两个VueComponent实例对象
在这里插入图片描述

Vue实例与组件实例(vm与vc)

官网说明两者关系
类似于两个孪生兄弟,虽然基本相似,但也有细微不同之处,因此两者不能画等号
在这里插入图片描述

一个重要的内置关系

VueComponent.prototype.__proto__ === Vue.prototype
目的是为了让组件实例对象(vc)可以方位到Vue原型上的属性和方法

首先需要了解两个属性

function Demo() {
  this.a = 1
  this.b = 2
}
const d = new Demo()
console.log(Demo.prototype) // 方法都会有 显示原型属性
console.log(d.__proto__) // 对象都会有 隐式原型属性

两者指向的皆是Demo原型对象(原型对象是不是可以理解为就是类)
在这里插入图片描述
对Demo原型对象进行操作

// 通过对象的显示原型属性操作原型对象,追加一个x属性
Demo.prototype.x = 99

console.log('d.__proto__.x:', d.__proto__.x)
console.log('d.x:', d.x) //在对象上没找到,会主动顺着隐式原型链进行查找

输出相同
在这里插入图片描述
顺着链找到尽头就是Object原型对象,而Object.__proto__为null
在这里插入图片描述

类比Vue和VueComponent就如下图所示
需要注意的是VueComponent的原型对象的__proto__并不是指向Object原型对象,而是特意指向了Vue的原型对象在这里插入图片描述

单文件组件(项目使用)

之前写的html文件都是非单文件组件,
而单文件组件后缀名是.vue
但是web并不能直接识别vue文件,需要进行再处理和加工
有两种方法:

  1. webpack (自己搭建工作流)
  2. 脚手架(vue官方使用webpack进行搭建的) 推荐使用这个

一般文件名是使用大驼峰

单文件组件基本框架

<!-- 组件的结构 -->
<template></template>

<!-- 组件交互相关代码(数据, 方法等等) -->
<script></script>

<!-- 组件的样式 -->
<style></style>

接着来模拟一个项目
首先是组件,写了两个组件
在这里插入图片描述
内容不重要,就粘出School.vue

<!-- 组件的结构 -->
<template>
  <div class="demo">
    <h2>学校名称:{{ name }}</h2>
    <h2>学校地址:{{ address }}</h2>
  </div>
</template>

<!-- 组件交互相关代码(数据, 方法等等) -->
<script>
export default {
  name: 'School',
  data() {
    return {
      name: '天津科技大学',
      address: '天津市第十三大街',
    };
  },
};
</script>

<!-- 组件的样式 -->
<style>
.demo {
  background-color: #5097e8;
  color: white;
}
</style>
                                                                   

其中js部分是简写, 原始完整的应该是

<!-- 组件交互相关代码(数据, 方法等等) -->
<script>
const school = Vue.extend({
  name: 'School',
  data() {
    return {
      name: '天津科技大学',
      address: '天津市第十三大街',
    };
  },
});
export default school; //默认导出
</script>

组件定义好后,需要建一个App.vue来管理所有组件

<!-- 用于整合所有组件 -->
<template>
  <div>
    <School></School>
    <Student></Student>
  </div>
</template>

<script>
import School from './School.vue';
import Student from './Student.vue';
export default {
  components: {
    School,
    Student,
  },
};
</script>

<style>
</style>

接下来就需要创建vm了,创建一个main.js文件,创建vm并引入和使用App标签

/**
 * 入口文件
 * 创建vm
 */
import App from './App.vue'

new Vue({
  el: '#root',
  template: `<App></App>`,
  components: { App },
})

接着来弄vm的模板,创建index.html文件

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="root"></div>
    <script type="text/javascript" src="../../js/vue.js"></script>
    <!-- 引入vue -->
    <script type="text/javascript" src="./main.js"></script>
  </body>
</html>

OK, 项目框架就初步形成了,来运行!

报错 因为浏览器不支持es6的import,需要脚手架了
在这里插入图片描述
欲知后事如何,下篇文章见~

下一篇:vue-cli 脚手架

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1388973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CTF CRYPTO 密码学-2

题目名称&#xff1a;enc 题目描述&#xff1a; 字符 ZZZZ X XXZ ZZ ZXZ Z ZXZ ZX ZZX XXX XZXX XXZ ZX ZXZZ ZZXZ XX ZX ZZ 分析 此字段是由Z和X组成的字符&#xff0c;联想到莫斯密码是由.和-组成的所以接下来可以尝试莫斯密码解题 解题过程&#xff1a; Step1&#xff1a;…

AI编程可视化Java项目拆解第二弹,AI辅助生成方法流程图

之前分享过一篇使用 AI 可视化 Java 项目的文章&#xff0c;同步在 AI 破局星球、知乎、掘金等地方都分享了。 原文在这里AI 编程&#xff1a;可视化 Java 项目 有很多人感兴趣&#xff0c;我打算写一个系列文章拆解这个项目&#xff0c;大家多多点赞支持~ 今天分享的是第二…

四、任意文件读取漏洞

一、介绍 解释&#xff1a;任意文件读取漏洞就其本身来说就是&#xff0c;攻击者绕过网站防御者设置的防御&#xff0c;读取到了正常使用者不应该读取到的内容。网站开发者使用不同的语言&#xff0c;任意文件读取漏洞利用方式就不同。 二、不同开发语言的不同漏洞点 1.PHP …

(更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)

A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数&#xff08;2009-2023年&#xff09;参考《经济研究》中方先明&#xff08;2023&#xff09;的做法&#xff0c;将华证ESG评级进行赋值&#xff0c;指标包含C、CC、CCC、B、BB、BBB、A、AA、AAA共9个等级&#xff0c;…

使用Go语言的HTTP客户端和服务器

使用Go语言进行HTTP客户端和服务器开发是一种高效且强大的方式。Go语言的标准库提供了对HTTP协议的全面支持&#xff0c;使得创建HTTP客户端和服务器变得简单。 首先&#xff0c;让我们来看一下如何创建一个简单的HTTP服务器。在Go中&#xff0c;可以使用net/http包来创建HTTP…

抖音弹幕玩法汉字找不同让鼠标指针自动漂浮的实现原理及代码

如下图&#xff0c;抖音直播间弹幕互动玩法&#xff0c;为了增强用户的视觉感知体验&#xff0c;在里面加了一个鼠标&#xff0c;来让用户感知到自己在操作。下一节我们将背景音乐也给加上去。 我们实现的方案是用anime.js动画&#xff0c;来让一个图片在指定区域范围内随机漂浮…

WebGL开发智慧城市应用

在使用WebGL实现智慧城市应用时&#xff0c;需要考虑一系列的问题&#xff0c;以确保系统的性能、安全性和用户体验。以下是在开发WebGL智慧城市应用时需要注意的问题&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;…

从源码中分析SDS相较于C字符串的优势

文章目录 前言Type && EncodingsdsencodingcreateStringObjectcreateEmbeddedStringObject总结 createRawStringObject总结 createStringObjectFromLongDouble总结 createStringObjectFromLongLongWithOptions总结 相关操作sdscatlen总结 阈值44sds VS C字符串 前言 从…

加密经济学:Web3时代的新经济模型

随着Web3技术的迅猛发展&#xff0c;我们正迈入一个全新的数字经济时代。加密经济学作为这一时代的核心&#xff0c;不仅在数字货币领域崭露头角&#xff0c;更是重新定义了传统经济模型&#xff0c;为我们开启了一个充满创新和机遇的新纪元。 1. 去中心化的经济体系 Web3时代…

12.1、2、3-同步状态机的结构以及Mealy和Moore状态机的区别

同步状态机的结构以及Mealy和Moore状态机的区别 1&#xff0c;介绍Mealy型状态机和Moore型状态机的两种结构2&#xff0c;设计高速电路的方法 由于寄存器传输级&#xff08;RTL&#xff09;描述的是以时序逻辑抽象所得到的有限状态机为依据&#xff0c;因此&#xff0c;把一个时…

【嘉立创EDA-PCB设计指南】1.PCB基本概念及原理图绘制

前言&#xff1a;本文详解PCB基本概念以及实现MCU最小系统原理图的绘制&#xff08;原理图包括MCU芯片GD32F103C8T6、外部晶振、输出端口、USB输入口、5v转3v3稳压输出、复位按键、唤醒按键、LED&#xff09;。为本专栏后面章节实现PCB绘制做准备。 最终绘制的原理图如下所示&…

LinkedList ArrayDeque源码阅读

文章目录 LinkedList简介LinkedList例子LinkedList继承结构LinkedList代码分析成员变量方法 ArrayDeque简介ArrayDeque继承结构ArrayDeque代码分析总结参考链接 本人的源码阅读主要聚焦于类的使用场景&#xff0c;一般只在java层面进行分析&#xff0c;没有深入到一些native方法…

Java零基础教学文档servlet(3)

【AJax】 1.传统开发模式的不足 传统开发模式基于浏览器数据传输功能,页面填写数据/展示数据。浏览器通过访问一个URL地址&#xff0c;将页面的数据提交给服务器。服务器将需要展示的数据返回给浏览器&#xff0c;浏览器再进行数据解析&#xff0c;将数据呈现在用户面前。这种…

QT quick基础:加载资源文件(字体)

一、加载字体 1、准备字体库 Roboto-Regular.ttf 2、在工程下面新建文件夹fonts&#xff0c;并将字体库放到该文件夹下面。 3、在QT Create 工程中添加字体。 添加现有文件选择Roboto-Regular.ttf。 4、执行qmake 5、在.qml文件加载字体 /* 加载字体 */FontLoader {id: f…

如何在 Windows 10 中恢复已删除的文件

几乎每个 Windows PC 用户都曾意外删除过他们想要保留的文件。尽管您的第一步应该是检查回收站&#xff0c;但它可能不在那里。Windows 10 不会自动将所有已删除的文件保留在回收站中。有时它会永久删除文件&#xff0c;让您再也看不到它们。如果您遇到这种情况&#xff0c;我们…

如何使用Docker一键部署WBO白板并实现固定公网地址远程访问

文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cpolar4. 配置WBO公网访问地址5. 公网远程访问WBO白板6. 固定WBO白板公网地址 前言 WBO在线协作白板是一个自由和开源的在线协作白板&#xff0c;允许多个用户同时在一个虚拟的大型白板上画图。该白板对所有线上用…

AI数字人短视频变现项目:打造短视频运营变现新模式

随着社交媒体和短视频平台的兴起&#xff0c;越来越多的人开始关注如何将短视频变现。在这个时代&#xff0c;创新和科技成为了推动变现模式发展的关键。AI数字人作为一种全新的创新形式&#xff0c;正在迅速进入人们的视野。本文将介绍AI数字人短视频变现项目&#xff0c;以及…

新晋中科院TOP,不到3个月出结果,编辑处理效率真心高!

【SciencePub学术】 Measurement 期刊评说 网 友 辣 评 评说1&#xff1a;不到三个月出结果&#xff0c;挺快的&#xff0c;期刊效率高&#xff0c;2023年12月27日期刊更新成TOP了&#xff0c;值得推荐&#xff01; 评说2&#xff1a;一般送审了就问题不大&#xff0c;超过…

公众号申请数量已超上限的解决方法

一般可以申请多少个公众号&#xff1f; 公众号申请限额在过去几年内的经历了很多变化。对公众号申请限额进行调整是出于多种原因&#xff0c;确保公众号内容的质量和合规性。企业公众号的申请数量从50个到5个最后到2个&#xff0c;对于新媒体公司来说&#xff0c;这导致做不了…

分类预测 | Matlab实现CS-SVM布谷鸟算法优化支持向量机的数据分类预测

分类预测 | Matlab实现CS-SVM布谷鸟算法优化支持向量机的数据分类预测 目录 分类预测 | Matlab实现CS-SVM布谷鸟算法优化支持向量机的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现CS-SVM布谷鸟算法优化支持向量机的数据分类预测。 2.自带数据…