Vue3基础(2)——组件基础

黑马程序员Vue全套视频教程,从vue2.0到vue3.0一套全覆盖,前端必会的框架教程_哔哩哔哩_bilibili喜欢的小伙伴们别忘了投币,点赞,收藏呦,历经 5 年的反复打磨与锤炼,黑马程序员重磅推出全套最新的 Vue2 + Vue3 基础课程。共计 500 多集的免费视频,助您轻松掌握前端圈最火的 Vue 框架!https://www.bilibili.com/video/BV1zq4y1p7ga?p=327&spm_id_from=333.1007.top_right_bar_window_history.content.click

1. 单页面应用程序

单页面应用程序(SPA)是指一个Web网站中只有唯一的一个HTML页面,所有功能和交互在这个页面内完成。

1. SPA的优点:

  • 良好的交互体验:单页面内容的改变不需要重新加载整个页面;获取数据是通过Ajax异步获取;没有页面之间的跳转,不会出现白屏现象。
  • 良好的前后端工作分离模式:后端专注于提供API接口,更易实现API接口的复用;前端专注于页面的渲染,更利于前端工程化的发展。
  • 减轻服务器压力:服务器只提供数据,不负责页面的合成与逻辑的处理,吞吐能力提高几倍。

2. SPA的缺点:

  • 首屏加载慢:(解决方法)路由懒加载、代码压缩、CDN加速、网络传输压缩
  • 不利于SEO:(解决方法)SSR服务端渲染

3. vue官方提供的快速创建工程化SPA项目的方式:

  • vite(仅支持vue3.0,小而巧,速度快)
  • vue-cli(支持vue2.0和3.0,基于webpack,适用于企业项目开发)

2. Vite的基本使用

1. 创建vite项目

# 创建和初始化项目
npm init vite-app 项目名称
cd 项目名称
npm i

# 运行项目
npm run dev

2. 项目的结构

 

3. vite项目的运行流程

工程化项目中,vue通过main.js把App.vue渲染到index.html的指定区域中 。

  • App.vue用来编写带渲染的模板结构,所有模板结构需要用<template>标签包裹
  • index.html中需要预留一个el区域
  • main.js把App.vue渲染到了index.html所预留的区域中

App.vue:

<template>
  <h1>这是<i>App.vue</i>根组件</h1>
  <h3>{
  {username}}</h3>
  <hr>
  <p>count值是:{
  {count}}</p>
  <button @click="addCount">+1</button>
  <hr>
  <my-swiper></my-swiper>
  <my-test></my-test>
  <my-search></my-search>
</template>

<script>
import Search from './components/privateReg/Search.vue'

//今后,组件相关的data数据、methods方法等,都需要定义到export default导出的对象中
export default {
  // 当前组件的名称(建议:每个单词首字母大写)
  name: 'MyApp',
  // 组件的数据
  data(){
    return{
      username:'zs',
      count:0
    }
  },
  // 组件的处理函数
  methods:{
    addCount(){
      this.count++
    }
  },
  // 局部注册组件
  components:{
    'my-search':Search
  }
}
</script>

<style lang="less" scoped>
h1 {
  color: red;
  i {
    color:blue;
  }
}
</style>

main.js:

// 1、从vue中按需导入createApp函数
//createApp函数的作用:创建vue的“单页面应用程序实例”
import { createApp } from 'vue'
// 2、导入待渲染的App组件
import App from './App.vue'
import './index.css'

// 5、导入Swiper和Test两个全局注册组件
import Swiper from './components/globalReg/Swiper.vue'
import Test from './components/globalReg/Test.vue'

// 3、调用createApp()函数,返回值是“单页面应用程序的实例”
// 同时把App组件作为参数传给createApp函数,表示要把App渲染到index.html页面上
const app=createApp(App)

// 6、调用app.component()方法全局注册组件
app.component('my-swiper',Swiper)
app.component('my-test',Test)

// 4、调用“单页面应用程序的实例”的mount方法,用来指定vue实际要控制的区域
app.mount('#app')

index.html: 

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <link rel="icon" href="/favicon.ico" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Vite App</title>
</head>
<body>
  <div id="app"></div>
  <script type="module" src="/src/main.js"></script>
</body>
</html>

3. 组件化开发

根据封装的思想,把页面上可重用的部分封装为组件,从而提高代码复用性,方便项目的开发维护。

vue完全支持组件化开发,规定组件的后缀名为.vue。

1. vue组件构成

每个.vue 组件都由3个部分构成,分别是:

  • template:组件的模板结构
  • script:组件的Javscript行为
  • style:组件的样式
  • (其中,每个组件必须包含template模板结构,其他组成部分可选。)

(1)组件的template节点

<template>只是一个包裹性质的容器,不会真正被渲染为DOM元素。

  • <template>节点中支持使用vue指令语法,辅助开发者渲染当前组件的DOM结构。
  • 注意:vue3.x的版本中,<template>中支持定义多个根节点。

(2)组件的script节点

<script> 节点是可选的,在其中封装组件的JavaScript业务逻辑。

  • name节点:可以通过name节点为当前组件定义一个名称,在使用vue-devtools进行调试时,自定义的组件名称可以清晰的区分每个组件。
  • data节点:vue组件渲染期间需要用到的数据,可以定义在data节点中。
  • methods节点:组件中的事件处理函数必须定义在methods节点中。

