组件库的使用和自定义组件

这篇具有很好参考价值的文章主要介绍了组件库的使用和自定义组件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、组件库介绍

1、什么是组件

2、组件库介绍

3、arco.design

二、组件库的使用

1、快速上手

2、主题定制

3、暗黑模式

4、语言国际化

5、业务常见问题

三、自定义组件

2、组件开发规范

3、示例实践guide-tip

4、业务组件快速托管


一、组件库介绍

1、什么是组件

(1)工业:具有标准接口和某种功能且可复用的标准零部件

(2)软件开发:封装好的可复用的程序“零部件”,像搭积木一样把不同功能的组件搭起来

(3)前端开发:UI组件,“按钮”、“输入框”、“下拉选择”都是组件,组件和组件组合就变成了一个更复杂的组件

2、组件库介绍

(1)组件库:就是一系列U组件的合集

(2)核心:其包含的每一个组件,都遵循同一套体系来实现的

(3)意义:提高统一的标准化规范
①一致性 ②效率 ③协同

3、arco.design

(1)认识
①生态平台:
主题配置平台:组件库的风格配置
物料市场:物料开发,在线托管
图标平台:图标资源的托管
设计资源库:插画、落地页、LOGO等设计资源
②资源+工具
③设计系统基础

(2)构建基于
①产出效率提升
②效率提升
③发效率提升


二、组件库的使用

有一个运营平台的项目,那么如何快速搭建起来?

1、快速上手

(1)安装
需要同时安装 react >= 16.8 和 react-dom >= 16.8

// npm
npm i @arco-design/web-react

// yarn
yarn add @arco-design/web-react

(2)基础使用:按钮的引入使用

import React from "react";
import ReactDOM from "react-dom";
import { Button } from "@arco-design/web-react";
import "@arco-design/web-react/dist/css/arco.css";

ReactDOM.render(
  <Button type="primary">Hello Arco</Button>,
  document.querySelector("#root")
);

(3)整个组件库都被打包到了js文件里面
占用空间,如何解决?
①按需加载:插件babel-plugin-import

npm i babel-plugin-import -D

②添加配置:在babel 配置中加入

plugins: [
  [
    'babel-plugin-import',
    {
      libraryName: '@arco-design/web-react',
      libraryDirectory: 'es',
      camel2DashComponentName: false,
      style: true, // 样式按需加载
    },
  ],
];

有效将体积降低96%,即3.12 MB =>123 KB

③解析:该插件帮我们将按钮例子的代码编译为按需引入的形式,能使未被使用的代码不被引入

(4)通过 CDN 使用

①开发环境: unpkg.com/@arco-desig…
②生产环境: unpkg.com/@arco-desig…
③图标: unpkg.com/@arco-desig…
典型示例:CodePen,大多数组件库都会支持通过它打开示例代码

2、主题定制

(1)通过CSS进行样式覆盖

body {
    --primary-1: 255,236,232;
    --primary-2: 240,193,185;
    --primary-3: 225,151,143;
    --primary-4: 211,112,105;
    --primary-5: 196,74,70;
    --primary-6: 181,40,40;
    --primary-7: 155,26,30;
    --primary-8: 129,14,22;
    --primary-9: 103,6,15;
    --primary-10: 77,0,10;

}

body[arco-theme="dark"] {
    --primary-1: 77,0,10;
    --primary-2: 103,5,14;
    --primary-3: 129,17,25;
    --primary-4: 155,33,36;
    --primary-5: 181,53,53;
    --primary-6: 196,77,73;
    --primary-7: 211,115,108;
    --primary-8: 225,154,146;
    --primary-9: 240,197,190;
    --primary-10: 255, 240,237;
}

(2)修改Less变量
①在less文件里修改

@import '@arco-design/web-react/dist/css/index.less ';
@arcoblue-6: #b52828;

②在webpack.config.js或者在 Webpack 打包的时候,通过 less-loader 的modifyVars对所有的变量进行替换

module.exports = {
  rules: [{
    test: /.less$/,
    use: [{
      loader: 'style-loader',
    }, {
      loader: 'css-loader',
    }, {
      loader: 'less-loader',
     options: {
       modifyVars: {  // 在less-loader@6 modifyVars 配置被移到 lessOptions 中
         'arcoblue-6': '#f85959',
       },
       javascriptEnabled: true
     },
    }],
    ...
  }],
  ...
}

(3)组件定制
①例如:Button要带有投影效果,Input面性=>线性
②利用Arco Pro内置好的组件库,快速上手操作如下
官网https://link.juejin.cn/?target=https%3A%2F%2Farco.design%2Fdocs%2Fpro%2Fstart

预装环境
> npm i -g arco-cli
项目初始化
>arco init hello-arco-pro
项目开发
> cd hello-arco-pro
> yarn dev

③也可以通过DesignLab解决

