事件处理参数中对象解构的相关技术疑问
相关代码
const handleChange = ({ target }) => { const name = target.name; const value = target.value; setProfile({ [name]: value }); };
<input value={phone} onChange={handleChange} id='phone-input'/>
问题与解答
JavaScript如何知晓target属性存在于SyntheticEvent对象中?
JavaScript其实不会“预先知晓”target存在,它只是在运行时按解构语法尝试从传入的参数对象里提取这个属性。React在触发事件时,会自动传入封装好的**合成事件(SyntheticEvent)**对象,这个对象本身就内置了target属性(和原生DOM事件的target逻辑一致)。这和你之前学的对象解构逻辑完全一样:比如printCarInfo({model, maker, city})是从传入的truck对象里提取对应属性,这里的({ target })就是从React传入的合成事件对象里提取target。如果传入的对象没有target,那解构出来的target就是undefined,后续访问target.name就会报错。为何调用该事件处理函数时不需要写成
handleChange(event)的形式?
这是React事件绑定的机制决定的:当你把handleChange赋值给onChange时,React内部会在事件触发(比如输入框内容变化)的时候,自动把合成事件对象作为参数传给这个函数。你要是写成handleChange(event),那组件渲染的时候就会立刻执行这个函数(而不是等输入变化时才执行),完全达不到事件监听的目的。就像你调用printCarInfo(truck)是手动传参,但这里React帮你做了“触发事件时自动传参”的工作,所以只需要绑定函数名就行。若传入的是其他包含target属性的对象,会发生什么情况?
只要这个对象的target属性里包含name和value,handleChange就能正常工作,顺利更新profile状态——就像你用printCarInfo时,不管传入的是truck还是其他有model、maker、city的对象,函数都能正常打印信息。如果传入的对象没有target,解构出来的target是undefined,访问target.name会直接抛出Cannot read properties of undefined的错误;如果target存在但缺失name或value,那对应的变量会是undefined,最终setProfile会把profile里的对应字段设为undefined。
补充参考:你之前学习的对象解构示例
let truck = { model: '1977 Mustang convertible', maker: 'Ford', city: 'Detroit', year: '1977', convertible: true }; const printCarInfo = ({model, maker, city}) => { console.log(`The ${model}, or ${maker}, is in the city ${city}.`); }; printCarInfo(truck);
内容的提问来源于stack exchange,提问作者JustRuud