(3)组件的style节点

<style> 节点是可选的,在其中编写样式美化当前组件的UI结构。

  • <style>标签上的lang="css"属性是可选的,它表示所使用的的样式语言,默认只支持普通css语法,还可以选择less、scss等。
  • 让style中支持less语法:(2)运行命令安装依赖包(2)在<style>标签加上lang="less"属性
npm install less -D

2. 组件的注册

组件之间可以相互引用,引用原则是:先注册后使用。

(1)注册组件的两种方式:

  • 全局注册组件:被全局注册的组件,可以在全局任何一个组件内使用。
    • 在main.js中,导入组件,并使用app.component()方法注册全局组件,直接以标签的形式进行使用即可。
  • 局部注册组件:被局部注册的组件,只能在当前注册的范围内使用。
    • 在需要组件的.vue模块中,导入组件,并通过components节点,为当前组件注册私有子组件,之后直接以标签的形式进行使用即可。

(2)组件注册时定义组件名称的两种方式:

  • kebab-case命名法(短横线命名法):必须严格按照短横线名称进行使用,例如my-swiper、my-search
  • PascalCase命名法(大驼峰命名法):既可以按照帕斯卡名称使用,也可以转化为短横线名称使用,例如MySwiper、MySearch
  • 注意:实际开发中推荐使用帕斯卡命名法,因为它适用性更强!

(3)通过name属性注册组件

  • 在注册组件期间,除了可以直接提供组件的注册名称之外,还可以把组件的name属性作为注册后的组件名称,相当于帕斯卡命名法。例如:app.component(Swiper.name,Swiper)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
组件Vue.js 中最重要的概念之一。组件可以让我们将 UI 拆分为独立、可复用的部件,使得代码更加清晰、易于维护。在 Vue.js 中,组件可以分为全局组件和局部组件,其中全局组件可在任何地方使用,而局部组件只能在其父组件中使用。 定义组件时,需要使用 Vue.component() 方法,该方法需要传入两个参数:组件名称和组件配置对象。组件名称应该采用 kebab-case(短横线分隔命名)格式,以便在 HTML 中使用。 示例代码如下: ```javascript // 定义一个名为 button-counter 的新组件 Vue.component('button-counter', { data: function () { return { count: 0 } }, template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>' }) ``` 在上述代码中,我们定义了一个名为 button-counter 的组件,该组件包含一个计数器,每次点击按钮计数器加一。 在 HTML 中使用组件时,需要使用组件名称作为自定义标签来调用组件。示例代码如下: ```html <div id="app"> <button-counter></button-counter> </div> ``` 在上述代码中,我们调用了 button-counter 组件,并将其渲染到了 id 为 app 的 div 元素中。 除了组件的 data 和 template 属性外,还可以使用 props 属性来传递组件之间的数据。使用 props 时,需要在组件的配置对象中定义 props 属性,并在 HTML 中使用 v-bind 指令来传递数据。 示例代码如下: ```javascript // 定义一个名为 todo-item 的新组件 Vue.component('todo-item', { props: ['todo'], template: '<li>{{ todo.text }}</li>' }) // 创建一个 Vue 实例 var app = new Vue({ el: '#app', data: { groceryList: [ { id: 0, text: '蔬菜' }, { id: 1, text: '水果' }, { id: 2, text: '奶酪' } ] } }) ``` 在上述代码中,我们定义了一个名为 todo-item 的组件,并使用 props 属性定义了一个名为 todo 的 prop。在 HTML 中,我们使用 v-bind 指令将 groceryList 数组中的每个对象传递给了 todo-item 组件。示例代码如下: ```html <div id="app"> <ul> <todo-item v-for="item in groceryList" v-bind:todo="item" v-bind:key="item.id"></todo-item> </ul> </div> ``` 在上述代码中,我们使用 v-for 指令遍历 groceryList 数组,并使用 v-bind 指令将数组中的每个对象传递给了 todo-item 组件。注意,我们还需要使用 v-bind:key 指令来为每个列表项指定一个唯一的 key 值。 插槽是 Vue.js 中另一个重要的概念。插槽可以让父组件在子组件中插入任意的 HTML 内容,使得组件更加灵活、可复用。 在子组件中,使用 <slot> 标签来定义插槽。在父组件中,使用子组件的自定义标签来调用组件,并在标签内部插入 HTML 内容。示例代码如下: ```javascript // 定义一个名为 alert-box 的新组件 Vue.component('alert-box', { template: ` <div class="alert-box"> <strong>Error!</strong> <slot></slot> </div> ` }) // 创建一个 Vue 实例 var app = new Vue({ el: '#app' }) ``` 在上述代码中,我们定义了一个名为 alert-box 的组件,并在组件中定义了一个插槽。在 HTML 中,我们调用了 alert-box 组件,并在标签内部插入了一些 HTML 内容。示例代码如下: ```html <div id="app"> <alert-box> <p>Something bad happened.</p> </alert-box> </div> ``` 在上述代码中,我们调用了 alert-box 组件,并在标签内部插入了一些 HTML 内容。该 HTML 内容会被插入到 alert-box 组件的插槽中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值