3、暗黑模式

(1)组件库通过 body 标签上的 arco-theme 属性来标明当前的主题,只要修改这个属性,即可完成主题的切换

const darkThemeMq = window.matchMedia("(prefers-color-scheme: dark)");

darkThemeMq.addListener(e => {
 if (e.matches) {
 // 设置为暗黑主题
   document.body.setAttribute('arco-theme', 'dark');
 } else {
 // 恢复亮色主题
    document.body.removeAttribute('arco-theme');
  }
});

(2)局部应用暗色模式
①核心思路:本质上是控制暗色颜色变量的挂载位置,提高我们所需要的颜色变量的优先级
②控制暗色变量挂载到应用了暗黑样式的局部区域,对应的DOM标签上,实现该DOM下所有内容呈现暗色模式

4、语言国际化

(1)直接通过ConfgProvider组件传入不同语言文件去修改Locale

import { ConfigProvider } from '@arco-design/web-react';
import enUS from '@arco-design/web-react/es/locale/en-US';
import XXXLocale from '@arco-design/web-react/es/locale/xxx';

export function App( ) {
    return (
        <ConfigProvider locale={{ something ? enUS : XXXLocale }}>
            {
                // ...
            }
        </ConfigProvider>
    );
}

(2)语言未支持
①模仿官方的语言文件格式,自定义语言文件
②当语言需求不支持时,可向组件库维护人员提需求,等官方维护者将语言安排上

(3)RTL 视图
①元素方向RTL:CSS属性direction: rtl;(用来设置文本和其他元素的默认方向是从右到左)
②布局RTL

margin-left => margin-right
position: right =>position: left

③交互行为RTL
Slider组件:向左拖动数值变小=>向右拖动数值变小
④其他处理
左还是左,右还是右:Notification设置为right弹出时,无论在 RTL还是LTR,都是出现在右上角
Arco 组件库 RTL 从 0 到 1https://link.juejin.cn?target=https%3A%2F%2Fmp.weixin.qq.com%2Fs%2FKyYV0dodxynoR6osXsNkFQ(4)ConfigProvider全局配置组件默认属性
①修改组件默认的属性值,从而改变组件的默认表现
②通过ConfigProvider 的 componentConfg 属性,传入定义好的配置文件,组件配置将会对ConfgPorvider 组件所包裹的所有组件生效
③ConfigProvider:是一个内置组件,利用React Context ,为所有组件提供统一的全局配置

5、业务常见问题

①旧项目迁移:Codemod代码迁移工具
②如何获取OnCall支持
③更新日志,发版周期
④如何参与共建
可以通过用户群、Github issue、官方文档站查阅资料


三、自定义组件

1、业务组件库搭建
(1)架构设计
①单包架构:一个代码仓库里所有组件打包成一个整体,发布出去一个npm包
使用方式:从一个包名里面引用了多个组件,去进行组合使用

import { From, Input, Button, Checkbox } from '@arco-design/web-react';

优点:

  • 公共代码易复用
  • 展示更聚合,便于维护
  • 引入一个包即可使用全部组件

缺点:

  • 修改一个组件需要更新整个库
  • 需要考虑按需加载

②多包架构:一个代码仓库包含多个组件代码,会发布出去多个npm包
使用方式:组合使用多个组件的话,就必须从多个NPM包引入组件

import SelectWithCheckAll from '@arco-materials/select-with-check-all';
import ProRadio from '@arco-materails/pro-radio';

优点:

  • 单独发包,升级灵活。
  • 在同一仓库下,便于代码管理
  • 使用者无需考虑按需加载

缺点:

  • 组件间相互依赖时,需要通过npm 包引入
  • 组合使用时需要安装每一个用到的npm包

(2)技术方案
①开发环境

  • 打包速度
  • 实时预览,如storybook

②样式方案

  • 样式方案:Less / Sass,css in Js,cSS等
  • 组件库换肤,样式定制等能力

③产物构建

  • 建工具webpack , rollup,vite , gulp 等
  • 产物格式:cjs , umd , es

④质量保障

  • 测试工具: jest ,karma,mocha, enzyme,react-testing-library 等
  • 测试类型:单元测试,快照测试,截屏测试,e2e测试等

(3)对外文档
①文档部署

  • Demo展示:Storybook,umijs 等
  • 静态内容:markdown

②组件API生成

  • 手写
  • 自动提取:ts-docuemnt等

③版本日志

  • 手写
  • 自动提取:从PR提交记录自动提取@arco-design/changelog

2、组件开发规范

(1)项目组织
①语义化命名
组件的命名应当具有语义,并且避免与基础组件冲突。同一团队/仓库下的业务组件,也可采用相同的命名前缀。

//Bad Case
function SelectV2(){}

//Good Case
function SelectWithCheckAll(){}

