对于学习 Vue 的同学来说,封装 vue 组件是实现代码复用的重要一环。在 Vue 官网中非常详细地介绍了 vue 组件的相关知识,我这里简单摘取使用最频繁的几个知识点,带大家快速入门 vue 组件的使用。

快速入门

我们假设在页面上有很多地方都要用到一个计数器,与其在每个地方都实现计数器功能,不如封装一个计数器组件,随后在需要的地方引用。于是,我们定义了如下代码所示的计数器组件:

<script>
export default {
data() {
return {
count: 0
}
}
}
</script> <template>
<button @click="count++">
You clicked me {{ count }} times.
</button>
</template>

随后,我们在需要的地方引用计数器组件,如下代码所示。

<script>
import ButtonCounter from './ButtonCounter.vue' export default {
components: {
ButtonCounter
}
}
</script> <template>
<h1>Here are many child components!</h1>
<ButtonCounter />
<ButtonCounter />
<ButtonCounter />
</template>

运行效果如下图所示。

本例运行内容及效果可在这里查看:简单的计数器组件

到这里,我们就完成了一个简单地 vue 组件的封装。

传递参数

在封装组件的时候,我们可能需要向组件中传递参数,从而实现不同的业务逻辑。例如:我们需要封装一个博文的组件,我们需要向组件中传递标题和内容,这时候我们就需要用到传递参数 —— props。对于博文组件,我们对于组件的封装如下代码所示。

<script>
export default {
props: ['title']
}
</script> <template>
<h4>{{ title }}</h4>
</template>

接着,我们在页面上引用博文组件,如下代码所示。

<script>
import BlogPost from './BlogPost.vue' export default {
components: {
BlogPost
},
data() {
return {
posts: [
{ id: 1, title: 'My journey with Vue' },
{ id: 2, title: 'Blogging with Vue' },
{ id: 3, title: 'Why Vue is so fun' }
]
}
}
}
</script> <template>
<BlogPost
v-for="post in posts"
:key="post.id"
:title="post.title"
></BlogPost>
</template>

运行效果如下图所示:

本例运行内容及效果可在这里查看:传递参数的博文组件

监听事件

有时候,我们不仅希望能往组件中传递参数,也希望父组件能感知子组件的变化。例如:我们希望可以通过子组件来设置父组件的文字大小,从而动态改变文章的文字大小。这时候,我们可以在子组件中使用 $emit() 来触发事件,在父组件使用 @enlarge-text 来监听事件,如下代码所示。

// BlogPost.vue
<script>
export default {
props: ['title'],
emits: ['enlarge-text']
}
</script> <template>
<div class="blog-post">
<h4>{{ title }}</h4>
<button @click="$emit('enlarge-text')">Enlarge text</button>
</div>
</template>

如上代码所示,我们在 export defaultemits 属性中注明了该组件会抛出 enlarge-text 事件。随后,我们在按钮点击时,使用 $emit('enlarge-text') 抛出了 enlarge-text 事件。

<script>
import BlogPost from './BlogPost.vue' export default {
components: {
BlogPost
},
data() {
return {
posts: [
{ id: 1, title: 'My journey with Vue' },
{ id: 2, title: 'Blogging with Vue' },
{ id: 3, title: 'Why Vue is so fun' }
],
postFontSize: 1
}
}
}
</script> <template>
<div :style="{ fontSize: postFontSize + 'em' }">
<BlogPost
v-for="post in posts"
:key="post.id"
:title="post.title"
@enlarge-text="postFontSize += 0.1"
></BlogPost>
</div>
</template>

在上述代码中,我们在父组件中使用 @enlarge-text 监听 enlarge-text 事件。当监听到该事件后,我们将 postFontSize 的值加 0.1,从而实现动态改变文字大小的目的。

总结

关于 vue 组件的使用,props 和事件传递可以说是使用最频繁的两个功能。对于更复杂的组件来说,肯定还有更多更复杂的语法和功能。但对于初学者来说,学得够用就行,后续需要时再慢慢学习。关于 vue 组件更多内容,可以参考 vue 官网相关章节:组件基础 | Vue.js

参考资料

