【发布时间】:2020-09-02 17:33:42
【问题描述】:
在react docs forms section 上有以下使用类组件的示例:
class Reservation extends React.Component {
constructor(props) {
super(props);
this.state = {
isGoing: true,
numberOfGuests: 2
};
this.handleInputChange = this.handleInputChange.bind(this);
}
handleInputChange(event) {
const target = event.target;
const value = target.type === 'checkbox' ? target.checked : target.value;
const name = target.name;
this.setState({
[name]: value
});
}
render() {
return (
<form>
<label>
Is going:
<input
name="isGoing"
type="checkbox"
checked={this.state.isGoing}
onChange={this.handleInputChange} />
</label>
<br />
<label>
Number of guests:
<input
name="numberOfGuests"
type="number"
value={this.state.numberOfGuests}
onChange={this.handleInputChange} />
</label>
</form>
);
}
}
考虑到 Hooks 只能在 React 函数组件或自定义 React Hook 函数中调用,有没有办法使用 hooks 来代替?
【问题讨论】:
-
你会发现钩子本质上是在功能组件中使用实例属性/方法的一种方式(你没有实例 - 提示,react 为你保留一个)。所以首先把你的组件变成一个函数,它就是
render方法,然后撒上useState -
所以我制作了一个自定义钩子:
const useInputs =[inputs, setInputs] = useState(''); setInputs({[e.target.name]: e.target.value})所以如果我在输入的 onChange 中调用它(如类示例中所示)我不能因为我不能在那里调用钩子。 -
将状态挂钩放在函数顶部,并在 onChange 处理程序中调用 setInput 方法。此外,您的状态应该是一个对象,其键是字段名称,其值是字段值,就像在您的类组件中一样。另一件事,当使用钩子时,你只能通过使用函数签名来“修补”状态(给它一个部分对象)来设置 useState 钩子的状态
-
有一个简单的反应表单包use-flat-form 用于类似的用例。
标签: javascript reactjs react-hooks