Vue.js 组件开发知识详解

news2024/11/28 5:38:33

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:Java案例分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:Vue.js 组件开发知识详解

文章目录

    • 1、组件的基本结构
    • 2、组件通信
    • 3、组件生命周期
    • 4、计算属性和监听器
    • 5、插槽
    • 6、动态组件
    • 7、过渡和动画
    • 8、组件库和UI框架

在这里插入图片描述

1、组件的基本结构

Vue 组件的基本结构通常包含三个部分:模板 (template)脚本 (script) 样式 (style)

模板 (template):模板部分定义了组件的结构和布局,通常使用 HTML 语法编写,可以包含 Vue 的模板语法,用来展示数据和交互。在单文件组件 (.vue 文件) 中,模板部分以 <template> 标签包裹。

脚本 (script):脚本部分包含了组件的逻辑和行为,通常使用 JavaScript 编写,可以包含组件的数据、方法、生命周期钩子等。在单文件组件中,脚本部分以 <script> 标签包裹。

样式 (style):样式部分定义了组件的外观样式,通常使用 CSS 编写,可以包含组件的样式规则和样式预处理器。在单文件组件中,样式部分以 <style> 标签包裹。

使用单文件组件 (.vue 文件) 可以更好地组织和管理 Vue 组件,提高代码的可维护性和可读性。通过 Vue.component() 方法也可以定义全局或局部的组件,但相比之下,单文件组件更为推荐。单文件组件的结构清晰,每个部分都有明确的作用,有利于团队协作和开发效率。

代码示例

<template>
  <div class="example-component">
    <h2>{{ message }}</h2>
    <button @click="changeMessage">Change Message</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello, Vue!'
    };
  },
  methods: {
    changeMessage() {
      this.message = 'Hello, World!';
    }
  }
};
</script>

<style scoped>
.example-component {
  background-color: #f0f0f0;
  padding: 20px;
}

h2 {
  color: blue;
}
</style>

在上面的示例中:

  • <template> 标签定义了组件的模板结构,显示了一个包含标题和按钮的简单组件。
  • <script> 标签包含了组件的逻辑部分,包括数据 (data) 和方法 (methods) 的定义。
  • <style scoped> 标签定义了组件的样式,其中的样式规则只作用于当前组件,不会影响到其他组件。

2、组件通信

在 Vue 中,组件之间的通信可以分为父子组件通信和非父子组件通信两种情况。

父子组件通信:

  • 通过 props 向子组件传递数据:父组件可以通过 props 向子组件传递数据,子组件通过 props 接收数据进行渲染。
  • 通过事件向父组件传递数据:子组件可以通过 $emit 触发事件,并向父组件传递数据。

非父子组件通信:

  • 使用事件总线:可以创建一个空的 Vue 实例作为事件总线,通过 $emit 和 $on 来进行组件间通信。

  • 使用 Vuex 状态管理:Vuex 是 Vue 的状态管理模式,可以在多个组件之间共享状态。

下面是一个简单的示例,演示了父子组件通信和非父子组件通信的方式:

// 父组件 Parent.vue
<template>
  <div>
    <Child :message="parentMessage" @childEvent="handleChildEvent" />
  </div>
</template>

<script>
import Child from './Child.vue';

export default {
  data() {
    return {
      parentMessage: 'Message from parent'
    };
  },
  components: {
    Child
  },
  methods: {
    handleChildEvent(data) {
      console.log('Received data from child:', data);
    }
  }
};
</script>

// 子组件 Child.vue
<template>
  <div>
    <h2>{{ message }}</h2>
    <button @click="sendDataToParent">Send Data to Parent</button>
  </div>
</template>

<script>
export default {
  props: ['message'],
  methods: {
    sendDataToParent() {
      this.$emit('childEvent', 'Data from child');
    }
  }
};
</script>

在上面的示例中,父组件通过 props 将数据传递给子组件,子组件通过 $emit 触发事件向父组件传递数据。对于非父子组件通信,可以使用事件总线或 Vuex 状态管理来实现跨组件通信。

3、组件生命周期

