What is html-react-parser?
The html-react-parser package is designed to convert HTML strings into React components. This is particularly useful when you need to dynamically render HTML content in a React application, such as content fetched from a CMS or API that returns HTML. It allows for custom handling of elements, attributes, and can work with server-side rendering.
What are html-react-parser's main functionalities?
Parsing HTML strings to React Elements
This feature allows you to convert a string of HTML into React elements that can be rendered inside a React component.
import parse from 'html-react-parser';
const html = '<div>Hello World</div>';
const reactElement = parse(html);
Replacing or modifying elements during parsing
This feature allows you to define a 'replace' function in the options object that can modify or replace elements during the parsing process.
import parse, { domToReact } from 'html-react-parser';
const html = '<p id="replace">Replace me</p>';
const options = {
replace: ({ attribs, children }) => {
if (attribs && attribs.id === 'replace') {
return <span>{domToReact(children)}</span>;
}
}
};
const reactElement = parse(html, options);
Preserving custom attributes and event handlers
This feature allows you to preserve custom attributes and potentially event handlers when parsing HTML to React elements.
import parse from 'html-react-parser';
const html = '<div onclick="handleClick()">Click me</div>';
const reactElement = parse(html, {
preserveAttributes: ['onclick']
});
Other packages similar to html-react-parser
react-html-parser
react-html-parser is similar to html-react-parser in that it converts HTML strings into React components. However, it may differ in the specifics of its API and the options it provides for customization during the parsing process.
dangerously-set-html-content
dangerously-set-html-content provides a component that can be used to set raw HTML content. It is similar to using the dangerouslySetInnerHTML prop in React but encapsulated in a component for easier use. It does not offer the same level of customization or parsing capabilities as html-react-parser.
sanitize-html-react
sanitize-html-react is designed to sanitize HTML strings before they are rendered to prevent XSS attacks. It can be used in conjunction with html-react-parser to first sanitize the HTML string and then parse it into React components. It focuses more on security rather than parsing.
html-react-parser
![NPM](https://nodei.co/npm/html-react-parser.png)
![Dependency status](https://david-dm.org/remarkablemark/html-react-parser.svg)
An HTML to React parser that works on the server and the browser:
HTMLReactParser(htmlString[, options])
It converts an HTML string to React elements.
There's also an option to replace elements with your own custom React elements.
Example
var Parser = require('html-react-parser');
Parser('<p>Hello, world!</p>');
JSFiddle | repl.it
Installation
NPM:
npm install html-react-parser --save
Yarn:
yarn add html-react-parser
CDN:
<script src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script src="https://unpkg.com/html-react-parser@latest/dist/html-react-parser.min.js"></script>
More examples.
Usage
Given you have the following imported:
import Parser from 'html-react-parser';
import { render } from 'react-dom';
Render a single element:
render(
Parser('<h1>single</h1>'),
document.getElementById('root')
);
Render multiple elements:
render(
<div>{Parser('<p>brother</p><p>sister</p>')}</div>,
document.getElementById('root')
);
render(
React.createElement('div', {}, Parser('<p>brother</p><p>sister</p>')),
document.getElementById('root')
);
Render nested elements:
render(
Parser('<ul><li>inside</li></ul>'),
document.getElementById('root')
);
Renders with attributes preserved:
render(
Parser('<p id="foo" class="bar baz" data-qux="42">look at me now</p>'),
document.getElementById('root')
);
Options
replace(domNode)
The replace
method allows you to swap an element with your own React element.
The first argument is domNode
--an object with the same output as htmlparser2's domhandler.
The element is replaced only if a valid React element is returned.
Parser('<p id="replace">text</p>', {
replace: function(domNode) {
if (domNode.attribs && domNode.attribs.id === 'replace') {
return React.createElement('span', {}, 'replaced');
}
}
});
Here's an example that replaces but keeps the children:
import domToReact from 'html-react-parser/lib/dom-to-react';
const htmlString = `
<p id="main">
<span class="prettify">
keep me and make me pretty!
</span>
</p>
`;
const parserOptions = {
replace: ({ attribs, children }) => {
if (!attribs) return;
if (attribs.id === 'main') {
return (
<h1 style={{ fontSize: 42 }}>
{domToReact(children, parserOptions)}
</h1>
);
} else if (attribs.class === 'prettify') {
return (
<span style={{ color: 'hotpink' }}>
{domToReact(children, parserOptions)}
</span>
);
}
}
};
const reactElement = Parser(htmlString, parserOptions);
ReactDOMServer.renderToStaticMarkup(reactElement);
Output:
<h1 style="font-size:42px">
<span style="color:hotpink">
keep me and make me pretty!
</span>
</h1>
Testing
npm test
npm run lint
Benchmarks
npm run test:benchmark
Here's an example output of the benchmarks run on a MacBook Pro 2017:
html-to-react - Single x 415,186 ops/sec ±0.92% (85 runs sampled)
html-to-react - Multiple x 139,780 ops/sec ±2.32% (87 runs sampled)
html-to-react - Complex x 8,118 ops/sec ±2.99% (82 runs sampled)
Release
npm run release
npm publish
git push --follow-tags
Special Thanks
License
MIT