-
Notifications
You must be signed in to change notification settings - Fork 463
Migration from v3
Mient-jan Stelling edited this page Feb 17, 2026
·
1 revision
Update your react dependency to at least 18.0.0.
Update your react-native dependency to at least 0.73.0.
The default image render rule now uses React Native's built-in <Image> component. If you need auto-sizing image behavior, provide a custom image render rule:
import { Image } from 'react-native';
const rules = {
image: (node, children, parent, styles) => (
<Image
key={node.key}
style={styles.image}
source={{ uri: node.attributes.src }}
resizeMode="contain"
/>
),
};Runtime prop validation is no longer performed. Use TypeScript for type checking:
import type { MarkdownProps } from 'react-native-markdown-renderer';The <Markdown> component is now a function component using hooks. Code relying on class instance methods or refs will break.
Custom markdown-it plugins should verify compatibility with markdown-it v14.
| Field | v3 | v4 |
|---|---|---|
main |
index.js |
lib/commonjs/index.js |
module |
— | lib/module/index.js |
types |
index.d.ts |
lib/typescript/index.d.ts |
import react from 'react';
import { PureComponent } from 'react-native';
import Markdown from 'react-native-markdown-renderer';
export default class Page extends PureComponent {
render() {
return <Markdown>{copy}</Markdown>;
}
}import Markdown from 'react-native-markdown-renderer';
export default function Page() {
return <Markdown>{copy}</Markdown>;
}Before (v3):
import Markdown, { getUniqueID } from 'react-native-markdown-renderer';
const rules = {
heading1: (node, children, parent, styles) => (
<Text key={getUniqueID()} style={styles.heading1}>
{children}
</Text>
),
};After (v4):
import Markdown from 'react-native-markdown-renderer';
import type { ASTNode, MarkdownStyles } from 'react-native-markdown-renderer';
import type { ReactNode } from 'react';
const rules = {
heading1: (node: ASTNode, children: ReactNode[], _parent: ASTNode[], styles: MarkdownStyles) => (
<Text key={node.key} style={[styles.heading as any, styles.heading1 as any]}>
{children}
</Text>
),
};Before (v3):
import Markdown, { AstRenderer } from 'react-native-markdown-renderer';
// AstRenderer was imported but not typically used
<Markdown style={styles}>{copy}</Markdown>After (v4):
import Markdown, { AstRenderer, renderRules, styles as defaultStyles } from 'react-native-markdown-renderer';
const customStyles = { ...defaultStyles, heading1: { fontSize: 32 } };
const renderer = new AstRenderer(renderRules, customStyles);
<Markdown renderer={renderer}>{copy}</Markdown>- Full TypeScript source with auto-generated type declarations
- Exported types:
ASTNode,RenderFunction,RenderRules,MarkdownStyles,MarkdownProps - ESM module output via react-native-builder-bob
- Proper memoization using
useMemohooks - 99 tests across 17 suites
Simple Examples