②包名和组件名一致
NPM包名应当尽量与组件名保持一致,包含明确的使用场景信息。

//Bad Case
select-v2
arco-materails

//Good Case
select-with-check-all
example-platform-materials-react

③单独维护类型文件
推荐将需要对外导出的TS类型维护在单独的interface.ts 中,并将其在index.ts 中导出

//Bad Case
//index.tsx
export interface
ButtonProps {
    //...
}
export default function
Button() {}

//Good Case
//interface.ts
export interface ButtonProps {
    //...
}

//index.tsx
import type { ButtonProps } from './interface.ts';
export default function Button() {}
export type { ButtonProps };

(2)组件设计
①接口定义
在为组件定义接口类型时,应继承原生DOM(或基础组件)属性,避免属性遗漏或重复声明。

//Bad Case
interface InputProps {}
interface SelectWithCheckAllProps {}
//Good Case
interface InputProps
extends InputHTMLAttributes<HTMLInputElement> {}
import { SelectProps } from '@arco-design/web-react';
interface SelectWithCheckAllProps extends SelectProps {}

②类名前缀统一
组件使用特殊且统一的类名前缀,尽量降低与用户类名冲突的可能性。

//Bad Case
function Button( ) {
    return <button className="button-circle"/>;
}
//Good Case
const prefixCls = 'p-matirial';
function Button() {
    return <button className={`${prefixCls}-button-circle`} />;
}

③避免行内样式和cSS Modules
确保外部可通过类名进行样式覆盖。

//Bad Case
function Button() {
    return <button style={{ padding: 10 }} />;
}
//Good Case
function Button() {
    return <button className="am-button" />;
}
@am-button-prefix-cls: ~'am-button ';
.@{am-button-prefix-cls} {
    padding: 10px;
}

④避免在JS中直接引入样式文件
应尽量保证逻辑与样式的分离,确保用户可以分别引入JS和CSS文件,避免由于构建环境的不同导致的用户编译失败的问题。

//Bad Case
import './style/index.less';
function Button() {}
//Good Case
//Pure JS
function Button() {}

⑤注意组件样式的按需加载
在基于基础组件库如Arco进行业务组件的逻辑封装时,应注意按需引入所依赖的Arco基础组件的样式文件

//Bad Case
//select-with-check-all/style/index.js

//组件自身的样式文件
import './index.less';

//Good Case
//select-with-check-all/style/index.js
//SelectWithCheckAll组件依赖了arco的Select组件
import '@arco-design/web-react/es/Select/style/index.js'
import './index.less';

3、示例实践guide-tip

(1)功能要点
①控制引导气泡的出现
②点击下一步/上一步时切换气泡卡片的内容
③气泡卡片的位置跟随变动
④在最后一步时,显示完成按钮

(2)思路
①通过是否显示引导气泡,控制气泡显示/隐藏
②通过每个步骤的显示内容和指向的dom元素,控制气泡显示的内容

(3)API定义

/**
* @title GuideTip
*/
export interface GuideTipProps {
    /**
    * @zh是否显示引导气泡
    */
    visible?: boolean;
    /**
    *@zh引导步骤
    */
    steps?: {
        title?: ReactNode;
        content?: ReactNode;
        target: ()=>HTMLElement
    }[];
    /**
    *@zh完成时的回调
    */
    onEnd?: () => void;
}

(4)核心逻辑
①显示弹出层:Arco Popover 组件
②步骤切换:状态变量 current 记录当前处于哪一步骤
③弹出层始终指向对应的 Button:实时获取目标节点的位置,更新弹出层指向。

