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

React中不使用UUID,在FormInput组件内生成唯一ID的方法

解决方案:在FormInput组件内生成唯一ID

当然可以将唯一ID的生成逻辑移到FormInput组件内,这种做法能让组件职责更清晰,避免父组件承担不必要的处理工作。具体修改如下:

修改FormInput组件

在表单提交时,直接生成唯一ID并与用户输入数据合并,再传递给父组件:

import { useState } from 'react'
import Card from './Card'

const FormInput = props => {
    const [userInput, setUserInput] = useState({
        name: '',
        amount: '',
        date: ''
    })

    const nameInputHandler = e => {
        setUserInput( prevObj => ({...prevObj, name: e.target.value}))
    }

    const amountInputHandler = e => {
        setUserInput( prevObj => ({...prevObj, amount: e.target.value}))
    }

    const dateInputHandler = e => {
        setUserInput( prevObj => ({...prevObj, date: e.target.value}))
    }
    
    const submitHandler = e => {
        e.preventDefault()
        // 在这里生成唯一ID并合并数据
        const newItemWithId = {
            ...userInput,
            id: Math.random().toString()
            // 生产环境更推荐用uuid库或者Date.now() + Math.random()组合,降低重复概率
        }
        props.receiveNewItem(newItemWithId)
        // 重置所有表单输入
        setUserInput({ name: '', amount: '', date: '' })
    }

    return (
        <Card>
            <form onSubmit={submitHandler}>
                <input 
                    type="text" 
                    placeholder="Name Input" 
                    value={userInput.name} 
                    onChange={nameInputHandler} />

                <input 
                    type="number" 
                    placeholder="Amount Input" 
                    value={userInput.amount} 
                    onChange={amountInputHandler} />
                
                <input 
                    type="date" 
                    placeholder="Date Input" 
                    value={userInput.date} 
                    onChange={dateInputHandler} />

                <button>Add Item</button>
            </form>
        </Card>   
    )
}

export default FormInput;

简化MainUI组件

现在父组件只需直接传递收到的完整数据即可,无需再处理ID生成:

const MainUI = props => {
    const receiveNewItem = enteredNewItem => {
        // 直接传递已包含ID的项
        props.addNewItem(enteredNewItem)
    }

    console.log(props.data)
    return(
        <div>
            <FormInput receiveNewItem={receiveNewItem}/>
            {/* <MaxAmount data={props.data} /> */}
            <DisplayItems data={props.data} />
        </div>
    ) 
}

export default MainUI;

补充说明

  • Math.random()生成的ID存在极小重复概率,生产环境更推荐使用专门的ID生成库(如uuid),或者用Date.now().toString() + Math.random().toString()的组合来降低重复风险。
  • 原代码中<DisplayItems data={props.data} key={props.data.id} />存在问题:key应该加在DisplayItems内部渲染的单个列表项上,而不是DisplayItems组件本身,否则无法发挥React列表key的作用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:45:31