【发布时间】:2022-01-07 04:27:44
【问题描述】:
你好!
我目前正在尝试制作一个基于提供的对象生成的表单,这似乎对我扔给它的任何东西都有效。
也就是说,直到我找到一个嵌套对象。
问题:
一旦我达到了 if 条件 (typeof value === "object") 我想要一个隐藏的输入(这可行)。
然后我想进入我刚刚识别的那个对象,进入它可能包含的所有子对象,并按照与初始运行相同的标准生成输入。
function GenericForm(props: any) {
var object = props.object;
return (
<div>
<form>
{Object.entries(object).map(([property, value]) => {
let type: string = "";
if (typeof value === "string") {
type = "text";
} else if (typeof value === "number") {
type = "number";
} else if (typeof value === "boolean") {
type = "checkbox";
} else if (value instanceof Date) {
type = "date";
} else if (typeof value === "object") {
type = "hidden";
}
return [
<label property={property} htmlFor={property}>
{property}
</label>,
<input
type={type}
id={property}
name={property}
defaultValue={value as string}
onChange={(newVal) => {
object[property] = newVal.target.value;
}}
/>,
];
})}
</form>
</div>
);
}
export default GenericForm;
我知道这很可能利用了某种递归,虽然我尝试使用递归来解决它,但我无法解决它。
此处粘贴的代码来自我尝试递归之前的代码,以便在我出错的地方有一张“干净的床单”。
编辑 1 - 添加对象结构信息
传递的对象应该是完全通用的,并允许将任何结构的对象传递给组件,目前它应该只评估属性的类型并从中创建一个输入元素。
我正在传递的当前对象之一具有以下 JSON 架构
{
"id": "XYZ1",
"type": "twilio-api",
"sid": "someSID",
"from": "+phonenumberhere",
"name": "TWILIO SMS",
"credentials": {
"token": "someapitoken"
}
}
上面的对象当前呈现如下:
【问题讨论】:
-
你能否分享
object的样子(以及它的预期输出)? -
请不要在您的帖子中添加太多分散注意力的粗体和斜体,并且请使用正确的大小写和拼写。这两者都使您更容易阅读您的问题并为您提供帮助。此外,SO 的社区标准强烈反对在问题(例如问候和谢谢)中“吹毛求疵”。
-
@NickParsons 在帖子中添加了关于对象模式的编辑。预期的输出将是一个带有隐藏输入的凭证标签,然后在令牌下方,其输入由类型定义,如前所述,这应该到对象结构的末尾,不限于“2 级”对象链接对象
-
@TJCrowder 因为英语不是我的母语,对于我所犯的任何拼写错误,我深表歉意,我确实会在发布前使用我的自动更正来修复,所以我希望它不会太糟糕.有毛病,我会相应地更新我的帖子:)
-
@robskaar - :-) 我向你保证,你写英语比我写任何其他语言都要好。对于母语人士来说,真正跳出来的一件事是“I”总是大写,从不小写(不是“i”)。编码愉快!
标签: javascript reactjs typescript forms recursion