A component which takes HTML content and renders it as native views, with customisable style and handling of links, etc.
In action (from ReactNativeHackerNews):
Table of contents
Install
npm install react-native-htmlview --save
Usage
props:
value: a string of HTML content to renderonLinkPress: a function which will be called with a url when a link is pressed. Passing this prop will override how links are handled (defaults to callingLinking.openURL(url))onLinkLongPress: a function which will be called with a url when a link is long pressed. The default isnull.stylesheet: a stylesheet object keyed by tag name, which will override the styles applied to those respective tags.renderNode: a custom function to render HTML nodes however you see fit. If the function returnsundefined(notnull), the default renderer will be used for that node. The function takes the following arguments:nodethe html node as parsed by htmlparser2indexposition of the node in parent node's childrensiblingsparent node's children (including current node)parentparent nodedefaultRendererthe default rendering implementation, so you can use the normal rendering logic for some subtree.defaultRenderertakes the following arguments:nodethe node to render with the default rendering logicparentthe parent of node ofnode
bullet: text which is rendered before everyliinside aulparagraphBreak: text which appears after everypelementlineBreak: text which appears after text elements which create a new line (br, headings)addLineBreaks: when explicitlyfalse, effectively setsparagraphBreakandlineBreaktonullNodeComponent,nodeComponentProps,RootComponent,rootComponentProps,TextComponent,textComponentProps: see Customizing things even further below.
Example
import React from 'react'; import {StyleSheet} from 'react-native'; import HTMLView from 'react-native-htmlview'; class App extends React.Component { render() { const htmlContent = `<p><a href="http://jsdf.co">♥ nice job!</a></p>`; return ( <HTMLView value={htmlContent} stylesheet={styles} /> ); } } const styles = StyleSheet.create({ a: { fontWeight: '300', color: '#FF3366', // make links coloured pink }, });
Custom Link Handling
When a link is clicked, by default ReactNative.Linking.openURL is called with the
link url. You can customise what happens when a link is clicked with onLinkPress:
class App extends React.Component { render() { return ( <HTMLView value={this.props.html} onLinkPress={(url) => console.log('clicked link: ', url)} /> ); } }
If you're getting the error "undefined is not an object (evaluating 'RCTLinkingManager.openURL’)” from the LinkingIOS API, try adding ‘RCTLinking' to the project's 'Linked Frameworks and Libraries’. You might have to find RCTLinking.xcodeproj in the react-native package dir and drag that into your main Xcode project first.
Custom Element Rendering
You can implement the renderNode prop to add support for unsupported element
types, or override the rendering for supported types. renderNode is a function which is called with the type and attributes of each HTML element found in the input HTML, and from this function you can return a React element to be rendered in its place. If you return null nothing will be rendered in place of this element or its children. If you return undefined (or don't return anything) then HTMLView will drop back to its default rendering for that type of HTML element.
For example, here is how you might implement the <iframe> element: