javascript - 如何在 react-admin 中的 Nested ArrayInput/FormDataConsumer 中调用 getSource

标签 javascript reactjs typescript nested react-admin

我正在关注 this使用文档 FormDataConsumer显示/隐藏输入。但我有一个嵌套的 ArrayInput/FormDataConsumer 如下:

export const MyClassCreate = ({ permissions, ...props }) => (
  <Create {...props}>
    <TabbedForm>
      <FormTab label="summary">
        <SelectInput source="className" choices={choices} optionText="choiceType"
                     optionValue="className"disableValue="not_available"
        />
        <TextInput source="field1" />
        <NumberInput source="field2" />
        <FormDataConsumer>
          {({ formData, ...rest }) =>
            formData.className === "my.package.MyClass2" && (
              <TextInput source="field3" {...rest} />
            )
          }
        </FormDataConsumer>
        <FormDataConsumer>
          {({ formData, ...rest }) =>
            formData.className === "my.package.MyClass1" && (
              <Fragment>
                <NumberInput source="field4" {...rest} />
                <ArrayInput source="arrayField1">
                  <SimpleFormIterator>
                    <SelectInput source="field5.subField6" choices={choices} 
                                 optionText="choiceType"
                                 optionValue="className" 
                                 disableValue="not_available"
                    />
                    <TextInput source="field5.subField7" />
                    <FormDataConsumer>
                      {({ formData, scopedFormData, getSource, ...rest }) =>
                        scopedFormData.field5 &&
                        scopedFormData.field5.subField8 &&
                        scopedFormData.field5.subField8 ===
                          "my.package.MyClass3" && (
                          <NumberInput
                            source={getSource("field5.subField9")}
                            {...rest}
                          />
                        )
                      }
                    </FormDataConsumer>
                    <FormDataConsumer>
                      {({ formData, scopedFormData, getSource, ...rest }) =>
                        scopedFormData.field5 &&
                        scopedFormData.field5.subField8 &&
                        scopedFormData.field5.subField8 ===
                          "my.package.MyClass4" && (
                          <ArrayInput source={getSource("reward.rewards")}>
                            <SimpleFormIterator>
                              <SelectInput source={getSource("problemField1")} choices={choices}
                                           optionText="choiceType" optionValue="className"
                                           disableValue="not_available"
                              />
                              <TextInput source={getSource("problemField2")} />
                              <FormDataConsumer>
                                {({
                                  formData,
                                  scopedFormData,
                                  getSource,
                                  ...rest
                                }) =>
                                  scopedFormData.field8 &&
                                  scopedFormData.field8 ===
                                    "my.package.MyClass5" && (
                                    <NumberInput
                                      source={getSource("field8")}
                                      {...rest}
                                    />
                                  )
                                }
                              </FormDataConsumer>
                            </SimpleFormIterator>
                          </ArrayInput>
                        )
                      }
                    </FormDataConsumer>
                  </SimpleFormIterator>
                </ArrayInput>
              </Fragment>
            )
          }
        </FormDataConsumer>
      </FormTab>
      <FormTab label="campaign">
        <DateInput source="startTime" parse={dateParser} />
        <DateInput source="expirationTime" parse={dateParser} />
      </FormTab>
    </TabbedForm>
  </Create>
);


我的问题是在 problemField1problemField2 ,虽然我调用 getSource就像我应该的那样,源的实际分辨率仍在使用引用第一级源取消引用。有没有办法告诉我的嵌套/内部 getSource指向正确的“级别”?

最佳答案

我已经能够创建 嵌套 ArrayInputreact-admin这是一个简单的例子:

const NavBarInput = ({ source }) => (
  <Box>
    <ArrayInput source={source}>
      <SimpleFormIterator>
        <TextInput source="title" />
        <FormDataConsumer>
          {({ getSource }) => (
            <NavBarInput source={getSource?.('items')} />
          )}
        </FormDataConsumer>
      </SimpleFormIterator>
    </ArrayInput>
  </Box>
);

关于javascript - 如何在 react-admin 中的 Nested ArrayInput/FormDataConsumer 中调用 getSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60343419/

相关文章:

javascript - 在 JSF2 页面中打开 JQuery 对话框

javascript - nodejs - jsdom 模块在 require 期间返回 isContext() 错误

javascript - mysql查询中的日期格式添加额外的小时

javascript - TypeError dispatcher.useState 在使用 React Hooks 时不是一个函数

javascript - 运行 'npm install' 安装 React.js 时出错

typescript - 枚举类型在 typescript 中给出双数组

javascript - 如何在 TypeScript 中使用包含的 Axios 类型定义进行依赖注入(inject)

javascript - 如何在 TypeScript 中映射多个类型的数组?

javascript - 拼接不会改变数组的长度

javascript - 无法在其他函数中访问 this.state