const GuideTip = (props: GuideTipProps) => {
    //使用自定义的类名前缀
    const prefixcls = "m-guide-tip";
    const { steps, visible } = props;
    //标识当前展示的气泡内容索引
    const [currentIndex, setCurrentIndex] = useState(-1);
    const current = steps[currentIndexl;
    //通过一定方式计算出 target 的位置,并应用在占位元素上,从而让弹出层能准确指向 target
    const targetStyle = useMemo(() => {
        if (!visible) {
            return;
        )
        const target = steps[currentIndex]?.target?.();
        if (target) {
            const { width,height,left,top } = target.getBoundingClientRect();
            return { width,height,left, top };
        }
    },[currentIndex,visible]);
    useEffect(() => {
        if (!visible) {
        setCurrentIndex(-1);
        }else {
        setCurrentIndex(0);
    ,[visible]);
    
    return {
        <Popover
            popupVisible={visible}-
            }
        >
            <div className={`${prefixCls}-target`} style={targetStyle} />
        </Popover>
    };
}

4、业务组件快速托管

Arco CLl+物料平台:供标准的业务模块开发方案的脚手架工具承载通用业务模块展示的在线平台文章来源地址https://www.toymoban.com/news/detail-675481.html

到了这里,关于组件库的使用和自定义组件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue前端开发自学,子组件传递数据给父组件,使用$emit

    vue前端开发自学,子组件传递数据给父组件,使用$emit 父子组件之间互相传递数据的情况非常常见,下面为大家介绍的是,来自子组件,给父组件传递数据的情况。 如图,以上代码是父组件的代码情况,ComponentEvent.vue。 可以看出来,里面的特殊点,在于,有个子组件的引用和标

    2024年01月23日
    浏览(43)
  • Flutter(九)Flutter动画和自定义组件

    Animation、Curve、Controller、Tween这四个角色,它们一起配合来完成一个完整动画 Animation Animation是抽象类,和UI渲染没有关系,功能是保存动画的插值和状态;比较常用的是Animation addListener:帧监听器中最常见的行为是改变状态后调用setState()来触发UI重建 addStatusListener:动画开始

    2024年02月10日
    浏览(48)
  • 前端基础(Element、vxe-table组件库的使用)

    前言:在前端项目中,实际上,会用到组件库里的很多组件,本博客主要介绍Element、vxe-table这两个组件如何使用。 目录 Element 引入element 使用组件的步骤 使用对话框的示例代码 效果展示  vxe-table 引入vxe-table 成果展示 总结 官网地址 Button 按钮 | Element Plus (element-plus.org) 在m

    2024年02月10日
    浏览(42)
  • Nuxt3最终篇【自定义插件与UI组件库的使用】

    首先我们要知道插件是在plugins文件夹下定义的,让我们开始编写吧 需要在根目录下创建 plugins 文件夹,nuxt会自动识别引用 这里我创建了plugins文件夹—》testplug.ts 使用该定义的pengke 这样就能使用定义好的 pengke 了 每个框架都需要用到第三方组件库,这里我演示使用 element-ui-p

    2024年02月11日
    浏览(56)
  • 【Django】 Task5 DefaultRouter路由组件和自定义函数

    Task5 主要了解了DefaultRouter路由组件,Django REST framework(DRF)是一个强大且灵活的 Django 插件,用于开发 Web API。并且掌握通过@action进行自定义函数。 写在最后   愉快的打卡时间过得飞快,再次感谢DataWhale全体工作人员的辛勤付出,让我们聚在一块学习、一块进步、一块成

    2024年02月11日
    浏览(40)
  • 如何为微信小程序添加WXML模板和自定义组件

    微信小程序是一种基于微信平台的应用开发框架,开发者可以使用小程序框架提供的组件、API和开发工具,快速开发出符合微信用户体验的小程序。 在小程序中,WXML(WeiXin Markup Language)是一种类似HTML的标记语言,用于描述小程序的结构。WXML的语法和HTML非常相似,但是有一

    2024年03月19日
    浏览(56)
  • React UI组件库——如何快速实现antd的按需引入和自定义主题

    大家上午好呀~ 今天来学习一下React的UI组件库以及antd的使用相关的知识点。 感兴趣的小伙伴可以给个三连哦~ material-ui(国外) ant-design(国内蚂蚁金服) antd 是基于 Ant Design 设计体系的 React UI 组件库,主要用于研发企业级中后台产品。 安装antd组件库: 默认按需引入antd组件

    2024年02月02日
    浏览(38)
  • (学习笔记)PCL点云库的基本使用

    目录 前言 1、理解点云库 1.1、不同的点云类型 1.2、PCL中的算法 1.3、ROS的PCL接口 2、创建第一个PCL程序 2.1、创建点云 2.2、加载点云文件 2.3、创建点云文件 2.4、点云可视化 2.5、点云滤波和下采样 2.5.1、点云滤波  2.5.2、点云下采样 2.6、点云配准与匹配         点云是一种

    2023年04月08日
    浏览(31)
  • 微信小程序学习笔记(四)——自定义组件

    创建组件 在根目录下创建 components 文件夹 右键点击 components 文件夹,选择 新建 Component ,就会自动生成 .wxml、.wxss、.js、.json 文件 引用组件 组件的引用方式分为“ 局部引用 ”和“ 全局引用 ”,故名思义: 局部引用 :组件只能在当前被引用的页面内使用 全局引用 :组件

    2024年02月16日
    浏览(50)
  • 微信小程序开发(第五期):npm包的使用、Vant Weapp 组件库的使用 && API Promise优化 、全局状态管理 && store 、分包、分包预下载 && 自定义配置tabBar

    LiuJInTao:2024年4月6日 一、小程序对 npm 包的限制 二、Vant Weapp 组件库 1. 什么是 Vant Weapp 官网文档地址 2. Vant Weapp 组件库的安装 注意点: 我们最新版本的微信开发者工具是不是没有勾选npm的,默认系统内部自动勾选。 步骤一 通过 npm 安装 使用npm构建前,请先阅读微信官方的

    2024年04月27日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包