GrowingIO Design 组件库搭建之Select组件

最好用的 5 个 Vue select 单选多选下拉组件 - 卡拉云 单选 / 下拉 / 多选(select)组件在搭建 Vue 的 app 中特别常用,Vue select 除了用鼠标点选外,还可以有更多样的功能,比如搜索过滤,树状结构,tab 分组,按组选择等。这些高级功能都可以在第三方组件中找到,本文记录了我自己使用多年最好用的 5 款 Vue select 组件,每一款都经过我实际测试,推荐给大家。 阅读详情

前言

Select 是最频繁使用的UI组件之一,它可以运用在很多场景。大多数情况下,原生HTML的<Select>标签无法满足业务的功能过需求,以及原生HTML的<Select>标签在各个浏览器版本里样式表现不太一样。在这样的情况下,多数人都会选择实现一个符合UI要求以及产品功能需求的Select组件,或者选择使用一些开源组件库提供的 Select 组件。本文主要梳理了 gio-design 中的Select组件在实现过程中遇到的一些阻碍及需要注意的地方,希望能对大家在设计和实现select组件时提供一些帮助。

数据源(dataSource)

Select 组件的两种使用方法:

// 第一种写法
const options = [{label:'a',value:'a'},{label:'b',value:''b}];
<Select options={options} />

// 第二种
<Select>
    <Select.Option value={'a'} >a</Select.Option>
    <Select.Option value={'b'} >b</Select.Option>
</Select>

使用 Select 组件的时候,一般情况下,有两种方式来设定 dataSource。

  1. 通过 options 参数,传入纯数据格式。
  2. JSX,通过拦截子组件 <Select.Option/> 的参数,转化为 nodeOptions。相比较 JSX 而言,options 参数形式拥有更好的性能( JSX 方式最终也会转为类似 options 参数的形式)。
该转换方式借鉴了rc-select 中的写法。
export function convertChildrenToData(nodes: React.ReactNode, group = {}): Option[] {
  let nodeOptions: Option[] = [];
  React.Children.forEach(nodes, (node: React.ReactElement & { type: { isSelectOptGroup?: boolean }; props: OptionProps }) => {
    if (!React.isValidElement(node)) return;
    const {
      type: { isSelectOptGroup },
      props: { children, label, value },
    } = node;
    if (!isSelectOptGroup) { // option
      nodeOptions.push(convertNodeToOption(node, group));
    } else { // Group
      nodeOptions = concat(nodeOptions, convertChildrenToData(children, { groupLabel: label, groupValue: value }));
    }
  });
  return nodeOptions;
}

// ReactNode To Options
export function convertNodeToOption(node: React.ReactElement, group: group): Option {
  const {
    props: { value, children, ...restProps },
  } = node as React.ReactElement & { props: OptionProps };
  const { groupValue, groupLabel } = group;
  if (groupLabel && groupLabel) {
    return { value, label: children !== undefined ? children : value, groupValue, groupLabel, ...restProps };
  }
    return { value, label: children !== undefined ? children : value, ...restProps };
}

Group 和 Option 的定义:

// group

export interface OptionGroupFC extends React.FC<OptGroupProps> {
  isSelectOptGroup: boolean;
}
export const OptGroup: OptionGroupFC = () => null;

OptGroup.isSelectOptGroup = true;

export default OptGroup;

// option

export interface OptionFC extends React.FC<OptionProps> {
  isSelectOption: boolean;
}
const Option: OptionFC = () => null;

Option.isSelectOption = true;

export default Option;

上面这个两个方法思路也比较清晰,用 isSelectOptGroup 来区分 Group 和 Option。Group 会在 Option 原有参数上额外增加 groupLabel 和 groupValue 两个 key。

当两种传参方式混用时,会解析并合并成完整的可供 List 组件使用的 options,在 options 与 nodeOptions 合并的过程中,还需要生成一个 cacheOptions。

cacheOptions 是一个用来缓存 value 和 option 对应关系的对象。(默认:当 value 不发生变化的时候,即认为对应的 option 未发生改变),并提供 getOptionByValue (使用 value 获取 option)、getOptionsByValue (使用value[] 获取option[])方法查询。

dataSource 的来源除了这两种方式外,还有另外一种方式,那就是手动输入选项,像这样:

在允许自定义输入的场景,用户输入无法匹配现有选项时,添加新的选项。

const extendedOptions = () => {

const result: Option[] = [];

if (Array.isArray(value) && allowCustomOption) {

value.forEach((v) => {

const op = getOptionByValue(v);

if (!op) {

result.push(CustomOption(v, hasGroup, customOptionKey));

}

});

}

return [...mergedFlattenOPtions, ...result];

};

最后,我们还要针对 group 的情况进行分组排序,来处理 dataSource 排序问题,需要将相同group的数据放到一起,数据可能是像这样的:

const options = [

{label:'a',value:'a',groupLabel:'A',groupValue:'A'}

{label:'b',value:'b',groupLabel:'B',groupValue:'B'}

{label:'aa',value:'aa',groupLabel:'A',groupValue:'A'}

]

整体流程大概是这样的:

options and nodeOptions -> cacheOptions -> extendedOptions -> filterOptions -> sortedOptions

整个数据的流向比较清晰,将数据分批处理,比如说数据合并、搜索、过滤、排序等等,根据组件需求,将每一步处理为单独的逻辑,能较好的控制每一层逻辑所处理的内容。切勿将一些不相干的逻辑封装在一起,使得整体流程变得臃肿,将来在进行拓展时不好处理。处理完毕 dataSource 后,就可以将数据传入 List 组件中。

值(value and tempValue)

当 Select 组件已经成型,整体逻辑已经设计好后,由于一些业务场景的特殊性,Select组件需要额外支持一个 useFooter 的方法,开启useFooter后会默认出现 确定、取消 按钮,如图所示:

当点击 确认 时,触发 onChange 方法,当点击 取消 时,需要取消已选中的选项(但不可以影响上一次选中的结果),点击页面空白区域关闭下拉菜单时,逻辑与 取消 相同。遇到这样的情况,我们该怎么样在尽量不更改原有已经设计好的结构的情况下,去处理这样类似于 预选中 的情况?

可以来新增一个 tempValue 来支持对应预选中的情况,将预选中与已选中进行区分。

  • value 对应已选中的选项
  • tempValue 对应预选中的选项
  • selectorValue 对应的是展示的选项。

每当选中一个选项时,将选项添加到 tempValue 中。当反选一个选项时,该选项如果在 value 中存在,那就将它添加到 tempValue 中( value 和 tempValue 中都存在代表了已选中的选项在当前这次中被取消选择),如果不存在,从 tempValue 中移除即可。确认 时,将 tempValue 与value 合并,移除 tempValue 与 value 中都存在的选项,生成新的 value。取消 时,只要将 tempValue 重置为空数组即可。

value

tempValue

selectorValue

有

没有

展示

没有

有

展示

有

有

不展示

const selectorValue = () => {
  if (Array.isArray(value)) {
        // filter: if v in value and tempValue 
    return value.concat(tempValue).filter((v) => !value.includes(v) || !tempValue.includes(v));
  }
  if (multiple) {
    return tempValue;
  }
  return value;
}

这样我们仅仅是新增了一个 tempValue (及对应的选中逻辑) 和 selectorValue 就达到目标,对原有有关 value 的逻辑并没有修改,用较小的代价就完成了预选中的功能。

Portal

bug 版 Select:将selector 和 dropdown 渲染到同一层级下时,在某些情况下,可能会出现以下两种情况:

1. 当dropdown展开时,父组件容器内部出现滚动条。

2. dropdown 的部分甚至全部都会被父级元素遮挡。

首先,当 dropdown 展开时,dropdown 位置不应该影响其他组件位置。其次,其他组件也不应该影响到 dorpdown 展示。基于这样的条件下,我们该如果展示 dropdown 呢?第一个想到的是,利用 position 定位,来解决 dropdown 对组件内其他组件的影响。脱离了正常文档流后,就不会影响其他组件的位置。那如何解决父组件对 dropdown 影响呢?可以将 dropdown 渲染到 父组件之外,这样父组件就无法影响到 dropdown。可以借助 React 官方的 Portal,实现一个类似的 Portal。

React 是这样介绍 Portal 的:

Portal 提供了一种将子节点渲染到存在于父组件以外的 DOM 节点的优秀的方案。

在这样的情况下,Select 组件的 dropdown 部分为了避开父组件对于它的影响,默认情况下是渲染到 body 上。不仅仅是将 dropdown 渲染到 body上后就结束了,还需要考虑当 scrollView 、 resize 时,我们需要来计算 dropdown 的相对位置。我们来看一下 rc-trigger 的部分源码, 它帮助我们实现了下层的一些相对位置计算和类似 React 官方的Portal。

// rc-trigger 删除部分无用代码

// 如果传入了getPopupContainer方法则使用getPopupContainer方法来挂载dom,如果没有则默认挂载在body上。

attachParent = (popupContainer: HTMLDivElement) => {

const { getPopupContainer, getDocument } = this.props;

const domNode = this.getRootDomNode();

let mountNode: HTMLElement;

if (!getPopupContainer) {

mountNode = getDocument(this.getRootDomNode()).body;

} else if (domNode || getPopupContainer.length === 0) {

mountNode = getPopupContainer(domNode);

}

if (mountNode) {

mountNode.appendChild(popupContainer);

}

};

// 创建一个dom,设定了绝对定位,利用attachParent方法将dom挂载到对应的dom元素上

getContainer = () => {

const { getDocument } = this.props;

const popupContainer = getDocument(this.getRootDomNode()).createElement('div',);

popupContainer.style.position = 'absolute';

popupContainer.style.top = '0';

popupContainer.style.left = '0';

popupContainer.style.width = '100%';

this.attachParent(popupContainer);

return popupContainer;

};

let portal: React.ReactElement;

if (popupVisible || this.popupRef.current || forceRender) {

portal = (

<PortalComponent // 这里的PortalComponent 指的就是rc-util/portal

key="portal"

getContainer={this.getContainer}

didUpdate={this.handlePortalUpdate}

>

{this.getComponent()}

</PortalComponent>

);

}

return (

<TriggerContext.Provider value={this.triggerContextValue}>

{trigger}

{portal}

</TriggerContext.Provider>

);

}

其实 rc-trigger 最终就是渲染了一个 trigger (也就是我们说的 selector )以及 portal(dropdown) 。默认情况下(不传 getPopupContainer 方法)时,默认挂载到 body 上。 并设定绝对定位,大多数情况下,Select组件是相对于页面静止的,当我们利用绝对定位布局挂载到 body 上时,只要计算好 trigger(selector) 的位置,通过 trigger(selector) 的位置来确定 portal(dropdown) 的位置即可。

在这里,只是简单的介绍了一下实现思路,其实有关这部分的问题比这里描述的要复杂的多,感兴趣的同学可以研究一下 rc-trigger、rc-util 的源码,相信你会有一些新的发现。

键盘交互

键盘交互可谓是比较复杂的一个设计了,其中也是针对键盘事件重构了多个版本,才达到了目前这样的效果。

在没有考虑键盘交互事件之前,元素的选中、聚焦、悬浮等效果是交给浏览器来处理,但是 Select 是由 selector 和 dropdown 两个部分组成的虚拟合成元素,在考虑到定制键盘事件后,就需要组件内部去模拟浏览器提供的元素的选中、聚焦、悬浮等效果。需要注意的是,我们使用了 Portal,将 selector 和 dorpdown 渲染到了不同的 dom 层级上,React 官方文档有这样一句话:

当在使用 portal 时, 记住管理键盘焦点就变得尤为重要。

Tab 切换焦点时,是根据 dom 元素的顺序来进行切换的,下拉列表默认是渲染到 body 上的(render in body),当 focus 状态移交到 List 上时,Tab 切换会导致 focus 丢失问题(跳过原有的 focus 切换顺序,使得 focus 顺序看上去与正常的表现不一)。所以,在 List 失去焦点时,需要将 focus 重新移交到selector 后再执行 onBlur()。

虚拟列表(virtualList)

虚拟列表这项功能肯定是每一个跟列表相关的组件都需要去考虑的一件事情,大多数情况下,数据的来源是从服务端请求过来的一些数据,有可能是1000条数据,也有可能是10条数据。当数据量过大时,可以考虑 虚拟列表 来进行优化。

简单说明一下 虚拟列表 的逻辑就是,仅仅只是渲染 可视区域,随着滚动的高度不断变化,不断的变更可视区域内的元素。在网络上已经有很多非常棒的有关 虚拟列表 实现的文章,在这里我就不展开描述了,下面主要是说明一些特殊情况。

在库的选择上,我们采用了 rc-virtual-list 这个库,这个库的优势相比较其他一些虚拟列表的库来说,体积小、参数很少(传入很少的参数即可达到目的)。我们的 Select 组件支持自定义optionRender,rc-virtual-list 支持自动计算每一个 Item 的高度。需要将每一个 Item 用 React.forwardRef() 来进行包裹。看一下 rc-virtual-list 的中有关自动获取 Item 真实高度的部分源码:

export default function useChildren<T>(
  list: T[],
  startIndex: number,
  endIndex: number,
  setNodeRef: (item: T, element: HTMLElement) => void,
  renderFunc: RenderFunc<T>,
  { getKey }: SharedConfig<T>,
) {
  return list.slice(startIndex, endIndex + 1).map((item, index) => {
    const eleIndex = startIndex + index;
    const node = renderFunc(item, eleIndex, {}) as React.ReactElement;
    const key = getKey(item);
    return (
      <Item key={key} setRef={ele => setNodeRef(item, ele)}> // setInstanceRef方法
        {node}
      </Item>
    );
  });
}


  const listChildren = useChildren(mergedData, start, end, setInstanceRef, children, sharedConfig);
  

listChildren 主要作用是生成范围在 Start---End 的 Data 数据,<Item> 组件采取了React.cloneElement 方法来创建 item, 它会单独给当前数据设置 ref (这也是我们为什么要用 React.forwardRef()),并触发setInstanceRef方法。

function setInstanceRef(item: T, instance: HTMLElement) {
    const key = getKey(item);
    const origin = instanceRef.current.get(key);

    if (instance) {
      instanceRef.current.set(key, instance);
      collectHeight();
    } else {
      instanceRef.current.delete(key);
    }

    // Instance changed
    if (!origin !== !instance) {
      if (instance) {
        onItemAdd?.(item);
      } else {
        onItemRemove?.(item);
      }
    }
  }

每当setInstanceRef执行时,都会将当前 item 存储起来,并触发collectHeight方法,该方法会触发多次,但是只会currentId === heightUpdateRef.current 时才会执行 。

function collectHeight() {

heightUpdateIdRef.current += 1;

const currentId = heightUpdateIdRef.current;

Promise.resolve().then(() => {

// Only collect when it's latest call

if (currentId !== heightUpdateIdRef.current) return;

instanceRef.current.forEach((element, key) => {

if (element && element.offsetParent) {

const htmlElement = findDOMNode<HTMLElement>(element);

const { offsetHeight } = htmlElement;

if (heightsRef.current.get(key) !== offsetHeight) {

heightsRef.current.set(key, htmlElement.offsetHeight);

}

}

});

});

}

遍历当前的instanceRef 来检查每个key的 offsetHeight,如果heightsRef.current.get(key) !== offsetHeight,则更新当前key的height。

最后

当我们设计组件时,首先要确认的是参数设计,对于一个开源的组件来说,频繁的修改参数对于使用者来说非常痛苦,参数的设计就尤为重要。在重构代码逻辑时,要保证既有的参数功能不能丢失,基于现有的情况来重构代码,尽量不要反复删减参数。Select 实现起来并不复杂,但也不简单,作为使用最频繁的组件之一,有很多细节、额外的功能需要实现。合理的控制需求、功能才能使得组件更为健壮,而不是一味的增加参数,使得组件变得臃肿,渐渐无法维护。

引用

  1. rc-trigger
  2. rc-util
  3. rc-virtual-list
  4. ant Design
HTML网站框架与组件库 Bootstrap Bootstrap是一个免费、开源的前端框架,它使用HTML、CSS和Javascript等技术,可以用于响应式Web设计,自适应移动设备、平板电脑等设备,可以用于快速构建CSS、HTML及javascript等组件,如按钮、导航栏、表单、模态框等。Materialize Materialize是一种基于Google Material Design语言的响应式HTML、CSS和Javascript的前端框架,它提供了一套美观、简单的UI组件库,包括卡片、按钮、表单、图标、行动栏等。 阅读详情

相关推荐

React-rcselect一个完美的ReactSelect组件

rc-select 一个完美的React Select组件

antd5 虚拟列表原理(rc-virtual-list)

rc-virtual-list 版本 3.11.4(2024-02-01)版本:virtual-list-3.11.4。

YanHSama的博客 4565

react-virtual-list:超简单的虚拟化列表React组件

用于版本^15.0.0 || ^16.0.0超简单虚拟化列表^15.0.0 || ^16.0.0 。 react-virtual-list允许您显示固定高度项目的大列表,而仅使这些项目在屏幕上可见。 这允许使用少得多的DOM元素呈现大列表。 其他好处: 一个依赖项(它是prop-types ) 性能-演示页面几乎总是保持60fps以上的速度 将您的组件分开-作为高阶组件 让您控制-不会强制执行任何特定的标记,但会为您提供必要的样式和数据以供使用。 遗产 如果您正在寻找支持~0.13.x版本1的文档,请~0.13.x。 安装 您可以使用安装 。 > npm install react-virtual-list --save 用法 ./lib/VirtualList.js模块导出单个ES5兼容的,可访问CommonJS的组件工厂。 import VirtualList from 'r

vue3组件篇 Select

弹出一个下拉菜单给用户选择操作,用于代替原生的选择器,或者需要一个更优雅的多选器时。当选项少时(少于 5 项),建议直接将选项平铺,使用 Radio 是更好的选择。

秋来九月八 5980

Win10更新后黑屏只剩鼠标?火绒误杀explorer.exe的5种自救方案(附详细步骤)

本文详细介绍了Win10更新后出现黑屏只剩鼠标的5种专业修复方案,重点解决火绒误杀explorer.exe的问题。从基础的任务管理器操作到安全模式下的系统修复,再到注册表编辑和系统还原,提供了全面的解决方案,帮助用户快速恢复系统正常运行。

weixin_29306571的博客 637

保姆级教程:用GlobleLand30数据+GTB3.3软件,一步步搞定MSPA景观格局分析

本文提供GlobleLand30数据结合GTB3.3软件进行MSPA景观格局分析的保姆级教程,涵盖数据预处理、软件操作、结果解读全流程,特别针对零基础用户常见问题提供解决方案,助力研究者高效完成景观生态学分析。

weixin_26757925的博客 450

Page-Agent:内嵌网页的AI智能体,用文本化DOM实现零延迟操作

网页自动化长期受限于截图识别与外部控制的高延迟、高成本和低语义精度。基于DOM文本化建模与浏览器内嵌执行的AI Agent技术,通过结构化提取可交互元素语义、复用原生登录态与上下文,显著提升操作鲁棒性与响应速度。该方案规避OCR与视觉模型依赖,天然兼容前端框架与无障碍标准,适用于CRM、ERP等复杂SPA系统。其核心价值在于将AI从‘远程遥控器’转变为‘页面原生协作者’,真正解决人机交互的最后一厘米问题——Page-Agent正是这一范式演进的典型代表。

weixin_34211761的博客 330

WorkVisual传输程序报错_发现一个内部错误

WorkVisual传输程序报错_发现一个内部错误

qq_16401025的博客 2457

bootstrap-select组件

阅读目录 一、组件开源地址以及API说明 二、组件效果示例 三、使用示例 1、基础示例 2、其他效果示例 3、组件取值赋值 4、组件其他用法 5、组件封装 四、源码下载 五、总结 正文 前言:之前分享过两篇bootstrap下拉框的组件:JS组件系列——两种bootstrap multiselect组件大比拼 和JS组件系列——Bootstrap Select2组件使用小结,收到很多园友的关注和提问,最后总结这两篇里面的下拉框组件都存在一些大大小小的问题,比如两种...

cjnba的专栏 1万+

3DGS实战笔记:从相机坐标系到屏幕像素,手把手推导高斯椭球的投影变换矩阵

本文详细解析了3D高斯散射(3DGS)技术中从相机坐标系到屏幕像素的几何变换过程,重点推导了高斯椭球的投影变换矩阵。通过视图变换、投影变换和视口变换的完整流程,结合雅可比矩阵处理协方差矩阵,实现了高效的三维重建与渲染。文章提供了Python代码示例,帮助开发者深入理解3DGS的核心几何变换机制。

weixin_28691741的博客 438

YOLOv13改进策略【Head】| (独家改进)结合 ICME-2024 中的PPA注意力模块,自研带有注意力机制的小目标检测头

本文记录的是利用PPA (并行补丁感知注意模块)改进YOLOv13的检测头。通过改进传统卷积,形成带有注意力机制的小目标检测头,使模型能够更好地关注小目标的重要信息。HCF-Net: Hierarchical Context Fusion Network for Infrared Small Object Detection采用多分支特征提取策略,通过不同分支提取不同尺度和层次的特征。利用局部、全局和串行卷积分支,对输入特征张量进行处理。通过控制 patch size参数实现局部和全局分支的区分,计算非重叠

Limiiiing的博客 480

浅说虚拟列表的实现原理

在列表数据的展示优化一文中,提到了对于列表形态的数据展示的按需渲染。这种方式是指根据容器元素的高度以及列表项元素的高度来显示长列表数据中的某一个部分,而不是去完整地渲染长列表,以提高无限滚动的性能。而按需显示方案的实现就是本文标题中说的虚拟列表。 虚拟列表的实现有多种方案,本文以react-virtual-list组件为基础进行分析 什么是虚拟列表? 在正文之前,先对虚拟列表做个简单的定义。 根据上文,虚拟列表是按需显示思路的一种实现,即虚拟列表是一种根据滚动容器元素的可视区域来渲染长列...

chern1992的博客 1618

华为OD机试真题2025双机位A卷 Python&JavaScript 实现【采购订单】

在一个采购系统中,采购申请(PR)需要经过审批后才能生成采购订单(PO)。每个PR包含商品的单价(假设相同商品的单价一定是一样的)及数量信息。系统要求对商品进行分类处理:单价高于100元的商品需要单独处理,单价低于或等于100元的相同商品可以合并到同一采购订单PO中。针对单价低于100的小额订单,如果量大可以打折购买。

MISAYAONE的博客 1459

select下拉框组件

发现vant-uI是没有select下拉框多选框的所以自己写了一个组件。话不多说上代码。加## 标题粗样式 这是select组件 <template> <div > <div class="selectInput"> <div class="title" @click.stop="liShow"> <input class="icon1" type="text" disabled placeholder=

weixin_44207118的博客 1636

FPGA 学习笔记:Vivado 工程更改FPGA 型号

FPGA 学习笔记:Vivado 工程更改FPGA 型号

坚韧与专注 1万+

基于YOLOv11的水果/商品/食堂/蔬菜/饮料/书籍识别与计价系统,前台+后台管理系统

基于YOLOv11的水果/商品/食堂/蔬菜/饮料/书籍识别与计价系统,前台+后台管理系统

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1219

Vue 77 ,Element 10 ,Element中的选择器组件Select,一级选择器组件el-select

⭐在Element UI中,ElSelect(或简称Select)组件是用于从预定义选项中,选择一个或多个值的强大工具。它支持远程搜索、多选等功能,提供优秀的用户体验和高度的灵活性。简洁易用的API设计,使我们能够快速集成,并实现复杂的选择逻辑。

AI Agent 全栈架构师(AI + GIS + Backend)& 数字芯片系统架构师(FPGA),NorthCity Smile的博客(NcSmile,博主域名:https://ncmile.blog.youkuaiyun.com) 2249

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【亲测免费】[特殊字符] 提升开发效率:RC-SELECT —— React的智能选择组件 [特殊字符]

**rc-select** 是一个基于React的高效、灵活的选择框组件,它提供了多种交互模式,包括单选、多选和组合框等。这个组件旨在为开发者提供强大的功能,同时保持简洁的API和优秀的用户体验。与传统的select元素相比,rc-select在性能和可定制性上表现出色。 ### 2、项目技术分析 - **React兼容性**: 支持IE11+以及最新版本的Chrome、Firefox和Saf

gitblog_00079的博客 899

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

react 虚拟滚动

yarn addrc-virtual-list import React, { PureComponent } from 'react' import { connect } from 'react-redux' import { PlayScreen } from './style' import { PlayCircleFilled, DeleteOutlined } from '@ant-design/icons' import { changeCurrentIndexAction, r.

coderYYA的博客 1309

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

读读antd源码之数据录入组件

① 获取用户数据的关键组件 antd中的数据录入组件,其实就是表单类组件,作为web服务获取用户输入数据的重要组件,必须考虑到其操作易用、前置校验、状态提示、风格统一等交互特性。 纵观了antd这里的一系列数据录入组件,抛开设计的角度,从技术来看,这里最重要的且复用最高的还是前面文章《读读antd源码之导航组件》提到的rc-trigger,就是提供动作监听弹出浮层的组件,基本大多数数据录入组件都会用到。 而其他的组件,基本看抽出来的组件库react-component就可以了。 ② 一些基础组件

ershing的博客 1180

【Material-UI】Select 组件中的对话框功能详解

Select 组件是用户界面中常见的表单元素,允许用户从一个下拉菜单中选择一个选项。它通常用于需要在有限选项中进行选择的场景中。Material-UI 提供了灵活且易于定制的 Select 组件,支持多种样式和交互方式。Dialog 组件是 Material-UI 提供的一种模态对话框,常用于需要用户在继续操作之前完成特定任务或输入信息的场景。Dialog 通常会屏蔽背后的内容,直到用户完成其交互。通过 Material-UI 的sx属性或styled。

lph159的博客 1504

Vue3选择器(Select)

下拉选择器组件,支持:禁用;禁用选项;自定义节点字段名;自定义样式;三种尺寸;支持清除;支持搜索;自定义搜索过滤函数;自定义下拉面板弹出位置;自定义下拉面板数;自定义下拉面板滚动条;自定义主题色等;总之,功能丰富,简单易用😁😁

Vue Amazing UI(Vue3 + TypeScript + Vite)组件库唯一开发维护者 1万+

Select 组件实现【全选】(基于 Element)

在 Element 中,Select 组件支持单选和多选,但是并没有全选的属性,因此只能通过其事件和属性来实现,本文将实现一个简单的示例。注意:本文的示例中,通过leixing1来兼容多控件共享同一方法。回到顶部。

weixin_41216546的博客 203

el-select 下拉框全选、多选的几种方式组件

由于添加了:collapse-tags 属性后,全选选中的时候,正常会默认选中第一个label的值显示,后面是 + 全部数量 -1 . 我们可以在初始化的时候,把默认选中的数组里面最前面添加一项“全选”2. 用selectArr的变量存一下, value的数组 过滤出不含 全选的,剩余全部数据。1. 先用arr1的变量存一下,把下拉框的数组 过滤出不含 全选的,剩余全部数据。:判断如果是全选就在最前面 添加1项 value 值 ‘全选’直接添加一个【全选】复选框,实现的功能跟方法一是一样的。

IT博客技术分享 8152

【亲测免费】 探索高效选择体验:rc-select 开源项目推荐

**安装指南**: ```bash npm install rc-select ``` **基本使用示例**: ```jsx import Select, { Option } from 'rc-select'; import 'rc-select/assets/index.css'; export default () => ( <Select> <Option value="j

gitblog_00302的博客 497

【Material-UI】Select 组件的Advanced features和Props

Select组件是 Material-UI 中用于创建下拉选择菜单的核心组件,它与原生的元素高度相似,但提供了更多的定制化和扩展功能。通过使用Select组件,开发者可以更轻松地处理复杂的选择操作,并能够通过自定义样式、行为和功能来提升用户体验。Select组件的设计初衷是为了与原生的元素互换使用,但对于一些高级需求,如多选、自动完成、异步加载或支持创建新选项等功能,Material-UI 推荐使用组件。组件是对流行的和downshift库的增强版本,具备更强的灵活性和功能。

lph159的博客 1254
上一篇: 使用 Scala 宏解决对象转换
下一篇: Clickhouse Projection 特性探索
GrowingIO_
博客等级 码龄8年 56粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值