React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

本文主要是介绍React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • Dropdown组件
    • 1. 功能分析
    • 2. 代码+详细注释
    • 3. 使用方式
    • 4. 效果展示
  • 总结


前言

今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。


Dropdown组件

1. 功能分析

(1)通过position属性,可以控制下拉选项的位置
(2)通过传入width属性, 可以自定义下拉选项的宽度
(3)通过传入className属性, 可以自定义加载动画的样式

2. 代码+详细注释

// @/components/Dropdown/index.tsx
import { useState } from 'react'
import classNames from "classnames";
import { DropDownContainer, DropDown } from './styled'
import Button from '@/Button'
// 组件的属性类型
type Options = {// 下拉选项的文本name: string// 下拉选项自定义类名value: string
}
// 组件的属性类型
type Props = {data: Options[]position?: stringwidth?: stringname: stringclassName?: string
};
export default ({data,position,width,name,
}: Props) => {// 是否显示下拉选项const [showDropDown, setShowDropDown] = useState(false)// 下拉选项位置const dropdownPosition: string = position ?? 'left'// 下拉框宽度,默认100%const dropdownWidth: string = width ?? '100%'// 下拉选项点击事件const handlerItemClick = () => {setShowDropDown(false)}return (<><DropDownContainer  className={classNames(className)}width={dropdownWidth} onMouseLeave={handlerItemClick}><ButtonclassName="dropdown-button"onMouseOver={() => {setShowDropDown(true)}}><div className={classNames('dropdown-button-content')}><divclassName={classNames('dropdown-button-title')}style={{textTransform: 'uppercase',}}>{name}</div><div className={classNames('dropdown-arrow')}>&gt;</div></div></Button>{showDropDown && (<DropDown position={dropdownPosition} onMouseLeave={ handlerItemClick }><>{data.map((item, index) => (<><Button key={index} className={classNames('dropdown-item')} onClick={ handlerItemClick }>{item.name}</Button>{index !== data.length - 1 && <div className={classNames('dropdown-separate')}></div>}</>))}</></DropDown>)}</DropDownContainer></>)
}------------------------------------------------------------------------------
// @/components/Dropdown/styled.tsx
import styled from "styled-components";
interface DropDownProps {width: string;
}
interface DropDownItemProps {position: string;
}
export const DropDownContainer = styled.div<DropDownProps>`display: flex;align-items: center;height: 100%;margin-top: 1px;padding: 10px 0;position: relative;width: ${({ width }) => width};@media (max-width: 750px) {margin-right: 0;}color: ${(props) => props.theme.primary};.dropdown-button-content {display: flex;align-items: center;.dropdown-arrow {font-size: 18px;margin-left: 4px;transform: rotate(90deg);}}&:hover {.dropdown-arrow {transform: rotate(270deg);}}
`;
export const DropDown = styled.div<DropDownItemProps>`display: flex;flex-direction: column;align-items: flex-start;min-width: 130px;color: #000;background: #fff;border-radius: 5px;box-shadow: 0 2px 4px 0 rgb(0 0 0 / 50%);z-index: 1000;position: absolute;top: 45px;left: ${({ position }) => (position === "left" ? 0 : "auto")};right: ${({ position }) => (position === "right" ? 0 : "auto")};.dropdown-item {display: flex;align-items: center;width: 94%;height: 33px;margin: 3px 3% 0;padding: 0 3%;font-size: 12px;white-space: nowrap;border-radius: 3px;cursor: pointer;&:hover {background: #f1f1f1;color: var(--cd-primary-color);}}.dropdown-separate {width: 88%;height: 0.5px;border: solid 0.5px #c3c3c3;margin: 0 6%;}
`;

3. 使用方式

// 引入组件
import Dropdown from '@/components/Dropdown'
// 使用
<Dropdowndata={[{ name: '下拉选项111111', value: '434432' },{ name: '下拉选项222222', value: '434432' },{ name: '下拉选项333333', value: '434432' },]}position="left"width="100px"name="dropdown"
/>

4. 效果展示

(1)左对齐
在这里插入图片描述

(2)右对齐
在这里插入图片描述


总结

下一篇讲【高阶渲染劫持组件封装】。关注本栏目,将实时更新。

这篇关于React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090265

相关文章

用Microsoft.Extensions.Hosting 管理WPF项目.

首先引入必要的包: <ItemGroup><PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" /><PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" /><PackageReference Include="Serilog

eclipse运行springboot项目,找不到主类

解决办法尝试了很多种,下载sts压缩包行不通。最后解决办法如图: help--->Eclipse Marketplace--->Popular--->找到Spring Tools 3---->Installed。

公共筛选组件(二次封装antd)支持代码提示

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件 使用到的库 npm i antdnpm i lodash-esnpm i @types/lodash-es -D /components/CommonSearch index.tsx import React from 'react';import { Button, Card, Form } from 'antd'

vue, 左右布局宽,可拖动改变

1:建立一个draggableMixin.js  混入的方式使用 2:代码如下draggableMixin.js  export default {data() {return {leftWidth: 330,isDragging: false,startX: 0,startWidth: 0,};},methods: {startDragging(e) {this.isDragging = tr

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

js+css二级导航

效果 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Con

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页:

vue+el国际化-东抄西鉴组合拳

vue-i18n 国际化参考 https://blog.csdn.net/zuorishu/article/details/81708585 说得比较详细。 另外做点补充,比如这里cn下的可以以项目模块加公共模块来细分。 import zhLocale from 'element-ui/lib/locale/lang/zh-CN' //引入element语言包const cn = {mess

vue同页面多路由懒加载-及可能存在问题的解决方式

先上图,再解释 图一是多路由页面,图二是路由文件。从图一可以看出每个router-view对应的name都不一样。从图二可以看出层路由对应的组件加载方式要跟图一中的name相对应,并且图二的路由层在跟图一对应的页面中要加上components层,多一个s结尾,里面的的方法名就是图一路由的name值,里面还可以照样用懒加载的方式。 页面上其他的路由在路由文件中也跟图二是一样的写法。 附送可能存在

vue+elementUI下拉框联动显示

<el-row><el-col :span="12"><el-form-item label="主账号:" prop="partyAccountId" :rules="[ { required: true, message: '主账号不能为空'}]"><el-select v-model="detailForm.partyAccountId" filterable placeholder="