封装Select组件自定义输入个数

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

使用方式

tagRef.current.value 拿到select数据,maxInputSize输入最大tag数量

<TagSelect ref={tagRef} maxInputSize={10} />

组件文章来源地址https://www.toymoban.com/news/detail-532298.html

import React, {
	useImperativeHandle,
	useMemo,
	useState,
	forwardRef,
	ForwardRefRenderFunction,
	useEffect,
} from 'react';
import { Select, message } from 'antd';
import { PropsType } from './interface';

const TagSelect: React.FC = (props: PropsType) => {
	const {
		/**
		 * 输入个数限制
		 */
		maxInputSize = 0,

		/**
		 * 透传ref
		 */
		TagSelectRef,

		/**
		 * antd Select component props
		 */
		...ohterProps
	} = props;

	const { defaultValue } = ohterProps;

	const [value, setValue] = useState<any[]>([]);

	useImperativeHandle(
		TagSelectRef,
		() => ({
			value,
		}),
		[value],
	);

	useEffect(() => {
		if (defaultValue?.length) {
			let limit = defaultValue;
			if (defaultValue?.length > maxInputSize) {
				limit = defaultValue.slice(0, maxInputSize);
			}
			setValue(limit);
		}
	}, [defaultValue]);

	/**
	 * 展示-输入tags个数
	 */
	const showMaxInputSize = useMemo(() => {
		return (
			<div>
				{value?.length ?? 0}/{maxInputSize}
			</div>
		);
	}, [value, maxInputSize]);

	const selectProps: any = {
		style: {
			width: '100%',
		},
		mode: 'tags',
		placeholder: '请输入',
		allowClear: true,
		maxTagCount: 5, // 展示5个标签,大于5个展示省略标签
		open: false, // 是否展开下拉菜单
		showArrow: true,
		suffixIcon: showMaxInputSize,
		tokenSeparators: [',', ','],
		value,
		options: [],

		/* ------------------ event ----------------------- */
		onChange: (value: any[]) => {
			console.log(value, 'value');

			let limit = value;
			if (value.length > maxInputSize) {
				limit = value.slice(0, maxInputSize);
				message.info(`超出输入上限,最多可输入${maxInputSize}个值!`);
			}
			setValue(limit);
		},
	};

	return <Select {...selectProps} {...ohterProps} />;
};

TagSelect.defaultProps = {
	maxInputSize: 100,
};

const _TagSelect: ForwardRefRenderFunction<unknown, any> = (props, ref) => {
	return <TagSelect {...props} TagSelectRef={ref} />;
};

export default forwardRef(_TagSelect);

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

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

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

相关文章

  • vue+elememt-ui el-select组件封装

    最终效果图: 用的是vue2写法,喜欢用vue3的同学可以自行修改下。 需求要求 : 实现el-select功能复用; 支持单选或者多选功能; 支持全拼或者简拼搜索功能; 直接上代码: pinyin.js文件 希望对大家有帮助哟!

    2024年02月12日
    浏览(34)
  • 组件化开发之如何封装组件-react

    组件是构建用户界面的基本单元,它是一个独立的、可重用的、可组合的代码单元,用于表示UI的一部分。 人话:当谈论组件时,就像在搭积木一样,每个组件都是一个 独立的、可以重复使用 的代码块,用来构建网页或应用的各个部分。比如界面的布局,像按钮、文本输入

    2024年02月11日
    浏览(62)
  • React Native 桥接组件封装原生组件属性

    自定义属性可以让组件具备更多的灵活性,所以有必要在JS 层通过自定义属性动态传值。 因为 ViewManager 管理了整个组件的行为,所以要新增组件属性也需要在这里面(如 InfoViewManager)进行定义。 1、在InfoViewManager 中定义一个 setAvatar 方法。 @ReactProp 是 React Native 中的注解,用

    2024年01月21日
    浏览(40)
  • Bootstrap select2之下拉框可自定义输入和选择

    1. 引入css文件 2. 引入js文件 3. select标签引入class 我是在项目搜索框部分要加一个下拉框,本来甚至不需要上面那么多引入,都可以有一个下拉框,但是要求点击可以出现输入框自定义输入来筛选,然后想到了这个。但是想要利用表单来实现,因为不是一种表单,所以样式混乱

    2024年02月05日
    浏览(41)
  • React组件封装:文字、表情评论框

    1.需求描述 根据项目需求,采用Antd组件库需要封装一个评论框,具有以下功能: 支持文字输入 支持常用表情包选择 支持发布评论 支持自定义表情包 2.封装代码  ./InputComment.tsx ./util.ts  ./index.less    3.问题解决 同一页面有多个评论框时,光标位置不准确?答:从组件外部传

    2024年04月08日
    浏览(120)
  • iview的表格行内编辑,input和select组件使用方向键切换输入

    如果表格中的输入框和下拉框需要实现方向键切换选择,效果如图: 使用的是 IView 的UI框架和 Vue2 ,核心是在输入框和下拉框上添加按键监听事件,监听按键对应方向应该要完成的操作,比如当前在 Name 列的第一行,按【向左键】的话,需要鼠标光标在第一行的 Address 列 f

    2024年02月13日
    浏览(36)
  • react使用hook封装一个tab组件

    2024年02月09日
    浏览(46)
  • react umi/max 封装页签组件

    思路:封装一个页签组件,包裹页面组件,页面渲染之后把数据缓存到全局状态实现页面缓存。 浏览本博客之前先看一下我的博客实现的功能是否满足需求,实现功能: - 页面缓存 - 关闭当前页 - 鼠标右键关闭当前 - 鼠标右键关闭其他 - 鼠标右键关闭左侧 - 鼠标右键关闭右侧

    2024年01月18日
    浏览(41)
  • element ui多选下拉组件(el-select)tag数量过多处理解决办法(二次封装)

    如下图所示,当标签选择过多时,会占用过多空间 期待效果:超过n行就自动省略,并可以进行展开收起,下图是实现后的效果图 实现分析: 通过extends继承el-select组件 将select源码的template部分粘贴到封装的组件中,以此来操作展开、收起等需要操作dom的部分 监听selected(已选择

    2024年02月13日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包