Vue 组件的生命周期钩子函数包括 created、mounted、updated、destroyed 等,用于在组件不同阶段执行特定的逻辑。

  • created:在实例被创建之后执行,可以在这个阶段进行数据初始化等操作。
  • mounted:在实例被挂载到 DOM 后执行,可以在这个阶段进行 DOM 操作。
  • updated:在数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之后。
  • destroyed:在实例被销毁时执行,可以在这个阶段进行清理操作,如清除定时器等。

下面是一个简单的示例,演示了组件生命周期钩子函数的使用:

<template>
  <div>
    <h2>{{ message }}</h2>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello, Vue!'
    };
  },
  created() {
    console.log('Component created');
  },
  mounted() {
    console.log('Component mounted');
  },
  updated() {
    console.log('Component updated');
  },
  destroyed() {
    console.log('Component destroyed');
  },
  methods: {
    changeMessage() {
      this.message = 'Hello, World!';
    }
  }
};
</script>

在上面的示例中,当组件被创建、挂载、更新和销毁时,对应的生命周期钩子函数会被调用,并在控制台输出相应的信息。开发者可以根据需要在这些生命周期钩子函数中执行特定的逻辑操作,以实现更精细的控制和管理组件的行为。

4、计算属性和监听器

在 Vue 中,可以使用计算属性 (computed) 来根据响应式数据动态计算属性的值,同时也可以使用监听器 (watch) 来监听数据的变化并执行相应的操作。

  • 计算属性 (computed):计算属性是基于它们的依赖进行缓存的。只有在依赖发生改变时它们才会重新求值。计算属性在模板中以同步属性的方式使用,便于数据的动态计算。

  • 监听器 (watch):监听器是用来监听数据的变化并执行相应的操作。可以监听一个数据的变化,也可以监听多个数据的变化。当数据发生变化时,可以执行一些异步或复杂的操作。

下面是一个简单的示例,演示了计算属性和监听器的用法:

<template>
  <div>
    <p>Original message: {{ message }}</p>
    <p>Reversed message: {{ reversedMessage }}</p>
    <input v-model="message" placeholder="Enter a message">
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello, Vue!'
    };
  },
  computed: {
    reversedMessage() {
      return this.message.split('').reverse().join('');
    }
  },
  watch: {
    message(newValue, oldValue) {
      console.log('Message changed from', oldValue, 'to', newValue);
    }
  }
};
</script>

在上面的示例中,reversedMessage 是一个计算属性,根据 message 的值动态计算出反转后的消息。同时,通过 watch 监听了 message 的变化,当 message 发生变化时,会在控制台输出变化前后的值。这样可以方便地对数据的变化进行监控和处理。

5、插槽

在 Vue.js 中,插槽 (slot) 是一种机制,用于在父组件中将内容插入到子组件中指定的位置,从而实现灵活的组件复用和内容分发。

  • 具名插槽:允许父组件在子组件中指定具名插槽的位置,从而插入特定内容。
  • 作用域插槽:允许子组件向父组件传递数据,使得父组件可以在插槽内容中访问子组件的数据。

下面是一个简单的示例,演示了具名插槽和作用域插槽的用法:

// Parent.vue
<template>
  <div>
    <Child>
      <template v-slot:header>
        <h2>This is the header</h2>
      </template>
      <template v-slot:footer>
        <p>This is the footer</p>
      </template>
      <template v-slot:default>
        <p>This is the default content</p>
      </template>
    </Child>
  </div>
</template>

<script>
import Child from './Child.vue';

export default {
  components: {
    Child
  }
};
</script>

// Child.vue
<template>
  <div>
    <slot name="header"></slot>
    <slot></slot>
    <slot name="footer"></slot>
  </div>
</template>

在上面的示例中,父组件 Parent 中包含了一个子组件 Child,并在 Child 组件中定义了具名插槽 header、footer 和默认插槽。父组件通过具名插槽的方式向子组件传递内容,并在子组件中指定插槽的位置进行内容分发。这样可以实现灵活的组件复用和内容分发。

6、动态组件

在 Vue 中,动态组件允许在多个组件之间动态切换,从而实现根据条件加载不同的组件。通过使用 元素和动态绑定的方式,可以实现动态组件的切换。同时,可以使用 组件来缓存动态组件的状态,以提高性能。

下面是一个简单的示例,演示了动态组件的切换和使用 缓存组件状态:

