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

react-select在Accordion组件内defaultValue不显示问题求助

React-Select 在 Chakra UI Accordion 内 defaultValue 无法正常显示的解决方案

问题场景

将react-select组件放置在Chakra UI的Accordion组件内部时,defaultValue无法正常显示;但将其移至Accordion外部时,该功能可正常工作。尝试通过调整key属性解决,但未找到有效办法。

效果对比

  • 折叠面板内异常效果:折叠面板内显示效果
  • 折叠面板外正常效果:折叠面板外显示效果

相关代码示例

import {
  Accordion,
  AccordionItem,
  AccordionButton,
  AccordionPanel,
} from '@chakra-ui/accordion';

<Accordion>
  <AccordionItem>
    <AccordionButton>
      Settings
    </AccordionButton>
    <AccordionPanel>
      <Select
        key={defaultPayments}
        defaultValue={defaultPayments}
        options={selectPayments}
        isMulti
        theme={infoTheme}
        onChange={setPayments}
        placeholder='Payments'
        components={animatedComponents}
        isSearchable={false}
        noOptionsMessage={() => 'No more payments'}
      />
    </AccordionPanel>
  </AccordionItem>
</Accordion>

问题原因与解决办法

1. 修正AccordionPanel的渲染时机

Chakra UI的AccordionPanel默认仅在展开时渲染内部内容,这会导致react-select初始化时无法正确读取defaultValue。给AccordionPanel添加keepMounted属性,强制其始终渲染内部组件:

<AccordionPanel keepMounted>
  {/* react-select 组件 */}
</AccordionPanel>

2. 调整key属性的使用

当前将defaultPayments(数组类型)作为key,会被转为字符串,无法保证key的稳定性,反而可能引发组件渲染异常。替换为静态的唯一key:

<Select
  key="payment-select"
  defaultValue={defaultPayments}
  // 其他属性保持不变
/>

3. 校验defaultValue与options的匹配性

确保defaultPayments中的每一项都存在于selectPayments数组中,且value字段完全匹配(react-select通过value识别选项)。例如:

  • 若selectPayments的选项格式为{value: 'payment_1', label: 'Payment 1'},则defaultPayments的项也必须是包含相同value的对象,不能仅传字符串。

4. 切换为受控模式

若以上方法无效,改用受控模式通过state控制Select的选中值:

// 初始化state
const [payments, setPayments] = useState(defaultPayments);

// 在Select组件中替换defaultValue为value
<Select
  value={payments}
  onChange={setPayments}
  // 其他属性保持不变
/>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 15:51:53