首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成表单的react组件中的递归。

生成表单的react组件中的递归。
EN

Stack Overflow用户
提问于 2021-11-30 12:54:02
回答 1查看 154关注 0票数 0

你好啊!

我目前正在尝试创建一个基于提供的对象生成的表单,这似乎适用于我抛出的任何东西。

也就是说,直到我找到一个嵌套对象。

问题是:

一旦我进入if条件(typeof value === "object"),我希望有一个隐藏的输入(这是可行的)。

然后,我想进入我刚刚识别的那个对象,并进入所有子对象,它可能包含并生成与初始运行相同的标准的输入。

代码语言:javascript
复制
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模式

代码语言:javascript
复制
{
    "id": "XYZ1",
    "type": "twilio-api",
    "sid": "someSID",
    "from": "+phonenumberhere",
    "name": "TWILIO SMS",
    "credentials": {
        "token": "someapitoken"
    }
}

上面的对象当前呈现如下:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-30 13:24:31

假设您有一个Input组件:

代码语言:javascript
复制
  function Input = ({ name, type, value }) => {
    // most of your code can fit here
    return <input name={name} type={type} value={value} />
  }

您可以使用您的代码版本,我使用上面的简化版本来简化我们的讨论。有了它,我们可以设计一个InputList组件:

代码语言:javascript
复制
  function InputList = ({ object }) => {
    console.log('list', object)
    return (
      <div>
        {Object.entries(object).map(([property, value]) => {
           if (typeof value === "object") {
             return <InputList object={value} />
           } else {
             return <Input name={property} />
           }
        })}
      </div>
    )
  }

您可以在这个InputList中看到,再次调用InputList,这就是您要寻找的递归。当对象中不再有对象时,递归就停止了。

注意: React需要valueonChange来驱动任何input盒。否则,它们的行为就会像本地输入一样。但这不是这个问题的一部分。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70169658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档