React JSX Parser

2.4.1 · active · verified Sun Apr 19

`react-jsx-parser` is a React component designed to parse JSX provided as a string and render it into actual React components. The current stable version is 2.4.1, which includes improvements for unary operator support, error handling, and TypeScript typings. The library maintains a regular release cadence with recent minor updates. A significant major release (v2.0.0) introduced compatibility with React 18+. Key differentiators include its ability to dynamically render React components from string-based JSX, its explicit prevention of inline function declarations within the parsed JSX to mitigate XSS attack vectors, and its robust support for various binding types (implicit boolean, string, expression, and named-value bindings). It seamlessly handles component collections and dot-notation for nested components, making it suitable for dynamic content rendering where JSX is sourced from external data.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart demonstrates how to use `JsxParser` to render a string containing JSX. It shows binding custom components, passing props, using expressions, and referencing functions defined in the `bindings` prop. It also highlights the usage of components with dot notation and function-as-children patterns.

import React from 'react';
import JsxParser from 'react-jsx-parser';

// A mock component from 'some-library-of-components'
const Library = {
  SomeComponent: ({ someProp, calc, stringProp, children }) => (
    <div>
      <h3>Library.SomeComponent</h3>
      <p>Prop A: {someProp}</p>
      <p>Calc: {calc}</p>
      <p>String Prop: {stringProp}</p>
      {children && children({ name: 'Fetched Data' })}
    </div>
  ),
  DataFetcher: ({ children }) => (
    <div>
      <h4>Library.DataFetcher</h4>
      {children && children({ name: 'Dynamic Data' })}
    </div>
  ),
};

// An injectable custom component
const InjectableComponent = ({ eventHandler, truthyProp }) => {
  return (
    <div onClick={eventHandler} style={{ border: '1px solid gray', padding: '10px', margin: '10px' }}>
      <p>Injectable Component</p>
      <p>Truthy Prop: {String(truthyProp)}</p>
      <button onClick={eventHandler}>Trigger Event</button>
    </div>
  );
};

const MyParsedComponent = () => (
  <JsxParser
    bindings={{
      foo: 'bar',
      myEventHandler: () => {
        console.log('Event handler triggered!');
        alert('Hello from event handler!');
      },
    }}
    components={{ InjectableComponent, Library }}
    jsx={`
      <h1>Header from Parsed JSX</h1>
      <InjectableComponent eventHandler={myEventHandler} truthyProp />
      <Library.SomeComponent someProp={foo} calc={1 + 1} stringProp="hello world">
        {(data) => <div>Data from children: {data.name}</div>}
      </Library.SomeComponent>
      <Library.DataFetcher>((data) => <div>Fetched Data Name: {data.name}</div>)</Library.DataFetcher>
      <p>This is a standard HTML paragraph.</p>
    `}
  />
);

export default MyParsedComponent;

view raw JSON →