javascript - 嵌套渲染不影响 DOM

标签 javascript reactjs

用过:formik

我正在根据来自外部数组的数据为表单呈现输入字段。该数据的结构如下:

 {
    label: 'Test Question,
    value: 'testquestion',
    type: 'select',
    options: [{ label: 'yes', value: 'true' }, { label: 'no', value: 'false' }],
    conditionalFields: [
      {
        condition: {
          conditionalQuestion: 'experiencePhotography',
          answer: 'true',
          questions: [
            {
              label: 'Test Question ADDED IF YES',
              value: 'testQuestionYES',
              type: 'text'
            }
          ]
        }
      }
    ]
  }

我将其渲染如下:

case 'select': {
            return (
              <Fragment key={formField.value}>
                <Select name={formField.value} placeholder={formField.label}>
                  {formField.options &&
                    formField.options.map(option => (
                      <Select.Option key={option.value} name={option.value}>
                        {option.label}
                      </Select.Option>
                    ))}
                </Select>
                {formField.conditionalFields &&
                  formField.conditionalFields.length > 0 &&
                  formField.conditionalFields.forEach(conditionalField => {
                    if (values[formField.value]) {
                      if (values[formField.value] === conditionalField.condition.answer) {
                        conditionalField.condition.questions.forEach(question => {
                          console.log(question);
                          return (
                            <Fragment>
                              <Field
                                key={question.value}
                                name={question.value}
                                render={({ field }) => <CustomInput {...field} type="text" label={question.label} />}
                              />
                            </Fragment>
                          );
                        });
                      }
                    }
                  })}
              </Fragment>
            );
          }

所以在这种情况下,一个元素 Select 被渲染,带有相关的选项。但是,由于提供的数据有一个“conditionalFields”字段,我可以检查所选下拉项的值(通过 Formik 完成)。

values[formField.value] 从 Formik 获取数据。

数据在那里,并且 console.log(question) 输出数据,但其下方的 Field 元素未返回或显示在 DOM 上。

最佳答案

forEach 返回 undefined,因此当您使用 {formField.conditionalFields.forEach(/*...*/>} 时不会呈现任何内容(如果我们移除那里的两个守卫,这就是你正在做的事情)。

查看您的 forEach,看起来您需要 filter 然后是 map,例如:

{ formField.conditionalFields &&
  formField.conditionalFields.length > 0 &&
  values[formField.value] &&
  formField.conditionalFields
    .filter(conditionalField => values[formField.value] === conditionalField.condition.answer)
    .map(conditionalField => conditionalField.condition.questions.map(question => {
      return (
        <Fragment>
          <Field
            key={question.value}
            name={question.value}
            render={({ field }) => <CustomInput {...field} type="text" label={question.label} />}
          />
        </Fragment>
      );
    }))
}

...或按照这些思路。

FWIW,您可以在 filter 参数中使用解构,并且不需要围绕单个元素(Field)的 Fragment :

{ formField.conditionalFields &&
  formField.conditionalFields.length > 0 &&
  values[formField.value] &&
  formField.conditionalFields
    .filter(({condition: {answer}}) => values[formField.value] === answer)
    .map(conditionalField => conditionalField.condition.questions.map(question => (
      <Field
        key={question.value}
        name={question.value}
        render={({ field }) => <CustomInput {...field} type="text" label={question.label} />}
      />
    )))
}

关于javascript - 嵌套渲染不影响 DOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56458287/

相关文章:

javascript - 一种在另一个 CSS 值更改时更改 CSS 值的方法?

javascript - 我如何使用 JavaScript 从本地文件读取 CSS 规则

javascript - 如何通过匹配文本来选择下拉选项?

javascript - 如何使用 Material-UI 和 react-router 服务 React 应用程序

arrays - Array.prototype.filter() 期望在箭头函数末尾返回一个值,React

JavaScript Angular 1.5.x Controller

javascript - ES6 rest 参数不适用于 babel

reactjs - React useState 总是给出以前的状态值

javascript - react Prop 不在父组件中呈现,甚至在同一个组件中呈现

javascript - 如何避免 React 应用程序中的全局状态?