{"record":{"id":"10f83852fc0f134e","repo":"facebook/react","slug":"props-dangerouslysetinnerhtml-must-be-in-the-for","errorCode":null,"errorMessage":"`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://react.dev/link/dangerously-set-inner-html for more information.","messagePattern":"`props\\.dangerouslySetInnerHTML` must be in the form `(.+?)`\\. Please visit https://react\\.dev/link/dangerously-set-inner-html for more information\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/react-dom-bindings/src/server/ReactFizzConfigDOM.js","lineNumber":1936,"sourceCode":"}\n\nconst endOfStartTag = stringToPrecomputedChunk('>');\nconst endOfStartTagSelfClosing = stringToPrecomputedChunk('/>');\n\nfunction pushInnerHTML(\n  target: Array<Chunk | PrecomputedChunk>,\n  innerHTML: any,\n  children: any,\n) {\n  if (innerHTML != null) {\n    if (children != null) {\n      throw new Error(\n        'Can only set one of `children` or `props.dangerouslySetInnerHTML`.',\n      );\n    }\n\n    if (typeof innerHTML !== 'object' || !('__html' in innerHTML)) {\n      throw new Error(\n        '`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. ' +\n          'Please visit https://react.dev/link/dangerously-set-inner-html ' +\n          'for more information.',\n      );\n    }\n\n    const html = innerHTML.__html;\n    if (html !== null && html !== undefined) {\n      if (__DEV__) {\n        checkHtmlStringCoercion(html);\n      }\n      target.push(stringToChunk('' + html));\n    }\n  }\n}\n\n// TODO: Move these to RenderState so that we warn for every request.\n// It would help debugging in stateful servers (e.g. service worker).","sourceCodeStart":1918,"sourceCodeEnd":1954,"githubUrl":"https://github.com/facebook/react/blob/eafeac097ba51e1eab809c07102126bd5f8e5425/packages/react-dom-bindings/src/server/ReactFizzConfigDOM.js#L1918-L1954","documentation":"Thrown by pushInnerHTML during SSR when dangerouslySetInnerHTML is not an object containing a __html key. React deliberately wraps raw HTML in {__html: ...} to make the danger explicit; a plain string, a misnamed key, or null-like objects fail the typeof/'__html' in check and abort serialization of that element.","triggerScenarios":"Server-rendering <div dangerouslySetInnerHTML=\"<b>bold</b>\" /> (raw string instead of the {__html} object), or <div dangerouslySetInnerHTML={{html: value}} /> (missing underscores), or a forwarded prop that was never wrapped: <Raw html={value} /> where Raw does <div dangerouslySetInnerHTML={html} />.","commonSituations":"Migrating from element.innerHTML assignments or other frameworks (Angular's [innerHTML], Vue's v-html) to React; typos like {html:} or {_html:}; wrapper components accepting an html prop and passing it through unwrapped.","solutions":["Wrap the string: dangerouslySetInnerHTML={{__html: value}}","Fix misnamed keys — the key must be exactly __html (two underscores)","In wrapper components, document that the prop must already be an {__html} object, or wrap it at the boundary"],"exampleFix":"// before\n<div dangerouslySetInnerHTML=\"<b>bold</b>\" />\n<div dangerouslySetInnerHTML={{html: value}} />\n\n// after\n<div dangerouslySetInnerHTML={{__html: '<b>bold</b>'}} />\n<div dangerouslySetInnerHTML={{__html: value}} />","handlingStrategy":"type-guard","validationCode":"function toInnerHtmlProp(value: string | {__html: string}): {__html: string} {\n  return typeof value === 'string' ? {__html: value} : value;\n}","typeGuard":"function isDangerouslySetInnerHTMLProp(v: unknown): v is {__html: string} {\n  return typeof v === 'object' && v !== null && '__html' in v;\n}","tryCatchPattern":null,"preventionTips":["Always write dangerouslySetInnerHTML={{__html: expr}} — never pass the string directly","Normalize at component boundaries with a toInnerHtmlProp helper","Sanitize the __html string (DOMPurify) in the same step to pair safety with shape"],"tags":["ssr","dangerouslysetinnerhtml","props"],"backgroundTag":"dangerouslysetinnerhtml-shape","analyzedSha":"eafeac097ba51e1eab809c07102126bd5f8e5425","analyzedAt":"2026-08-21T22:01:08.818Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}