<template>
  <div>
    <button @click="toggleComponent">Toggle Component</button>
    <keep-alive>
      <component :is="currentComponent"></component>
    </keep-alive>
  </div>
</template>

<script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';

export default {
  data() {
    return {
      currentComponent: 'ComponentA',
      components: {
        ComponentA,
        ComponentB
      }
    };
  },
  methods: {
    toggleComponent() {
      this.currentComponent = this.currentComponent === 'ComponentA' ? 'ComponentB' : 'ComponentA';
    }
  }
};
</script>

在上面的示例中,通过点击按钮来切换当前显示的组件,实现了动态组件的切换。使用 元素并动态绑定 :is 属性来实现根据 currentComponent 的值加载不同的组件。同时,使用 组件包裹 ,可以缓存动态组件的状态,避免每次切换组件时重新渲染,提高性能。

7、过渡和动画

在 Vue 中,可以通过过渡系统为组件的进入、离开和列表操作添加过渡效果,从而实现动画效果。Vue 提供了多种方式来实现过渡和动画,包括使用 CSS 过渡、CSS 动画或 JavaScript 钩子函数。

  • CSS 过渡:通过在组件的 CSS 样式中定义过渡效果,实现组件的平滑过渡。
  • CSS 动画:通过在组件的 CSS 样式中定义动画效果,实现更复杂的动画效果。
  • JavaScript 钩子函数:Vue 提供了一些 JavaScript 钩子函数,如 beforeEnter、enter、leave 等,可以在过渡的不同阶段执行自定义的动画逻辑。

下面是一个简单的示例,演示了如何使用 CSS 过渡和 JavaScript 钩子函数来实现动画效果:

<template>
  <div>
    <button @click="toggle">Toggle</button>
    <transition name="fade" @before-enter="beforeEnter" @enter="enter" @leave="leave">
      <p v-if="show">This is a transition example</p>
    </transition>
  </div>
</template>

<script>
export default {
  data() {
    return {
      show: false
    };
  },
  methods: {
    toggle() {
      this.show = !this.show;
    },
    beforeEnter(el) {
      el.style.opacity = 0;
    },
    enter(el, done) {
      let opacity = 0;
      const interval = setInterval(() => {
        opacity += 0.1;
        el.style.opacity = opacity;
        if (opacity >= 1) {
          clearInterval(interval);
          done();
        }
      }, 50);
    },
    leave(el, done) {
      let opacity = 1;
      const interval = setInterval(() => {
        opacity -= 0.1;
        el.style.opacity = opacity;
        if (opacity <= 0) {
          clearInterval(interval);
          done();
        }
      }, 50);
    }
  }
};
</script>

