09 受控组件

受控组件是指在React应用中,表单数据的管理由state控制,通过事件处理函数更新state,确保数据的统一管理和同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

含义

  • 受控组件:由state来决定表单内部的数据,由表单的事件处理函数来更改state的方式
class App extends React.Component {
    // 1. state是表单的唯一数据源
    state = {
        name: ''
    }
    handleChange = (e) => {
        // 2. 控制表单操作并同步state
        this.setState({
            name: e.target.value
        }, () => {
            console.log('修改name', this.state.name)
        })
    }
    render() {
        const { name } = this.state
        return (
            <div>
                <p>用户名:</p>
                <input type="text"
                    value={name}
                    onChange={this.handleChange}
                />
            </div>
        )
    }
}
ReactDOM.render(
    <App />,
    document.getElementById('app')
  • 完整表单
const lanConf = [
    {
        label: '粤语',
        value: 'Cantonese'
    },
    {
        label: '菲律宾语',
        value: 'Tagalog'
    },
    {
        label: '英语',
        value: 'English'
    },
    {
        label: '闽南语',
        value: 'Fukienese'
    },

]
class App extends React.Component {
    // 1. state是表单的唯一数据源
    state = {
        name: 'Stephy',
        psw: '',
        intro: '',
        gender: 'female',
        isStu: true,
        languages: ['Cantonese', 'Tagalog', 'English']
    }
    handleChange = (e) => {
        // 2. 控制表单操作并同步state
        this.setState({
            [e.target.name]: e.target.value
        }, () => {
            console.log(`修改${e.target.name}`, this.state[e.target.name])
        })
    }
    handleRadioChange = (value, e) => {
        // e在最后!!
        this.setState({
            [e.target.name]: value
        }, () => {
            console.log(`修改radio`, this.state[e.target.name])
        })
    }
    handleCheckboxChange = (e) => {
        const name = e.target.name,
            value = e.target.value,
            list = JSON.parse(JSON.stringify(this.state[name]));
        let setList = []
        // 如果已存在,应该反选
        if (list.includes(value)) {
            setList = list.filter(val => val != value)
        } else {
            setList = [...new Set([...this.state[name], value])]
        }
        // 以上也可以这么判断 根据e.target.checked来判断勾选、反选
        this.setState({
            [name]: setList
        }, () => {
            console.log(`修改checkbox`, this.state[e.target.name])
        })
    }
    submit = (e) => {
        // 阻止表单提交默认事件(刷新页面)
        e.preventDefault()
        console.log('提交', this.state)
    }
    render() {
        const { name, psw, intro, gender, isStu, languages } = this.state
        return (
            <div>
                <form>
                    <div>
                        <span>用户名:</span>
                        <input type="text"
                            value={name}
                            name="name"
                            onChange={this.handleChange}
                            placeholder="用户名"
                        />
                    </div>
                    <div>
                        <span>密码:</span>
                        <input type="password"
                            value={psw}
                            name="psw"
                            onChange={this.handleChange}
                            placeholder="密码"
                        />
                    </div>
                    <div>
                        <span>性别:</span>
                        <select name="gender" value={gender} onChange={this.handleChange}>
                            <option value="female"></option>
                            <option value="male"></option>
                        </select>
                    </div>
                    <div>
                        {/* radio设置同样的name 才可变为单选 */}
                        是否学生:
                        是 <input type="radio" name="isStu" checked={isStu} onChange={this.handleRadioChange.bind(this, true)} />
                        |<input type="radio" name="isStu" checked={!isStu} onChange={this.handleRadioChange.bind(this, false)} />
                    </div>
                    <div>
                        {
                            lanConf.map(({ label, value }, index) => {
                                return (
                                    <span key={index}>
                                        {label}:
                                        <input
                                            type="checkbox"
                                            name="languages"
                                            checked={languages.includes(value)}
                                            value={value}
                                            onChange={this.handleCheckboxChange} />
                                        {lanConf.length - 1 != index ? "|" : ""}
                                    </span>
                                )
                            })
                        }
                    </div>
                    <div>
                        <textarea
                            value={intro}
                            name="intro"
                            onChange={this.handleChange}
                            placeholder="说明"
                        />
                    </div>
                    <div>
                        <button onClick={this.submit}>提交</button>
                    </div>
                </form>
            </div >
        )
    }
}
ReactDOM.render(
    <App />,
    document.getElementById('app')
)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值