如何构建出色的Vue组件

2023-05-16

很少有人最初编写Vue组件时打算将其开源。我们大多数人开始为自己编写组件的原因:我们有一个问题,然后决定通过构建一个组件来解决它。

有时我们发现自己想要在代码库的新位置解决相同的问题,所以我们提取组件并对其进行重构,使其可重用。然后我们想在一个不同的项目中使用它,所以我们把它移到一个独立的包中。然后我们想“嘿,为什么不把这个分享给全世界呢?”,所以我们开放了组件的源代码。

一方面,这意味着对于任何在Vue工作的人来说,都有大量且不断增长的开源组件可用性(在npmjs.com上搜索“Vue”,会发现超过12000个包)。

另一方面,由于这些组件中的大多数都是从特定的环境演化而来的,并且并不是所有人都有跨许多环境重用组件的设计经验,所以这些组件中的许多都不能很好地利用Vue生态系统。

"play nice"是什么意思?在高层次上,它意味着以Vue开发人员觉得自然的方式工作,并且易于扩展和集成到任何类型的应用程序中。

在探索了广泛的开源组件之后,我认为下面是如何制作一个运行良好的Vue组件:

  1. 实现v模型兼容性

  2. 对事件透明

  3. 将属性分配给正确的元素

  4. 接受键盘导航的浏览器规范

  5. 优先使用事件而不是回调

  6. 限制在组件样式

实现v模型兼容性

对于本质上是表单字段的组件——无论是自动完成搜索字段、日历日期字段,还是在单个字段周围应用附加功能以允许用户指定数据的任何其他字段——惯用性的最重要方法之一是支持v-model。

根据组件上的vue指南,组件上的v-model实际上通过传入值属性和应用输入事件处理程序来工作。

例如,如果我们实现了一个包装输入的日期选择器,我们将使用值prop初始化我们的datepicker,并在选择时发出一个输入事件,如下所示:

import datepicker from 'my-magic-datepicker';

export
default {
        props:
        ['value'],
        mounted() {
            datepicker(this.$el, {
                date: this.value,
                onDateSelected: (date) = >{
                    this.$emit('input', date);
                },
            });
        }
    }

对事件透明

为了实现v模型,组件需要实现输入事件。但其他活动呢?比如单击事件、键盘处理等等?虽然原生事件作为HTML冒泡,但是Vue的事件处理在默认情况下并不冒泡。

例如,除非我做一些具体的事情,否则这是行不通的:

<my-textarea-wrapper @focus="showFocus">

除非我们在实际发出焦点事件的包装器组件中编写代码,否则将永远不会调用showFocus事件处理程序。然而,Vue确实为我们提供了一种通过编程访问应用于组件的侦听器的方法,因此我们可以将它们分配到正确的位置:$listener对象。

再一想,原因是显而易见的:这允许我们将侦听器传递到组件中的正确位置。例如,我们的文本区域包装组件:

<div class="my-textarea-wrapper">
  <textarea v-on="$listeners"></textarea>
</div>

现在发生在textarea上的事件就是那些被传递的事件。

为正确的元素分配属性

如何处理属性,例如用于文本区域的行或用于在任何元素上添加简单工具提示的标题标记?

默认情况下,Vue接受应用于组件的属性,并将它们放在组件的根元素上。这经常发生,但并不总是你想要的。然而,如果我们再次从上面查看textarea包装器,在这种情况下,将属性应用到textarea本身而不是div将更有意义。

为此,我们告诉组件默认情况下不要应用这些属性,而是直接使用$attrs对象应用它们。在我们的JavaScript:

export
default {
        inheritAttrs:
        false,
    }

然后在我们的模板中:

<div class="my-textarea-wrapper">
  <textarea v-bind="$attrs"></textarea>
</div>

接受键盘导航的浏览器规范

可访问性和键盘导航是web开发中最常被遗忘的部分之一,如果您编写的组件是为了在生态系统中发挥良好的作用,那么正确使用它们是最重要的事情之一。

从根本上说,这意味着要确保组件符合浏览器规范:tab键应该允许选择表单字段。Enter通常用于激活按钮或链接。

