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

React Native自定义单选框如何设置首项为默认选中状态

自定义单选组件默认选中首项实现方案

问题现状

已实现chips样式的自定义单选框组件,初始状态下无任何选中项,需要调整为渲染后自动选中第一个选项,效果对比如下:

  • 初始无选中状态:
    自定义单选框初始无选中效果
  • 预期默认选中首项效果:
    默认选中第一个选项的预期效果

原实现核心问题是组件内部选中状态userOption的初始值设为null,首次渲染时没有选项能匹配到选中值,因此不会展示选中样式,且父组件无法拿到初始选中值。

修改方案

仅需3处核心调整即可实现需求,同时修复原代码潜在问题:

  • 将useState初始值替换为传入选项数组第一个元素的value值,加空值兜底避免空数组报错
  • 组件挂载时主动触发选中回调,把默认选中值同步给父组件,避免父子状态不一致
  • 补全原代码缺失的列表key属性、父组件状态声明,消除运行警告和报错

修改后完整可运行代码:

import { useState, useEffect } from 'react';
import { View, Pressable, Text } from 'react-native';

function Chips({ data, onSelect }) {
  // 初始值默认取第一个选项的value,空数据场景兜底为null
  const [userOption, setUserOption] = useState(data?.[0]?.value ?? null);

  const selectHandler = (value) => {
    onSelect(value);
    setUserOption(value);
  };

  // 首次挂载时同步默认选中值给父组件
  useEffect(() => {
    if (userOption !== null) {
      onSelect(userOption);
    }
  }, []);

  return (
    <View style={{flexDirection: "row"}}>
      {data.map((item) => {
        return (
          <Pressable
            key={item.value}
            style={[
              item.value === userOption ? styles.selected : styles.unselected,
              styles.commonChips
            ]}
            onPress={() => selectHandler(item.value)}
          >
            <Text style={{
              color: item.value === userOption ? '#fff' : '#bfccd3',
              fontWeight: "bold"
            }}>
              {item.value}
            </Text>
          </Pressable>
        );
      })}
    </View>
  );
}

export default function App(){
  // 补全原代码缺失的option状态声明
  const [option, setOption] = useState(null);
  return (
    <Chips data={data} onSelect={(value) => setOption(value)} />
  )
}

扩展优化

如果后续需要支持自定义默认选中项,只需要给Chips组件新增一个defaultValue入参,把useState初始值替换为defaultValue ?? data?.[0]?.value ?? null即可,组件灵活性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:27:14