使用 DRY 更改句柄在 React 和 TypeScript 中形成
Form in React and TypeScript with DRY handle of change
我正在寻找使用 TypeScript 在 React 中管理表单状态的最佳方式。我的简单表单有两个值:login
和 password
字段。我实现了表单状态的 IState
接口和 DRY handleChange
方法,用于在状态中存储新值,而无需在每次 render()
执行时重新创建函数。
interface IState {
login: string;
password: string;
}
class LoginForm extends React.Component<{}, IState> {
public state = {
login: "",
password: "",
};
public render() {
const { login, password } = this.state;
return (
<form>
<input name="login" value={login} onChange={this.handleChange}/>
<input name="password" value={password} onChange={this.handleChange} type="password"/>
</form>
);
}
private handleChange = (e: React.FormEvent<HTMLInputElement>) => {
const { name, value } = e.currentTarget;
const n = name as keyof IState;
// @ts-ignore
this.setState({
[n]: value,
});
}
}
我使用本机 HTML 的 name
属性作为商店字段名称。 n
变量将只有 login
或 password
值。任何其他值都是不可能的。我可以告诉 TypeScript n
变量是 "login" | "password"
文字类型吗? TypeScript 将 n
视为 string
类型变量,即使我使用:
const n = name as keyof IState;
或
const n = name as "login" | "password";
然后,当我删除 // @ts-ignore
时出现错误:
Type error: Argument of type '{ [x: string]: string; }' is not assignable to parameter of type 'IState | Pick<IState, "login" | "password"> | ((prevState: Readonly<IState>, props: Readonly<IProps>) => IState | Pick<IState, "login" | "password"> | null) | null'.
Type '{ [x: string]: string; }' is missing the following properties from type 'Pick<IState, "login" | "password">': login, password TS2345
但是当我硬编码时没有错误:
const n = "login";
有什么方法可以强制 "login" | "password"
键入 n
变量?或者没有优化问题和纯 TypeScript 的 DRY handleChange
的任何其他解决方案?
我们可以使用 Pick
来确保您设置的键已在 IState
界面中定义。
private handleChange = (e: React.FormEvent<HTMLInputElement>) => {
const { name, value } = e.currentTarget;
this.setState({
[name]: value
} as Pick<IState, keyof IState>);
};
或者您可以使用 Partial
的替代方法,这将使您的所有状态键成为可选的。
class App extends React.Component<{}, Partial<IState>> {
// ... rest of component
}
1.Declare 你的界面
interface IState {
login: string;
password: string;
}
2.Declare 你所在的州
const [myState, setMyState] = useState<IState>()
3.Declare 你的 onchange 函数
const onChange=(e: any): void => {
const { name, value } = e.currentTarget;
setMyState({ ...myState, [name]: value });
}
4.Declare 你的标记
<input name="login" type="text" onChange={onChange}/>
我们正在使用传播功能来维护和更新状态注意,您需要使用“name”属性命名标记元素,它应该与您的界面属性相对应
我正在寻找使用 TypeScript 在 React 中管理表单状态的最佳方式。我的简单表单有两个值:login
和 password
字段。我实现了表单状态的 IState
接口和 DRY handleChange
方法,用于在状态中存储新值,而无需在每次 render()
执行时重新创建函数。
interface IState {
login: string;
password: string;
}
class LoginForm extends React.Component<{}, IState> {
public state = {
login: "",
password: "",
};
public render() {
const { login, password } = this.state;
return (
<form>
<input name="login" value={login} onChange={this.handleChange}/>
<input name="password" value={password} onChange={this.handleChange} type="password"/>
</form>
);
}
private handleChange = (e: React.FormEvent<HTMLInputElement>) => {
const { name, value } = e.currentTarget;
const n = name as keyof IState;
// @ts-ignore
this.setState({
[n]: value,
});
}
}
我使用本机 HTML 的 name
属性作为商店字段名称。 n
变量将只有 login
或 password
值。任何其他值都是不可能的。我可以告诉 TypeScript n
变量是 "login" | "password"
文字类型吗? TypeScript 将 n
视为 string
类型变量,即使我使用:
const n = name as keyof IState;
或
const n = name as "login" | "password";
然后,当我删除 // @ts-ignore
时出现错误:
Type error: Argument of type '{ [x: string]: string; }' is not assignable to parameter of type 'IState | Pick<IState, "login" | "password"> | ((prevState: Readonly<IState>, props: Readonly<IProps>) => IState | Pick<IState, "login" | "password"> | null) | null'.
Type '{ [x: string]: string; }' is missing the following properties from type 'Pick<IState, "login" | "password">': login, password TS2345
但是当我硬编码时没有错误:
const n = "login";
有什么方法可以强制 "login" | "password"
键入 n
变量?或者没有优化问题和纯 TypeScript 的 DRY handleChange
的任何其他解决方案?
我们可以使用 Pick
来确保您设置的键已在 IState
界面中定义。
private handleChange = (e: React.FormEvent<HTMLInputElement>) => {
const { name, value } = e.currentTarget;
this.setState({
[name]: value
} as Pick<IState, keyof IState>);
};
或者您可以使用 Partial
的替代方法,这将使您的所有状态键成为可选的。
class App extends React.Component<{}, Partial<IState>> {
// ... rest of component
}
1.Declare 你的界面
interface IState {
login: string;
password: string;
}
2.Declare 你所在的州
const [myState, setMyState] = useState<IState>()
3.Declare 你的 onchange 函数
const onChange=(e: any): void => {
const { name, value } = e.currentTarget;
setMyState({ ...myState, [name]: value });
}
4.Declare 你的标记
<input name="login" type="text" onChange={onChange}/>
我们正在使用传播功能来维护和更新状态注意,您需要使用“name”属性命名标记元素,它应该与您的界面属性相对应