<style>
.fade-enter-active, .fade-leave-active {
  transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {
  opacity: 0;
}
</style>

在上面的示例中,通过 组件包裹需要过渡的元素,并定义了过渡的名称为 fade。在 CSS 中定义了过渡效果,同时在 JavaScript 中使用钩子函数 beforeEnter、enter 和 leave 来实现自定义的动画逻辑。点击按钮时,可以看到元素的出现和消失都有渐变的动画效果。

8、组件库和UI框架

使用第三方组件库和 UI 框架可以加速开发过程,同时提供了丰富的组件和样式,帮助开发者快速构建美观的界面。常见的 Vue 第三方组件库和 UI 框架包括 Element UI、Vuetify、Ant Design Vue 等。

下面以 Element UI 为例,演示如何使用第三方组件库来构建界面:

  • 安装 Element UI:首先需要安装 Element UI,可以通过 npm 或 yarn 进行安装。
npm install element-ui
  • 引入 Element UI:在项目中引入 Element UI 的 CSS 和 JS 文件。
import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';

Vue.use(ElementUI);
  • 使用 Element UI 组件:在 Vue 组件中使用 Element UI 提供的组件。
<template>
  <div>
    <el-button type="primary" @click="handleClick">Click me</el-button>
    <el-dialog :visible.sync="dialogVisible" title="Dialog Title">
      <p>This is a dialog content</p>
    </el-dialog>
  </div>
</template>

<script>
export default {
  data() {
    return {
      dialogVisible: false
    };
  },
  methods: {
    handleClick() {
      this.dialogVisible = true;
    }
  }
};
</script>

在上面的示例中,我们使用了 Element UI 的 el-button 和 el-dialog 组件,实现了一个点击按钮弹出对话框的功能。通过引入 Element UI,我们可以快速使用现成的组件来构建界面,提高开发效率。其他第三方组件库和 UI 框架的使用方式也类似,开发者可以根据项目需求选择合适的组件库来加速开发过程。


  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述

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

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

相关文章

为什么我可以做系统架构师?

人人都可以做产品经理&#xff0c;但是却没有人随随便便成为系统架构师&#xff0c;系统架构师为什么这么稀缺&#xff0c;因为系统架构师要求的能力是十分全面的&#xff0c;首先技术基本功要非常扎实&#xff0c;其次是你的统筹能力&#xff0c;一个项目交到你手上&#xff0…

软件管理【1.10】

软件管理【1.10】 13、软件管理13.1.包管理工具rpm13.2.yum和dnf13.2.1.配置yum源13.2.2.只下载安装包,不安装13.2.3.配置本地光盘ISO文件安装13.2.4.配置阿里云epel源13.2.5.base-for-centos7.repo13.2.6.base-for-rocky8.repo13.3.搭建私有yum仓库13.3.1.Apache实现网战功能…

力扣题解 1928

题目描述&#xff08;困难&#xff09; 规定时间内到达终点的最小费用 一个国家有 n 个城市&#xff0c;城市编号为 0 到 n - 1 &#xff0c;题目保证 所有城市 都由双向道路 连接在一起 。道路由二维整数数组 edges 表示&#xff0c;其中 edges[i] [xi, yi, timei] 表示城市…

提示词工程实践

本讲义主要以text2SQL为场景进行讲解&#xff0c;包括提示词的编写和闭源模型调用、本地开源模型部署调用以及基于开源模型的微调。 回顾下大模型学习思路&#xff1a; 1. 开发环境准备 1.1 代码 代码位于【算法管理】->【公共算法】->【prompts_engineering_04】&…

leetcode每日一题day17(24.9.27)——每种字符最少取k个

思路&#xff1a;看到题目就想到了搜索&#xff0c; 广搜&#xff1a;满足要求就往后搜&#xff0c;最后返回搜索队列达到过的最大深度&#xff0c; 深搜&#xff1a;一直往一边取&#xff0c;搜索完所有可能&#xff0c;并在此基础上进行剪枝&#xff0c;剪枝方案有如果某一分…

大师级GC调优:剖析高并发系统的垃圾回收优化实战

前期准备 大家开始前一定要对VisualVM、Jmeter这两款工具有所了解&#xff01; 1. 下载安装VisualVM&#xff0c;以便后续调优分析。JDK1.8及之前所在目录的bin目录下有自带的VisualVM&#xff0c;JDK1.8以后需要自行手动安装下载。 下载地址&#xff1a;https://visualvm.git…

模型的深度优化

文章目录 一、测试模型是否正确二、图形打印直观观察三、保存训练模型四、正确率&#xff08;仅使用于分类问题&#xff09; 一、测试模型是否正确 本文承接我的上一篇文章完整网络模型训练&#xff08;一&#xff09; 运用测试数据集&#xff08;test_dataloader&#xff09;…

第二十一章 (动态内存管理)

1. 为什么要有动态内存分配 2. malloc和free 3. calloc和realloc 4. 常⻅的动态内存的错误 5. 动态内存经典笔试题分析 6. 总结C/C中程序内存区域划分 1.为什么要有动态内存管理 我们目前已经掌握的内存开辟方式有 int main() {int num 0; //开辟4个字节int arr[10] …

全局安装cnpm并设置其使用淘宝镜像的仓库地址(地址最新版)

npm、cnpm和pnpm基本概念 首先介绍一下npm和cnpm是什么&#xff0c;顺便说一下pnpm。 npm npm&#xff08;Node Package Manager&#xff09;是Node.js的默认包管理器&#xff0c;用于安装、管理和分享JavaScript代码包。它是全球最大的开源库生态系统之一&#xff0c;提供了数…

centos环境安装JDK详细教程

centos环境安装JDK详细教程 一、前期准备二、JDK安装2.1 rpm方式安装JDK2.2 zip方式安装JDK2.3 yum方式安装JDK 本文主要说明CentOS下JDK的安装过程。JDK的安装有三种方式&#xff0c;用户可根据实际情况选择&#xff1a; 一、前期准备 查看服务器操作系统型号&#xff0c;执…

YOLOv7改进之主干DAMOYOLO结构,结合 CReToNeXt 结构,打造高性能检测器

一、DAMOYOLO理论部分 论文地址:2211.15444 (arxiv.org) 在本报告中,我们提出了一种快速准确的对象检测方法,称为 DAMO-YOLO,它实现了比最先进的 YOLO 系列更高的性能。DAMO-YOLO 是从 YOLO 扩展而来的,具有一些新技术,包括神经架构搜索 (NAS)、高效的重新参数化广义 …

【Linux】用虚拟机配置Ubuntu 24.04.1 LTS环境

目录 1.虚拟机安装Ubuntu系统 2.Ubuntu系统的网络配置 3.特别声明 首先我们先要下载VMware软件&#xff0c;大家自己去下啊&#xff01; 1.虚拟机安装Ubuntu系统 我们进去之后点击创建新的虚拟机&#xff0c;然后选择自定义 接着点下一步 再点下一步 进入这个界面之后&…

[C++]使用纯opencv部署yolov11目标检测onnx模型

yolov11官方框架&#xff1a;https://github.com/ultralytics/ultralytics 【算法介绍】 在C中使用纯OpenCV部署YOLOv11进行目标检测是一项具有挑战性的任务&#xff0c;因为YOLOv11通常是用PyTorch等深度学习框架实现的&#xff0c;而OpenCV本身并不直接支持加载和运行PyTor…

Python+Matplotlib展示单射、双射、满射

import matplotlib.pyplot as pltplt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负号def create_function_plot(ax, title, x, y, connections):ax.set_xlim(0, 5)ax.set_ylim(0, 5)ax.set_aspect…

UE4 材质学习笔记01(什么是着色器/PBR基础)

1.什么是shader 着色器是控制屏幕上每个像素颜色的代码&#xff0c;这些代码通常在图形处理器上运行。 现如今游戏引擎使用先进的基于物理的渲染和照明。而且照明模型模型大多数是被锁定的。 因此我们创建着色器可以控制颜色&#xff0c;法线&#xff0c;粗糙度&#xff0c;…

十一假期不停歇-学习ROS第二天

一、自动修改环境变量 source install/setup.bash 这句指令可不重复添加环境变量&#xff0c;直接运行就可以。 从左右图即可即可看出有所不同的。以后写完功能包发现不存在那就source一下就好了。 实际上它运行的是 python3.10那里的功能包与节点 我们在创建完功能包会出…

python-矩阵转置/将列表分割成块/和超过N的最短子数组

一&#xff1a;矩阵转置 题目描述 输入一个 n 行 m 列的矩阵 A&#xff0c;输出它的转置 AT。输入 第一行包含两个整数 n 和 m&#xff0c;表示矩阵 A 的行数和列数。1≤n≤100&#xff0c;1≤m≤100。接下来 n 行&#xff0c;每行 m 个整数&#xff0c;表示矩阵 A 的元素。相邻…

别再为开题报告发愁了,ChatGPT可以助力你高效完成!

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 面对开题报告时&#xff0c;我们常常感到迷茫和压力。如何清晰地表达研究目的、梳理文献综述、明确研究问题与假设&#xff0c;以及构建合理的研究方法&#xff0c;这些环节都对开题报告…

OpenCV-图像拼接

文章目录 一、基本原理二、步骤三、代码实现1.定义函数2.读取图像3.图像配准&#xff08;1&#xff09;.特征点检测&#xff08;2&#xff09;.特征匹配 4.透视变换5.图像拼接 四、图像拼接的注意事项 图像拼接是一种将多张有重叠部分的图像合并成一张无缝的全景图或高分辨率图…

蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555

蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555 第一节 硬件解读第二节 CubeMx配置第三节 代码1&#xff0c;脉冲部分代码2&#xff0c;ADC部分代码![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/57531a4ee76d46daa227ae0a52993191.png) 第一节 …