当前位置: 首页 > news >正文

fluent UI 中的Combobox如何在option的上面加一个input

fluent UI 9 中的Combobox如何在它自带的input框下面,option的上面,再加一个用于search的input框
在这里插入图片描述
会出现一个问题,点击search input框,可以触发input的onClick事件,但是无法获取焦点,焦点还在select的下拉框中
这种情况是由于 Combobox 的默认行为或者事件冒泡导致的。
解决方法:

const inputRef = React.useRef<any>(null);<Comboboxaria-labelledby={comboId}placeholder="Select an animal"open={isOpen}onOpenChange={(event, data) => {setIsOpen(data.open);console.log(data.open, isOpen, 'setIsOpen');}}{...props}onClick={() => setIsOpen(true)} // 点击 Combobox 保持下拉框打开><InputcontentBefore={<SearchRegular />}ref={inputRef}onClick={(ev) => {ev.stopPropagation();inputRef.current?.focus();setIsOpen(true); // 点击 Input 保持下拉框打开console.log(ev, 'Input clicked');}}/>{options.map((option) => (<Option key={option} disabled={option === 'Ferret'}>{option}</Option>))}</Combobox>

首先在input的唯一可以触发的onClick方法中取消默认冒泡行为,(此时onFocus,onChange事件都不会触发)
然后强制设置焦点,在 onClick 事件中,手动将焦点设置到 Input 元素上,通过ref,走到这一步会发现点击input之后,下拉框消失了,这时候就要用到Combobox的open属性,点击input后,设置open的值一直是打开状态。使用onOpenChange,监听当点击其他地方时的监听事件。
这样就可以输入了,其他操作也会很流畅。
在这里插入图片描述
可以在官网链接测试
https://stackblitz.com/edit/9jdz2a-yxlsnb?file=src%2Fexample.tsx
完整代码

import * as React from 'react';
import {Combobox,makeStyles,Option,useId,Input,
} from '@fluentui/react-components';
import { SearchRegular } from '@fluentui/react-icons';
import type { ComboboxProps } from '@fluentui/react-components';const useStyles = makeStyles({root: {// Stack the label above the field with a gapdisplay: 'grid',gridTemplateRows: 'repeat(1fr)',justifyItems: 'start',gap: '2px',maxWidth: '400px',},
});export const Default = (props: Partial<ComboboxProps>) => {const comboId = useId('combo-default');const [isOpen, setIsOpen] = React.useState(false);const options = ['Cat', 'Dog', 'Ferret', 'Fish', 'Hamster', 'Snake'];const styles = useStyles();const inputRef = React.useRef<any>(null);return (<div className={styles.root}><label id={comboId}>Best pet</label><Comboboxaria-labelledby={comboId}placeholder="Select an animal"open={isOpen}onOpenChange={(event, data) => {setIsOpen(data.open);console.log(data.open, isOpen, 'setIsOpen');}}{...props}onClick={() => setIsOpen(true)} // 点击 Combobox 保持下拉框打开><InputcontentBefore={<SearchRegular />}ref={inputRef}onClick={(ev) => {ev.stopPropagation();inputRef.current?.focus();setIsOpen(true); // 点击 Input 保持下拉框打开console.log(ev, 'Input clicked');}}/>{options.map((option) => (<Option key={option} disabled={option === 'Ferret'}>{option}</Option>))}</Combobox></div>);
};

http://www.mrgr.cn/news/8622.html

相关文章:

  • MySQL系列—MySQL编译安装常见问题(或缺少依赖)及解决方法,MySQL 编译安装时需要安装的依赖(全)
  • [论文笔记] eval-big-refactor lm_eval 每两个任务使用一个gpu,并保证端口未被使用
  • [论文笔记]Improving Retrieval Augmented Language Model with Self-Reasoning
  • 04_DOM的diffing算法
  • 【设计模式】组合模式和(宏)命令模式
  • Oracle 同义词SYNONYM 的实战使用
  • fpga图像处理实战-图像膨胀
  • 通过FileReader API获取上传音频的长度
  • 在编程学习的道路上,面对Bug和复杂算法时,我们常常会感到挫折和困惑。以下是一些克服这些挑战的有效方法:
  • Gstreamer-OpenCV的RTSP服务搭建以及推拉流实现
  • C++STL之list的使用详解
  • 常见虚拟现实硬件设备及特点
  • Vue2的16种传参通信方式
  • 选择合适的待办事项软件:用户体验报告
  • 并行 parallel DOP 受 Resource Manager 限制
  • jmespath用法总结
  • Spark MLlib 特征工程系列—特征转换PCA(Principal Component Analysis)
  • 8.Java基础概念-方法
  • 依赖倒置原则
  • Redis | 非关系型数据库Redis的初步认识