从零开始封装 vue 组件的更多相关文章

  1. 封装Vue组件的一些技巧

    封装Vue组件的一些技巧 本文同步在个人博客shymean.com上,欢迎关注 写Vue有很长一段时间了,除了常规的业务开发之外,也应该思考和反思一下封装组件的正确方式.以弹窗组件为例,一种实现是在需 ...

  2. 手把手教你封装 Vue 组件,并使用 npm 发布

    Vue 开发插件 开发之前先看看官网的 开发规范 我们开发的之后期望的结果是支持 import.require 或者直接使用 script 标签的形式引入,就像这样: // 这里注意一下包的名字前缀是 ...

  3. 手把手教你封装 Vue 组件并使用 NPM 发布

    Vue 开发插件 我们可以先查看Vue的插件的开发规范 我们开发的之后期望的结果是支持 import.require 或者直接使用 script 标签的形式引入,就像这样: ps: 这里注意一下包的名 ...

  4. 自己封装 vue 组件 和 插件

    vue 组件 一.组件的创建,两种方法.(本质上是1.2两种,vue文件,只是创建了一个  组件选项对象,仅是一个js对象)1.定义组件:Vue.component('button-counter', ...

  5. 从零开始搭建Vue组件库——VV-UI

    前言: 前端组件化是当今热议的话题之一,也是我们在开发单页应用经常会碰到的一个问题,现在我们有了功能非常完善的Element-UI.各个大厂也相继宣布开源XXX-UI.但是也会存在一些问题,比如每个公 ...

  6. 从零开始搭建Vue组件库 VV-UI

    前言: 前端组件化是当今热议的话题之一,也是我们在开发单页应用经常会碰到的一个问题,现在我们有了功能非常完善的Element-UI.各个大厂也相继宣布开源XXX-UI.但是也会存在一些问题,比如每个公 ...

  7. 封装 vue 组件的过程

    首先,组件可以提升整个项目的开发效率.能够把页面抽象成多个相对独立的模块,解决了我们传统项目开发的缺点:效率低,难维护,复用性等问题: 然后,使用Vue.extend方法创建一个组件,然后使用 Vue ...

  8. 如何封装使用api形式调用的vue组件

    在实际开发中一般有两种封装vue组件的方法:一种就是常用的的通过props父组件传值给子组件的方法: 子组件 父组件: 还有一种就是通过调用api的形式,下面例子是本人在实际项目中封装的一个自定义图标 ...

  9. 封装Vue Element的table表格组件

    上周分享了几篇关于React组件封装方面的博文,这周就来分享几篇关于Vue组件封装方面的博文,也好让大家能更好地了解React和Vue在组件封装方面的区别. 在封装Vue组件时,我依旧会交叉使用函数式 ...

  10. element el-table表格的vue组件二次封装(附表格高度自适应)

    基于vue的el-table表格二次封装组件方法 前言 在公司实习使用vue+element-ui框架进行前端开发,使用表格el-table较为多,有些业务逻辑比较相似,有些地方使用的重复性高,如果多 ...

随机推荐

  1. 获得lazada商品详情 API 返回值说明

    ​ item_get-获得lazada商品详情 注册开通 lazada.item_get 公共参数 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在URL中) se ...

  2. BZ全景编辑器(KRPano全景可视化编辑器, 无需编写代码, 图形化制作全景漫游)

    软件简介 BZ全景编辑器是一款KRPano全景可视化编辑工具,下载安装即可使用,无需拥有任何KRPano代码基础,便可以制作生成精美的全景漫游作品. BZ全景编辑器群:882083973 最新版软件下 ...

  3. List取指定元素

    例如: List<string> list = new List<string>(); list.Take(50).ToList();//取前50条 list.Skip(10) ...

  4. [HUBUCTF 2022 新生赛]ezPython

    附件链接:https://wwvc.lanzouj.com/iIqq218z5x0d 给了一个pyc文件 利用命令将pyc转换为py文件 uncompyle6 ezPython.pyc > ez ...

  5. std::for_each易忽略点

    以下代码为修改vector内部的每一个元素,使其每个元素大小变为原来的平方. std::vector v1{1, 2, 4, 2}; std::for_each(begin(v1), end(v1), ...

  6. open与fopen的区别

    1. 来源 从来源的角度看,两者能很好的区分开,这也是两者最显而易见的区别: open是UNIX系统调用函数(包括LINUX等),返回的是文件描述符(File Descriptor),它是文件在文件描 ...

  7. 其它——MyCat实现分库分表

    文章目录 MyCat实现分库分表 一 开源数据库中间件-MyCat 二 MyCat简介 三 MyCat下载及安装 3.1 MySQL安装与启动 3.2使用docker启动多个数据库 3.3 MyCat ...

  8. Go 复合类型之字典类型介绍

    Go 复合类型之字典类型介绍 目录 Go 复合类型之字典类型介绍 一.map类型介绍 1.1 什么是 map 类型? 1.2 map 类型特性 二.map 变量的声明和初始化 2.1 方法一:使用 m ...

  9. SaaS模式相较传统CRM系统有何优势?

    SaaS模式的CRM客户管理系统相较于传统的CRM客户管理系统更加方便灵活,更加符合如今的市场环境.它解决了传统CRM系统投入大.维护难的难题,降低了中小企业导入CRM的门槛.下面详细说说SaaS模式 ...

  10. Unity - UIWidgets 1. 从Hello world开始

    安装参照github的README.UIWidgets相当于Flutter的一个Unity实现(后面表示UIWidgets和UGUI区别时直接称"Flutter"),是把承载的所有 ...