gpt4 book ai didi

javascript - 如何重写将另一个类扩展为功能组件的 React 类?

转载 作者:行者123 更新时间:2023-12-04 10:50:39 24 4
gpt4 key购买 nike

我有以下简单代码,我试图将其重写为一个函数,避免使用类并使用 Hook 来进行学习。正如您在下面看到的,“App”正在扩展“Form”。完整的代码包括“Form”中的其他函数,例如,由“handleChange”调用并修改状态中的“errors”项的验证函数。请注意,“Form”不是“App”的一部分,因为 Form 将被其他组件(例如登录组件)重用。

我的主要问题:

1- 根据 documentation ,他们似乎不鼓励使用继承,我如何在不使用“扩展”(并保留类)的情况下重写它?

2- 我如何在没有类的情况下重写它?

到目前为止,我想到的唯一想法是将 form.jsx 中的所有函数重写为独立函数并从 App 调用它们(见下文)。但这意味着要写很多 Prop 和参数(特别是当验证被添加为'错误','setErrors','schema'等将从'App'发送到'renderInput',从这里发送到'handleChange' , ETC。它可以工作,但代码不如以前干净...

应用程序.js

class App extends Form {
state = {
data: { username: "", password: "" },
};

render() {
return (
<form action="">
{this.renderInput("username", "Username")}
{this.renderInput("password", "Password", "password")}
</form>
);
}
}

表单.jsx

class Form extends Component {
state = {
data: {},
};

handleChange = ({ currentTarget }) => {
const data = { ...this.state.data };
data[currentTarget.name] = currentTarget.value;
this.setState({ data });
};

renderInput(name, label, type = "text") {
const { data, errors } = this.state;

return (
<Input
name={name}
type={type}
value={data[name]}
label={label}
onChange={this.handleChange}
/>
);
}

render() {
return null;
}
}

export default Form;

输入.jsx

const Input = ({ name, label, ...rest }) => {
return (
<div className="form-group">
<label htmlFor={name}>{label}</label>
<input {...rest} name={name} id={name} className="form-control" />
</div>
);
};

尝试将其转换为函数:

应用程序.jsx

const App = () => {
const [user, setUser] = useState({ username: "", password: "" });

return (
<form action="">
{renderInput("username", "Username", user, setUser)}
{renderInput("password", "Password", user, setUser, "password")}
</form>
);
};

表单.jsx

export function handleChange({ currentTarget }, data, setData) {
setData({ ...data, [currentTarget.name]: currentTarget.value });
}

export function renderInput(name, label, data, setData, type = "text") {
return (
<Input
name={name}
type={type}
value={data[name]}
label={label}
onChange={e => handleChange(e, data, setData)}
/>
);
}

提前致谢,如果您需要更好的解释或完整的代码,请告诉我。

最佳答案

form 移动到 Form 组件并传递输入属性数组以生成输入:

应用程序.jsx

const App = () => {
const [user, setUser] = useState({ username: "", password: "" });

const inputList = [
{name: "username", label: "Username", value: user.username},
{name: "password", label: "Password", value: user.password, type: "password"}
]

return (
<Form inputList={inputList} setData={setUser} />
);
};

表单.jsx

const Form = ({ inputList, setData }) => {

const handleChange = ({ currentTarget }) => {
const { name, value } = currentTarget;
setData(prevData => ({ ...prevData, [name]: value }));
};

return (
<form action="">
{
inputList.map(({ name, label, value, type = "text" }) =>
<Input
key={name}
name={name}
type={type}
value={value}
label={label}
onChange={handleChange}
/>
)
}
</form>
);

}

关于javascript - 如何重写将另一个类扩展为功能组件的 React 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59487504/

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