初识Vue-组件化开发(详解各个组件)

目录

一、组件介绍

1.概念

2.特点

3.作用

4.应用

5.分类

二、组件语法

1.定义挂载vue应用

2.注册全局组件

实例

1.自定义组件

2.计数器

3.组件的复用

4.局部组件

实例

5.Prop

6.动态Prop

[7.Prop 验证](#7.Prop 验证)

三、创建组件的关键概念和语法

[1. 组件定义](#1. 组件定义)

[2. 组件选项](#2. 组件选项)

[3. 单文件组件](#3. 单文件组件)

[4. Props](#4. Props)

[5. Emit 事件](#5. Emit 事件)

四、总结


一、组件介绍

1.概念

Vue.js中的组件是可复用的Vue实例,具有自己的模板、逻辑和样式。组件允许开发者将页面分割成独立、可复用的模块,使得代码更易维护、可读性更高。

2.特点

  1. 模块化: 组件可以根据功能或UI部分进行划分,使得代码更加模块化,易于管理和维护。
  2. 可复用性: 组件可以被多次使用,不同的页面或应用中都可以引用同一个组件,提高了代码的复用性。
  3. 独立性: 每个组件都是相互独立的,组件之间的状态和逻辑不会相互影响,有利于代码的解耦和扩展。
  4. 单文件组件: Vue提供了单文件组件(.vue文件),将组件的模板、样式和逻辑封装在一个文件中,使得组件的结构更清晰,易于维护。

3.作用

  1. 页面划分: 将页面划分为独立的组件,提高了代码的组织性和可维护性。
  2. 代码复用: 将常用的UI部分或功能封装成组件,可以在不同的地方重复使用,减少了重复代码的编写。
  3. 提高开发效率: 组件化开发使得团队协作更加高效,每个成员可以专注于开发独立的组件,提高了开发效率。

4.应用

  1. Web应用开发: Vue组件广泛应用于Web应用开发中,用于构建各种UI组件、页面布局等。
  2. 移动应用开发: 结合Vue的移动端框架(如Vue Native、Weex等),可以开发跨平台的移动应用,组件在移动应用中也扮演着重要角色。
  3. 插件开发: Vue组件可以作为插件独立开发和维护,供其他开发者使用。

5.分类

  1. UI组件: 用于构建界面的各种UI元素,如按钮、表单、对话框等。
  2. 功能性组件: 实现特定功能的组件,如轮播图、导航菜单等。
  3. 布局组件: 用于页面布局的组件,如网格布局、卡片布局等。
  4. 业务逻辑组件: 实现业务逻辑的组件,如用户登录、购物车功能等。

二、组件语法

1.定义挂载vue应用

每个 Vue 应用都是通过用 createApp 函数创建的,传递给 createApp 的选项用于配置根组件。当我们挂载应用时,该组件被用作渲染的起点。

一个应用需要被挂载到一个 DOM 元素中。

以下实例我们将 Vue 应用挂载到 <div id="app"></div>,应该传入 #app:

javascript 复制代码
const RootComponent = { /* 选项 */ }
const app = Vue.createApp(RootComponent)
const vm = app.mount('#app')

2.注册全局组件

注册一个全局组件语法格式如下:

javascript 复制代码
const app = Vue.createApp({...})

app.component('my-component-name', {
  /* ... */
})

my-component-name 为组件名,/* ... */ 部分为配置选项。注册后,我们可以使用以下方式来调用组件

<my-component-name></my-component-name>

一个简单的 Vue 组件的实例:

实例
1.自定义组件
javascript 复制代码
<div id="app">
    <runoob></runoob>
</div>
 
<script>
// 创建一个Vue 应用
const app = Vue.createApp({})
 
// 定义一个名为 runoob的新全局组件
app.component('runoob', {
    template: '<h1>自定义组件!</h1>'
})
 
app.mount('#app')
</script>
2.计数器
javascript 复制代码
// 创建一个Vue 应用
const app = Vue.createApp({})

// 定义一个名为 button-counter 的新全局组件
app.component('button-counter', {
  data() {
    return {
      count: 0
    }
  },
  template: `
    <button @click="count++">
      点了 {{ count }} 次!
    </button>`
})
app.mount('#app')
</script>

3.组件的复用

你可以将组件进行任意次数的复用:

javascript 复制代码
<div id="components-demo">
  <button-counter></button-counter>
  <button-counter></button-counter>
  <button-counter></button-counter>
</div>

4.局部组件

全局注册往往是不够理想的。比如,如果你使用一个像 webpack 这样的构建系统,全局注册所有的组件意味着即便你已经不再使用一个组件了,它仍然会被包含在你最终的构建结果中。这造成了用户下载的 JavaScript 的无谓的增加。

在这些情况下,你可以通过一个普通的 JavaScript 对象来定义组件:

javascript 复制代码
const ComponentA = {
  /* ... */
}
const ComponentB = {
  /* ... */
}
const ComponentC = {
  /* ... */
}

然后在 components 选项中定义你想要使用的组件:

javascript 复制代码
const app = Vue.createApp({
  components: {
    'component-a': ComponentA,
    'component-b': ComponentB
  }
})

对于 components 对象中的每个属性来说,其属性名就是自定义元素的名字(component-a、component-b),其属性值就是这个组件的选项对象(ComponentA、ComponentB)。

我们也可以在实例选项中注册局部组件,这样组件只能在这个实例中使用:

实例

注册一个简单的局部组件 runoobA,并使用它:

javascript 复制代码
<div id="app">
    <runoob-a></runoob-a>
</div>
<script>
var runoobA = {
  template: '<h1>自定义组件!</h1>'
}
 
const app = Vue.createApp({
  components: {
    'runoob-a': runoobA
  }
})
 
app.mount('#app')
</script>

5.Prop

prop 是子组件用来接受父组件传递过来的数据的一个自定义属性。

父组件的数据需要通过 props 把数据传给子组件,子组件需要显式地用 props 选项声明 "prop":

javascript 复制代码
<div id="app">
  <site-name title="Google"></site-name>
  <site-name title="Runoob"></site-name>
  <site-name title="Taobao"></site-name>
</div>
 
<script>
const app = Vue.createApp({})
 
app.component('site-name', {
  props: ['title'],
  template: `<h4>{{ title }}</h4>`
})
 
app.mount('#app')
</script>

一个组件默认可以拥有任意数量的 prop,任何值都可以传递给任何 prop。

6.动态Prop

类似于用 v-bind 绑定 HTML 特性到一个表达式,也可以用 v-bind 动态绑定 props 的值到父组件的数据中。每当父组件的数据变化时,该变化也会传导给子组件:

javascript 复制代码
<div id="app">
  <site-info
    v-for="site in sites"
    :id="site.id"
    :title="site.title"
  ></site-info>
</div>
 
<script>
const Site = {
  data() {
    return {
      sites: [
        { id: 1, title: 'Google' },
        { id: 2, title: 'Runoob' },
        { id: 3, title: 'Taobao' }
      ]
    }
  }
}
 
const app = Vue.createApp(Site)
 
app.component('site-info', {
  props: ['id','title'],
  template: `<h4>{{ id }} - {{ title }}</h4>`
})
 
app.mount('#app')
</script>

7.Prop 验证

组件可以为 props 指定验证要求。

为了定制 prop 的验证方式,你可以为 props 中的值提供一个带有验证需求的对象,而不是一个字符串数组。例如:

javascript 复制代码
Vue.component('my-component', {
  props: {
    // 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)
    propA: Number,
    // 多个可能的类型
    propB: [String, Number],
    // 必填的字符串
    propC: {
      type: String,
      required: true
    },
    // 带有默认值的数字
    propD: {
      type: Number,
      default: 100
    },
    // 带有默认值的对象
    propE: {
      type: Object,
      // 对象或数组默认值必须从一个工厂函数获取
      default: function () {
        return { message: 'hello' }
      }
    },
    // 自定义验证函数
    propF: {
      validator: function (value) {
        // 这个值必须匹配下列字符串中的一个
        return ['success', 'warning', 'danger'].indexOf(value) !== -1
      }
    }
  }
})

当 prop 验证失败的时候,(开发环境构建版本的) Vue 将会产生一个控制台的警告。

type 可以是下面原生构造器:

  • String
  • Number
  • Boolean
  • Array
  • Object
  • Date
  • Function
  • Symbol

三、创建组件的关键概念和语法

1. 组件定义

在 Vue 中,你可以使用 Vue.component() 方法来定义一个组件。例如:

javascript 复制代码
Vue.component('my-component', {
  // 组件选项
})

2. 组件选项

组件选项是一个包含组件配置的对象,它可以包含以下选项:

  • data: 一个函数,返回组件的初始数据。每个组件必须将 data 返回为一个对象。
  • props: 用于接收父组件传递的数据。可以是数组或对象。
  • methods: 包含组件中使用的方法。
  • computed: 计算属性,可以根据其他数据的变化自动计算返回值。
  • watch: 监听数据变化并执行相应的操作。
  • template: 组件的模板,可以是字符串模板、template 元素或单文件组件。
  • components: 包含组件引用的对象,用于注册子组件。
  • created(): 组件创建时执行的钩子函数。
  • mounted(): 组件挂载到 DOM 后执行的钩子函数。
  • 等等...

3. 单文件组件

Vue 提供了单文件组件 (.vue),它将模板、样式和逻辑封装在一个文件中。单文件组件通常包含三个部分:

  • <template>: 组件的 HTML 模板。
  • <script>: 组件的 JavaScript 代码,包含组件选项。
  • <style>: 组件的样式。

4. Props

Props 是父组件传递给子组件的数据。子组件通过 props 接收数据并在自己的作用域内使用。例如:

javascript 复制代码
// 父组件
<my-component :message="parentMsg"></my-component>

// 子组件
props: ['message']

5. Emit 事件

子组件可以通过 $emit() 方法触发自定义事件,并且可以传递数据给父组件。父组件可以通过监听子组件的事件来执行相应的操作。例如:

javascript 复制代码
// 子组件
this.$emit('my-event', eventData)

// 父组件
<my-component @my-event="handleEvent"></my-component>

四、总结

  1. 组件定义与注册

    • 使用 Vue.component() 方法或单文件组件 (.vue) 定义组件。
    • 使用 Vue 实例中的 components 选项或局部/全局注册组件。
  2. 组件通信

    • 使用 Props:父组件向子组件传递数据。
    • 使用 Emit 事件:子组件向父组件发送消息。
  3. 组件生命周期

    • 生命周期钩子函数:created、mounted、updated、destroyed 等。
  4. 组件选项

    • data: 组件的初始数据。
    • props: 接收父组件传递的数据。
    • methods: 包含组件中使用的方法。
    • computed: 根据其他数据计算返回值的计算属性。
    • watch: 监听数据变化并执行相应的操作。
    • template: 组件的模板。
    • components: 注册子组件。
  5. 单文件组件

    • 使用 .vue 文件封装组件的模板、样式和逻辑。
  6. 组件复用与组合

    • 提高代码复用性,将常用的功能封装为组件。
    • 使用 mixin 或 extends 实现组件的复用。
    • 使用插槽 (slot) 实现组件的组合。
  7. 动态组件

    • 使用动态组件 (dynamic component) 根据条件渲染不同的组件。
  8. 组件样式

    • 使用作用域样式 (scoped style) 使样式仅在当前组件中生效。
  9. 组件库与框架

    • 使用现有的组件库或框架加速开发。
    • 如 Element UI、Vuetify、Bootstrap Vue 等。
  10. 测试与调试

    • 编写单元测试以确保组件功能的正确性。
    • 使用 Vue DevTools 调试 Vue.js 应用程序。
相关推荐
xiao-xiang6 分钟前
jenkins-通过api获取所有job及最新build信息
前端·servlet·jenkins
C语言魔术师23 分钟前
【小游戏篇】三子棋游戏
前端·算法·游戏
小周不摆烂28 分钟前
探索JavaScript前端开发:开启交互之门的神奇钥匙(二)
javascript
匹马夕阳2 小时前
Vue 3中导航守卫(Navigation Guard)结合Axios实现token认证机制
前端·javascript·vue.js
你熬夜了吗?2 小时前
日历热力图,月度数据可视化图表(日活跃图、格子图)vue组件
前端·vue.js·信息可视化
我想学LINUX3 小时前
【2024年华为OD机试】 (A卷,100分)- 微服务的集成测试(JavaScript&Java & Python&C/C++)
java·c语言·javascript·python·华为od·微服务·集成测试
screct_demo3 小时前
詳細講一下在RN(ReactNative)中,6個比較常用的組件以及詳細的用法
javascript·react native·react.js
桂月二二8 小时前
探索前端开发中的 Web Vitals —— 提升用户体验的关键技术
前端·ux
CodeClimb9 小时前
【华为OD-E卷 - 第k个排列 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
沈梦研9 小时前
【Vscode】Vscode不能执行vue脚本的原因及解决方法
ide·vue.js·vscode