在W3C网站上可以找到通用组件的完整键盘导航建议列表。遵循这些建议将允许您的组件在任何应用程序中使用,而不仅仅是那些不关心可访问性的应用程序。

优先使用事件而不是回调

当涉及到从组件到其父组件的数据和用户交互的通信时,有两个常见的选项:道具中的回调函数和事件。由于Vue的自定义事件不像原生浏览器事件那样弹出,所以这两个事件在功能上是等价的,但对于可重用组件,我几乎总是建议在回调期间使用事件。为什么?

在Fullstack Radio的一期节目中,Vue核心团队成员Chris Fritz给出了以下理由:

  1. 使用事件使父母可以非常清楚地知道什么。它在“我们从父母那里获得的东西”和“我们发送给父母的东西”之间创造了明确的分离。

  2. 您可以直接在事件处理程序中使用表达式,从而为简单的情况提供极其紧凑的事件处理程序

  3. 它更具惯用性--Vue示例和文档倾向于使用事件从组件到其父组件进行通信。

幸运的是,如果您当前正在使用回调函数方法,则可以很容易地修改组件以发出事件。使用回调的组件可能如下所示:

// my-custom-component.vue
export
default {
        props:
        ['onActionHappened', ...] methods() {
            handleAction() {... // your custom code
                if (typeof this.onActionHappened === 'function') {
                    this.onActionHappened(data);
                }
            }
        }
    }

然后当它被包含时,它看起来像:

<my-custom-component :onActionHappened="actionHandler" />

更改为基于事件的方法将如下所示:

// my-custom-component.vue
export
default {
        methods() {
            handleAction() {... // your custom code
                this.$emit('action-happened', data);
            }
        }
    }

父结点会变成:

<my-custom-component @action-happened="actionHandler" />

限制组件内部样式

Vue的单文件组件结构允许我们将样式直接嵌入到组件中,特别是当与范围相结合时,它为我们提供了一种很好的方式,以一种不会影响应用程序其他部分的方式交付完全打包的样式化组件。

由于该系统的强大功能,将所有组件样式放入组件并运送完全样式的组件可能很诱人。而且因为组件样式通常包含在全局样式表之后,所以它可能会变成一个特殊的噩梦来覆盖它。

为了防止这种情况,我建议您的组件(颜色,边框,阴影等)在结构上不需要的任何CSS应该从组件文件本身中排除,或者可以关闭。相反,请考虑发布可自定义的SCSS部分,以便用户根据自己的内容进行自定义。

仅运送SCSS的缺点是它需要组件的用户将SCSS拉入他们的样式表编译中,或者看到一个非常简单的组件。为了充分利用这两个方面,您可以使用可以通过支柱关闭的类来为您的文件内样式设置范围,以便为想要自定义样式的用户提供支持。

如果您将SCSS构建为mixin,则可以使用相同的SCSS partial,您的用户可以使用它来获得更多自定义样式。

<template>
  <div :class="isStyledClass">
    <!-- my component --></div>
</template>

然后在JavaScript中:

