{"record":{"id":"237a546aea52c050","repo":"marmelab/react-admin","slug":"usesimpleformiteratoritem-must-be-used-inside-a-si","errorCode":null,"errorMessage":"useSimpleFormIteratorItem must be used inside a SimpleFormIteratorItem","messagePattern":"useSimpleFormIteratorItem must be used inside a SimpleFormIteratorItem","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/ra-core/src/controller/input/useSimpleFormIteratorItem.ts","lineNumber":13,"sourceCode":"import { useContext } from 'react';\nimport { SimpleFormIteratorItemContext } from './SimpleFormIteratorItemContext';\n\n/**\n * A hook that provides access to a SimpleFormIterator item meta (its index and the total number of items) and mutators (reorder and remove this remove).\n * Useful to create custom array input iterators.\n * @see {SimpleFormIterator}\n * @see {ArrayInput}\n */\nexport const useSimpleFormIteratorItem = () => {\n    const context = useContext(SimpleFormIteratorItemContext);\n    if (!context) {\n        throw new Error(\n            'useSimpleFormIteratorItem must be used inside a SimpleFormIteratorItem'\n        );\n    }\n    return context;\n};\n","sourceCodeStart":1,"sourceCodeEnd":19,"githubUrl":"https://github.com/marmelab/react-admin/blob/051f511bb0afb5ea565c2d3728bf4dab0a6fa5e0/packages/ra-core/src/controller/input/useSimpleFormIteratorItem.ts#L1-L19","documentation":"useSimpleFormIteratorItem reads SimpleFormIteratorItemContext, provided per-row by <SimpleFormIteratorItem>. Called outside a row context, the hook has nothing meaningful to return (index, item, remove), so react-admin throws immediately.","triggerScenarios":"Calling useSimpleFormIteratorItem in a component that is not rendered by <SimpleFormIteratorItem> — e.g. directly inside <SimpleFormIterator> children but outside the item wrapper, or anywhere in the form unrelated to array rows.","commonSituations":"Custom row inputs that read the item context but are used in iterators that render children differently (older react-admin versions wrapped only fields, not every child); moving a row component out of the iterator; version upgrades where the item context provider was introduced and custom iterators were not updated.","solutions":["Ensure the calling component is rendered inside <SimpleFormIteratorItem> (normally wrap your custom input inside the iterator's children).","Update custom SimpleFormIterator replacements to provide SimpleFormIteratorItemContext per row when migrating to newer react-admin versions.","If you only need array-level API, use useSimpleFormIterator instead of the item hook."],"exampleFix":"// before: item hook used at iterator level\n<SimpleFormIterator>\n  <MyItemLabel /> {/* throws: no item context here */}\n</SimpleFormIterator>\n// after: ensure the consumer renders inside the item provider (default iterator rows)\n<SimpleFormIterator>\n  <TextField source=\"name\" /> {/* rendered per row inside SimpleFormIteratorItem */}\n</SimpleFormIterator>","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"const isInsideSimpleFormIteratorItem = (ctx: SimpleFormIteratorItemContextValue | null): ctx is SimpleFormIteratorItemContextValue =>\n  ctx != null && typeof ctx.index === 'number';","tryCatchPattern":"try {\n  const { index, remove } = useSimpleFormIteratorItem();\n} catch (e) {\n  if (e.message.includes('useSimpleFormIteratorItem must be used inside')) {\n    console.error('Component must be rendered inside a SimpleFormIterator row');\n    return null;\n  }\n  throw e;\n}","preventionTips":["Use the item hook only in components rendered per-row by SimpleFormIterator (its children/inputs).","When replacing SimpleFormIterator with a custom version, provide SimpleFormIteratorItemContext for each row.","On react-admin upgrades, re-test custom iterators against the item-context provider.","Use useSimpleFormIterator (array-level) when you do not need per-row index/item."],"tags":["react-admin","react-context","simple-form-iterator","hooks"],"backgroundTag":"hook-outside-provider","analyzedSha":"051f511bb0afb5ea565c2d3728bf4dab0a6fa5e0","analyzedAt":"2026-08-30T02:28:14.926Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}