上下文: 我尝试根据我们的步骤来构建带有钩子和渲染组件的表单。
问题: 我收到此消息:“错误:UserFormHooks(...):渲染未返回任何内容。这通常意味着缺少return语句。或者,不进行渲染,则返回null。”
我知道代码可用于类,但不能用于钩子。
我尝试过的方法:我试图将它们放在三元组中,但是它也不起作用。
代码:
import React, { useState } from "react";
import FormUserDetails from "./FormUserDetails";
import FormPersonalDetails from "./FormPersonalDetails";
import Confirm from "./Confirm";
import Success from "./Success";
const UserFormHooks = () => {
const [data, setData] = useState({
step: 1,
firstName: "",
lastName: "",
email: "",
occupation: "",
city: "",
bio: "",
});
// Proceed to next step
const nextStep = () => {
setData(step + 1);
};
// Go back to prev step
const prevStep = () => {
setData(step - 1);
};
// Handle fields change
const handleChange = (input) => (e) => {
setData({ [input]: e.target.value });
};
const { step } = { data };
const { firstName, lastName, email, occupation, city, bio } = { data };
const values = { firstName, lastName, email, occupation, city, bio };
switch (step) {
case 1:
return (
<div>
<FormUserDetails
nextStep={nextStep}
handleChange={handleChange}
values={values}
/>
</div>
);
case 2:
return (
<div>
<FormPersonalDetails
nextStep={nextStep}
prevStep={prevStep}
handleChange={handleChange}
values={values}
/>
</div>
);
case 3:
return (
<Confirm nextStep={nextStep} prevStep={prevStep} values={values} />
);
case 4:
return <Success />;
default:
console.log("This is a multi-step form built with React.");
}
};
export default UserFormHooks;
答案 0 :(得分:4)
您需要修复代码中的以下问题:
setData()
将覆盖现有状态,而不是将新状态与先前状态合并。因此,请确保在调用setData()
setData({ ...data, step: step + 1 });
您没有正确地进行销毁。您正在创建一个具有data
属性的新对象,该对象导致step
被undefined
占用,因此执行default
语句的switch
情况。由于您没有从default
情况返回任何内容,因此会引发错误,因为您必须始终从组件中返回任何内容。
const { step } = data;
const { firstName, lastName, email, occupation, city, bio } = data;
确保您从default
语句的switch
案例返回了一些内容
答案 1 :(得分:0)
如消息所示,您需要从组件返回JSX。或者,如果没有返回JSX,则需要返回null
:
default:
console.log("This is a multi-step form built with React.");
return null;
答案 2 :(得分:0)
您正在用soup.find_all("div", {"class": '\\"content-review\\"'})
覆盖默认状态,这会将状态设置为一个数字,而不是更新您在setData(step + 1)
中指定的对象内的步长值。
要更新状态并保留当前属性,可以将useState
与prevState
一起使用。
setState
就像名称所暗示的那样,保持先前的状态,在您的情况下,该状态是prevState
中的对象。
useState
答案 3 :(得分:0)
使用setData
setData(prevState => ({
...prevState,
[name]: value
}));
与对象挂钩相比,与组件类中的常规setState
而言,工作方式不同