《Vue3 四》Vue 的组件化

组件化:将一个页面拆分成一个个小的功能模块,每个功能模块完成自己部分的独立的功能。任何应用都可以被抽象成一棵组件树。

Vue 中的根组件:

Vue.createApp() 中传入对象的本质上就是一个组件,称之为根组件(APP 组件)。

复制代码
<div id="app">
    <div>{{message}}</div>
</div>

<script>
	// 组件
	const APP = {
	    data() {
	        return {
	            message: 'Hello Vue',
	        }
	    },  
	}   
	// Vue.createApp() 中传入对象的本质上就是一个组件,称之为根组件(APP 组件)
	const app = Vue.createApp(APP)
	app.mount('#app')
</script>

注册组件:

每个组件都可以拥有自己的模板、样式、代码逻辑。注册组件分为两种:

  1. 全局组件:在任何其他的组件中都可以使用的组件。
  2. 局部组件:只有在注册的组件中才能使用的组件。

只要注册了全局组件,即使代码中没有用到,Webpack 等打包工具依然会对其进行打包;局部组件如果没有用到,将不会对其进行打包。

注册全局组件:

全局组件需要使用全局创建的 app 来注册,通过 app.component() 方法传入组件名称、组件对象即可注册一个全局组件。

复制代码
<div id="app">
    <!-- 使用全局组件 -->
    <product-item></product-item>
</div>

<script>
	const app = Vue.createApp()
	
	// 创建组件对象
	const productItem = {
	    template: '<div>我是一个组件</div>'
	}
	// 注册全局组件
	app.component('product-item', productItem)
	
	app.mount('#app')
</script>

组件的 template 模板还有另外一种写法。

复制代码
<!-- 编写组件模板 -->
<template id="product-item-template">
    <div>我是一个组件</div>
</template>

<div id="app">
    <product-item></product-item>
</div>

<script>
const app = Vue.createApp()

const productItem = {
    // 使用组件模板
    template: '#product-item-template'
}
app.component('product-item', productItem)

app.mount('#app')
</script>

注册局部组件:

局部组件通过 components 属性选项来进行注册,该选项对应的是一个对象,对象中的键值对是 组件名称:组件对象

复制代码
<div id="app">
    <!-- 使用局部组件 -->
    <product-item></product-item>
</div>

<script>
	// 创建组件对象
	const productItem = {
	    template: '<div>我是一个组件</div>'
	}
	
	const app = Vue.createApp({
	    // 注册局部组件
	    components: {
	        'product-item': productItem,
	    }
	})
	app.mount('#app')
</script>

组件的 template 模板还有另外一种写法。

复制代码
<!-- 编写组件模板 -->
<template id="product-item-template">
    <div>我是一个组件</div>
</template>

<div id="app">
    <product-item></product-item>
</div>

<script>
const app = Vue.createApp({
    components: {
        'product-item': {
        	// 注册组件模板
            template: '#product-item-template',
        }
    }
})

app.mount('#app')
</script>

定义组件名称的方式:

定义组件名称的方式有两种:

  1. 使用 kebab-case 短横线分隔符。

    复制代码
    // 使用
    <product-item></product-item>
    
    // 定义
    app.component('product-item', productItem)
  2. 使用 PascalCase 大驼峰标识符。

    复制代码
    // 使用。在原生 HTML 文件中这么写是无效的,因为 HTML 不区分大小写;不过在 Vue 文件中就没有这个问题了
    <productItem></productItem>
    
    // 定义
    app.component('productItem', productItem)
相关推荐
码视野2 天前
基于 Spring Boot + Vue3 的【大学英语四六级 (CET-4/6) 作文智能评分与句式润色系统】设计与实现(含PRD/三端高保真源码/大屏)
java·前端·人工智能·spring boot·后端·vue3
码视野3 天前
基于 Spring Boot + Vue3 的【高校化学实验室安全准入考试与危化品配伍排查系统】设计与实现(含PRD/三端高保真源码/大屏)
前端·人工智能·spring boot·后端·安全·vue3
fxshy3 天前
WebGIS 游戏化实践:基于 Cesium + Vue3 实现全球飞行模拟系统:从球体坐标、飞行动力学到地形碰撞实战
游戏·vue3·cesium·webgis·飞行模拟
jonyleek4 天前
技术实践:基于 Vue3 + Spring Cloud 微服务实现私有化文档系统的类 SaaS 协同体验
微服务·私有化部署·vue3·springcloud·协同编辑·jvs企业文档·无忧企业文档
码视野4 天前
基于 Vue3 + Element Plus 的【智慧社区洗车养车与上门流动洗车预约调度系统】设计与实现(含PRD/三端源码/大屏)
前端·javascript·vue.js·人工智能·vue3
码视野4 天前
基于 Vue3 + Element Plus 的【无人值守共享自习室与空间智能预约系统】设计与实现(含PRD/三端源码/大屏)
前端·javascript·vue.js·人工智能·vue3
码视野4 天前
基于 Vue3 + Element Plus 的【基于 Vue3 的智慧健身房会员管理与私教团课预约核销系统】设计与实现(附完整源码与PRD)
前端·vue3
码视野4 天前
基于 Vue3 + Element Plus 的【青少年心理健康智能测评与 AI 情绪树洞陪护干预系统】设计与实现(含PRD/三端源码/大屏)
前端·vue.js·人工智能·vue3
码视野4 天前
基于 Vue3 + Element Plus 的【微短剧剧本智能创作与分镜生产协同系统】设计与实现(含PRD/三端源码/大屏)
前端·人工智能·vue3
码视野5 天前
基于 Vue3 + Element Plus 的【智慧新能源汽车充电桩运维调度与分时共享租赁系统】设计与实现(附完整源码与PRD)
运维·人工智能·汽车·vue3