发布于 2026-01-06 0 阅读
0

使用 React Hooks 和 useState 重构表单

使用 React Hooks 和 useState 重构表单

介绍

React Hooks 是我之前决定以后再研究的东西之一。我听说过很多关于它的好评,所以现在就决定研究一下。我有一个带表单的组件,我觉得可以用 Hooks 重构一下,于是就从这里入手。循序渐进总是更容易的。

没什么特别的,我们使用material-ui框架创建了一个对话框组件。然后在其中放置了三个文本输入框(TextField):


export default class AddItemPopup extends React.Component {

    constructor(props){
        super(props)
        this.state = {
            name: '',
            quantity: 0,
            unitCost: 0
        }
    }

    handleInputChange = e => {
        const {name, value} = e.target
        this.setState({
            [name]: value
        })
    }

    addItem = () => {
        const {name, quantity, unitCost} = this.state

        if(!name || !quantity || !unitCost) return

        this.props.saveItem(this.state)
    }

    render(){

        const {open, closePopup} = this.props
        const {name, quantity, unitCost} = this.state
        return(
            <Dialog 
                open={open}
                onClose={closePopup}>
                <DialogTitle>Add new item</DialogTitle>
                <DialogContent>
                    <TextField 
                        name='name'
                        label='Item name/Description'
                        onChange={this.handleInputChange}
                        value={name}/>
                    <TextField 
                        name='quantity'
                        label='Quantity'
                        onChange={this.handleInputChange}
                        value={quantity}/>
                    <TextField 
                        name='unitCost'
                        label='Unit Cost'
                        onChange={this.handleInputChange}
                        value={unitCost}/>
                </DialogContent>
                <DialogActions>
                    <Button onClick={closePopup} color="secondary" variant="contained">
                        Cancel
                    </Button>
                    <Button onClick={this.addItem} color="primary" variant="contained">
                            Save
                    </Button>
                </DialogActions>
            </Dialog>
        )
    }
}

我已经把导入语句放在文件顶部了,但你应该明白我的意思。这是一个包含表单和状态的类组件,用于跟踪表单输入的值。现在,让我们使用 useState hook 重写这个组件。

// Import the hook first
import React, {useState} from 'react'

const AddItemPopup = ({
    open, 
    closePopup,
    saveItem
}) => {

    const handleInputChange = e => {
        const {name, value} = e.target
        setValues({...values, [name]: value})
    }

    const addItem = () => {
        const {name, quantity, unitCost} = values

        if(!name || !quantity || !unitCost) return

        saveItem(values)
    }
        // Declare our state variable called values
        // Initialize with our default values

    const [values, setValues] = useState({name: '', quantity: 0, unitCost: 0})
    return(
        <Dialog 
        open={open}
        onClose={closePopup}>
        <DialogTitle>Add new item</DialogTitle>
            <DialogContent>
                <TextField 
                    name='name'
                    label='Item name/Description'
                    onChange={handleInputChange}
                    value={values.name}/>
                <TextField 
                    name='quantity'
                    label='Quantity'
                    onChange={handleInputChange}
                    value={values.quantity}/>
                <TextField 
                    name='unitCost'
                    label='Unit Cost'
                    onChange={handleInputChange}
                    value={values.unitCost}/>
            </DialogContent>
            <DialogActions>
                <Button onClick={closePopup} color="secondary" variant="contained">
                    Cancel
                </Button>
                <Button onClick={addItem} color="primary" variant="contained">
                        Save
                </Button>
            </DialogActions>
        </Dialog>
    )
}

export default AddItemPopup

砰!我们的组件现在变成了一个函数。我们做了什么:

  • useState返回两样东西:当前状态(这里是values)和一个可以更新它的函数(这里是setValues)。
  • useState接受一个参数:初始状态。
  • onChange 处理函数现在使用setValues函数来修改组件的内部状态。如您所见,values变量在组件的任何位置都可访问。

:我们也可以使用三个不同的钩子来分别更新每个输入,您可以根据自己的喜好选择更易读的方式 ;)

文章来源:https://dev.to/damcosset/refactor-a-form-with-react-hooks-and-usestate-1lfa