gpt4 book ai didi

reactjs - React 和 TypeScript 中的表单,带有 DRY 更改句柄

转载 作者:行者123 更新时间:2023-12-04 11:47:36 24 4
gpt4 key购买 nike

我正在寻找使用 TypeScript 在 React 中管理表单状态的最佳方法。我的简单表单有两个值:loginpassword领域。我实现 IState表单状态和 DRY 的接口(interface) 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变量将只有 loginpassword值(value)。任何其他值都是不可能的。我可以告诉 TypeScript n变量是 "login" | "password"文字类型? TypeScript 方面 nstring即使我使用类型变量:
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多变的?或任何其他 DRY 解决方案 handleChange没有优化问题和纯 TypeScript?

最佳答案

我们可以使用 Pick确保您设置的 key 已在 IState 中定义界面。

Pick - set state

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
}

关于reactjs - React 和 TypeScript 中的表单,带有 DRY 更改句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54493511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com