export
default {
        props:
        {
            disableStyles:
            {
                type:
                Boolean,
            default:
                false
            }
        },
        computed: {
            isStyledClass() {
                if (!this.disableStyles) {
                    return 'is-styled';
                }
            },
        }

然后,您可以

@import 'my-component-styles';
.is - styled {
         @include my - component - styles();
}

这将允许开箱即用的样式是无论你的愿望,但用户想要定制不再需要创建高度专一覆盖,他们只是关闭样式通过设置disableStyles道具为真,可以使用mixin的设置或从头开始重塑自己的一切纯粹。

更多web开发知识,请查阅 HTML中文网 !!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何构建出色的Vue组件 的相关文章

  • 虚拟机VMware和Ubuntu的安装与配置教程(超详细,实验可行)

    网上各类教程很多 xff0c 但总有缺漏的地方 在这里我参考了一个比较详细的教程 xff0c 并针对我第一次安装时遇到的问题 xff0c 对该教程进行补充 xff08 主要在安装源的部分及其他细节 xff09 文章目录 一 安装虚拟机和Ub
  • 【Pytorch图像分类】搭建卷积神经网络(CNN)和使用迁移学习(Transfer Learning)实现图片识别

    1 摘要 图像分类 xff0c 也可以称作图像识别 xff0c 顾名思义 xff0c 就是辨别图像中的物体属于什么类别 核心是从给定的分类集合中给图像分配一个标签的任务 实际上 xff0c 这意味着我们的任务是分析一个输入图像并返回一个将图
  • 基于STM32F407四旋翼无人机(一)

    第一次写博客 xff0c 可能有很多地方写的不好 xff0c 请大家见谅 xff0c 这次想分享一下毕业做的一个毕业设计 基于STM32F407四旋翼无人机控制系统 的一些过程 我会最开始的模块程序编写来较为详细的讲解 刚开始先说一下飞控都
  • 关于线性卡尔曼滤波详细讲解(二)--GPS融合IMU数据

    上次我们说了卡尔曼最核心的五个公式 xff0c 还有一些上次没有说的东西 xff0c 这次也补全 xff0c 其实在我们实际需求中 xff0c 只知道这五个公式 xff0c 却不知道怎么去根据自己的需求去初始化各种状态转移矩阵之类的 xff
  • 基于STM32F407四旋翼无人机---MS5611气压计(三)

    基于STM32F407四旋翼无人机 MS5611气压计 xff08 三 xff09 1 关于MS5611的基本介绍2 通过IIC获取气压计数据3 转化为相对高度 1 关于MS5611的基本介绍 2 通过IIC获取气压计数据 3 转化为相对高
  • mavlink协议从入门到放弃(一)

    mavlink协议从入门到放弃 xff08 一 xff09 什么是MAVLINK协议网站和参考资料MAVLINK简介 MAVLINK协议包结构协议结构mavlink协议解析 最近比较忙 xff0c 搞了个项目用到了mavlink协议 xff
  • VSCode如何上传代码到git

    VSCode新建分支方式 先看一下结构 这里是一个改动后上传git时的目录 xff1a 修改代码放入暂更改区 结果如下图 此时 xff1a 更改 下面修改的内容已经移到了 暂存的更改 下面 代码Commit 代码推送到远程分支 注意 xff
  • C++中运算符重载需要遵循的规则

    一 C 43 43 中运算符重载需要遵循的规则 1 并不是所有的运算符都可以重载 能够重载的运算符包括 xff1a 43 amp 61 lt gt 43 61 61 61 61 61 61 amp 61 61 lt lt gt gt lt
  • novnc+vncserver访问docker容器桌面

    https blog csdn net u012829611 article details 72576493 utm medium 61 distribute pc relevant t0 none task blog BlogComme
  • Apache阶段二-

    一 Apache 主要配置文件注释 Apache的主配置文件 xff1a etc httpd conf httpd conf 默认站点主目录 xff1a var www html Apache服务器的配置信息全部存储在主配置文件 etc h
  • FreeRTOS基本教程零:STM32 FReeRTOS 移植流程

    一 资料准备 FreeRTOS源码下载地址 xff1a https github com FreeRTOS FreeRTOS https github com FreeRTOS FreeRTOS 我移植的是FreeRTOSv9 0 0 st
  • ROS自学实践(4):使用GAZEBO进行物理仿真

    rviz中的仿真只是视觉上的仿真 xff0c 不能称得上物理仿真 xff0c gazebo是真正意义上的三维物理仿真平台 xff0c 可以在里面创建环境等相关信息 xff0c 方便以后的建模和导航 1 向xacro模型文件中添加惯性矩阵和碰
  • ROS自学实践(5):GAZEBO建模及添加相机和激光雷达传感器并进行仿真

    在搭建完机器人小车的模型之后 xff0c 需要向其添加传感器 xff0c 以便提取传感器的数据 xff0c 进行后续的工作 一 相机 1 添加camera gazebo xacro文件 同添加机器人模型一样 xff0c 添加一个相机也需要进
  • 使用CSS禁用链接

    想要使用CSS禁用链接 xff0c 可以使用pointer events属性 xff0c 该属性设置在单击元素时页面中的元素是否必须响应 下面本篇文章就来给大家介绍一下pointer events属性 xff0c 希望对大家有所帮助 CSS
  • 使用CSS将文字显示在水平线中间

    如何使用CSS将文字显示在水平线中间 xff1f 下面本篇文章就来给大家介绍使用CSS实现文字显示在水平线中间效果的方法 xff0c 希望对大家有所帮助 CSS提供了在网页中间制作包含文字或图像的水平线以使其具有吸引力的功能 xff0c 这
  • 使用CSS使文本输入不可编辑

    在HTML中可以使用readonly属性创建不可编辑的文本输入 而在CSS的情况下 xff0c 可以使用pointer events属性使文本输入不可编辑 下面本篇文章就来给大家介绍一下 xff0c 希望对大家有所帮助 CSS pointe
  • 将数组转换为JSON数据

    如何将数组转换为JSON数据 xff1f 下面本篇就来给大家介绍一下将数组转换为JSON对象的方法 xff0c 希望对大家有所帮助 方法一 xff1a 使用Object assign Object assign 方法将枚举的所有属性的值从源
  • CSS设置链接的样式

    链接是从一个网页到另一个网页的连接 xff0c CSS可通过不同属性以各种不同方式来设置链接的样式 下面本篇文章就来给大家介绍一下CSS设置链接的样式的方法 xff0c 希望对大家有所帮助 在讨论CSS属性之前 xff0c 先了解链接的状态
  • 任务切换

    任务切换的方法 第一个方法就是借助中断来进行任务切换 xff0c 这是现代抢占式多任务的基础 在实模式下 xff0c 内存最低端1KB是中断向量表 xff0c 保存着256个中断处理过程的段地址和偏移地址 在保护模式下 xff0c 处理器不
  • 操作无法完成,因为该文件已在system中打开

    一 操作无法完成 xff0c 因为该文件已在system中打开 1 同时按下键盘上的Ctrl 43 Shift 43 ESC组合键 xff0c 打开 任务管理器 xff0c 2 切换到 性能 选项卡下 xff0c 并点击 资源管理器 xff

随机推荐

  • Ai智能时代即将到来,替代程序员还是相辅相成,我们拭目以待

    AI是否会替代前端程序员 xff1f 这是一个让很多人感到担忧的问题 随着AI技术的发展 xff0c 越来越多的工作被自动化 前端开发是否也会面临被取代的危机呢 xff1f 前端开发是指使用HTML CSS JavaScript等技术 xf
  • HTML使用onmouseover属性更改背景颜色

    HTML如何使用onmouseover属性更改背景颜色 xff1f 下面本篇文章就来给大家介绍一下在HTML中使用onmouseover属性更改背景颜色的方法 xff0c 希望对大家有所帮助 HTML的onmouseover属性在鼠标指针移
  • 使用CSS更改PNG图像的颜色

    给定一个图像 xff0c 如何使用CSS更改PNG图像的颜色 xff1f 下面本篇文章就来给大家使用CSS更改PNG图像颜色的方法 xff0c 希望对大家有所帮助 在CSS中使用Filter属性 xff0c 利用滤镜功能来更改png图像颜色
  • 使用CSS更改hr标签的厚度

    下面本篇文章就来给大家介绍一下使用CSS更改hr标签的厚度的方法 xff0c 希望对大家有所帮助 HTML lt hr gt 标签在 HTML 页面中创建一条水平线 xff1b 水平分隔线 xff08 horizontal rule xff
  • 使用CSS设置文本或图像的透明度

    如何使用CSS设置文本或图像的透明度 xff1f 下面本篇文章就来给大家介绍一下使用CSS设置文本或图像的透明度的方法 xff0c 希望对大家有所帮助 想要使用CSS设置文本或图像的透明度 xff0c 可以使用opacity属性来设置 op
  • 使用CSS垂直居中文本

    CSS的常见任务是垂直居中文本或图像 xff1b 虽然CSS2不支持垂直对齐 xff0c 但我们可以通过组合一些属性来垂直居中块 下面本篇文章就来给大家介绍一下使用CSS垂直居中文本的方法 xff0c 希望对大家有所帮助 方法一 xff1a
  • CSS删除内联块元素之间空格的方法

    如何删除内联块元素之间的空格 xff1f 下面本篇文章就来给大家介绍一下使用CSS删除内联块元素之间的空格 xff0c 希望对大家有所帮助 要想删除内联块元素之间的空格 xff0c 可以使用margin right属性 xff1b 此属性用
  • 使用CSS在元素后面添加空格

    在CSS中 xff0c 可以使用 after选择器在元素后面添加空格 xff08 34 34 xff09 after选择器用于在其他元素的内容之后多次添加相同的内容 xff1b 它在每个选定元素的内容后面插入一些内容 下面本篇文章就来给大家
  • CSS在页面加载时创建淡入效果

    下面本篇文章就来给大家介绍一下使用CSS在页面加载时创建淡入效果的方法 xff0c 希望对大家有所帮助 想要使用CSS在页面加载上创建淡入效果 xff0c 可以使用css的animation属性或transition属性在页面加载时创建淡入
  • CSS设置文本和边框(图像)阴影

    在CSS中可以使用阴影效果属性在HTML文档中添加文本和边框 xff08 图像 xff09 阴影 下面本篇文章就来给大家介绍一下CSS的阴影效果属性 xff0c CSS添加阴影效果的方法 xff0c 希望对大家有所帮助 1 添加文本阴影 在
  • 使用JavaScript清除div的内容

    JavaScript提供清除div内容的功能 xff0c 想要执行此功能有两种方法 xff1a 一种是使用innerHTML属性 xff0c 另一种是使用firstChild属性和removeChild 方法 下面本篇文章就来给大家介绍一下
  • 大话pixhawk运行Ardu:Copter启动过程

    1 xff1a 了解启动过程有什么帮助 xff1f 2 xff1a 硬件连接 3 xff1a 启动过程 amp 分析 rgbled on I2C bus 2 at 0x55 bus 100 KHz max 100 KHz init look
  • JavaScript将Set(集合)转换为Array数组

    在JavaScript中 xff0c 想要将Set xff08 集合 xff09 转换为Array数组 xff0c 可以通过以下方式实现 方法1 xff1a 使用Array from 方法 Array from 方法从对象或可迭代对象 xf
  • 使用CSS将图像进行模糊处理

    给定一个图像 xff0c 如何使用CSS将图像进行模糊处理 xff0c 转换为模糊图像 xff1f 下面本篇文章就来给大家介绍一下使用CSS模糊处理图像的方法 xff0c 希望对大家有所帮助 在CSS中 xff0c 可以使用filter属性
  • CSS设置占位符文本的对齐方式

    HTML的placeholder属性指定一个简短提示 xff0c 用于描述input字段或文本区域 xff08 textarea xff09 的预期值 xff0c 即占位符文本 短提示在用户输入值之前显示在字段中 在大多数浏览器中 xff0
  • 谈谈HTML的短语标签及其作用

    在HTML中 xff0c 短语标签是专用标签 xff0c 用于指示文本块具有结构意义 xff0c 执行与文本格式标签类似的特定操作 例如 xff0c abbr标签表示该短语包含缩写词 短语标签的一些例子有 xff1a abbr strong
  • 常见的类名id名命名参考规范

    web前端命名规范 下面是常见的命名参考规范 xff1a 主体 头部 xff1a header 内容 xff1a content container 尾部 xff1a footer 导航 xff1a nav 侧栏 xff1a sidebar
  • Vue.js开发的4个基本ES2015特性

    ES2015 又名ES6 是当前JavaScript语言的规范 如果您是JavaScript新手或者最近没有更新JavaScript知识 xff0c 那么在ES2015中有许多新特性可以使开发变得更好 更有趣 如果您是Vue开发人员 xff
  • VueJS项目的5个很棒的样板/模板

    你要开始一个重要的Vue项目吗 为了确保您从一个坚实的基础开始 xff0c 您可以使用一个模板 也称为样板 骨架 启动器或脚手架 xff0c 而不是从npm init或vue init开始 许多经验丰富的开发人员都以开源模板的形式收集了关于
  • 如何构建出色的Vue组件

    很少有人最初编写Vue组件时打算将其开源 我们大多数人开始为自己编写组件的原因 xff1a 我们有一个问题 xff0c 然后决定通过构建一个组件来解决它 有时我们发现自己想要在代码库的新位置解决相同的问题 xff0c 所以我们提取组件并对其