You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Formik集成Fluent UI v9 Dropdown组件异常问题求助

Formik + Fluent UI v9 Dropdown组件异常修复

你的代码存在几个关键问题,导致Dropdown无法显示选中项且Formik状态不更新,以下是修复后的完整代码及问题解析:

修复后代码

import React from 'react';
import { Formik, Form, useField } from 'formik';
import { FluentProvider, Label, Dropdown, Option, teamsLightTheme } from '@fluentui/react-components';

// 选项数组
const options=[
  {value:0, label:"Not sure", disabled:false},
  {value:1, label:"We have been hit by a malware attack", disabled:false },
  {value:2, label:"Some or all people cannot work", disabled:false },
  {value:3, label:"A critical application cannot be used" , disabled:false},
  {value:4, label:"Work is slowed", disabled:false },
  {value:5, label:"Work is not disrupted - we have a technical question", disabled:false },
];

export async function saveItem(t){
  console.log(JSON.stringify(t, null, 2));
};

// 封装Fluent UI Dropdown的Formik组件
export function DropdownBox({ label, options, ...props }){
  const [field, meta] = useField(props);

  // 处理下拉选项选择事件
  const handleOptionSelect = (ev, data) => {
    // 更新Formik的全局状态
    field.onChange(data.selectedOptions[0]);
  };

  return (
    <div>
      <Label htmlFor={props.name}>{label}</Label>
      <Dropdown
        {...field}
        {...props}
        selectedOptions={[field.value]}
        onOptionSelect={handleOptionSelect}
      >
        {options.map((option) => (
          <Option key={option.value} value={option.value} disabled={option.disabled}>
            {option.label}
          </Option>
        ))}
      </Dropdown>
      {meta.touched && meta.error ? (
        <div className="error">{meta.error}</div>
      ) : null}
    </div>
  );
};

export default function MyForm(){
  const initialItem = {
    impact: 1,
  }

  return (
    <FluentProvider theme={teamsLightTheme}>
      <Formik
        initialValues={initialItem}
        onSubmit={async (values, { setSubmitting }) => {
          setTimeout(async () => {
            await saveItem(values);
            setSubmitting(false);
          }, 400);
        }}
      >
        <Form>
          <DropdownBox
            id="impact"
            name="impact"
            label="Business Impact" 
            options={options} 
          />
        </Form>
      </Formik>
    </FluentProvider>
  );
};

关键问题与修复说明

  • 缺失核心导入:原代码未导入Formik的useField和Fluent UI的Option组件,导致基础功能无法正常触发。
  • 本地状态与Formik状态冲突:原代码手动维护selectedOptions和value本地状态,破坏了Formik作为表单单一数据源的机制,导致组件显示与全局状态不同步。
  • 事件处理逻辑错误:原onOptionSelect仅更新本地状态,未调用field.onChange通知Formik更新全局状态,导致提交时无法获取最新选中值。
  • Dropdown属性配置错误:
    • 原代码用defaultValue设置初始值,但Formik表单应通过field.value控制组件状态,而非默认值。
    • selectedOptions应传入选项的value数组,而非label文本,Fluent UI v9的Dropdown通过value识别选中项。

内容的提问来源于stack exchange,提问作者Donald Koscheka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:42:25