Skip to content

Commit d21cdd9

Browse files
Merge pull request #453 from preactjs/fragment-html
feat: support `dangerouslySetInnerHTML` on Fragments
2 parents 4c47e70 + 5a5e83f commit d21cdd9

File tree

3 files changed

+61
-0
lines changed

3 files changed

+61
-0
lines changed

.changeset/neat-books-remain.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'preact-render-to-string': minor
3+
---
4+
5+
Add support for `dangerouslySetInnerHTML` on Fragments. This allows you to insert unsafe raw HTML content without a wrapping container element.

src/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,9 @@ function _renderToString(
346346
// Fragments are the least used components of core that's why
347347
// branching here for comments has the least effect on perf.
348348
return '<!--' + encodeEntities(props.UNSTABLE_comment) + '-->';
349+
} else if (props.dangerouslySetInnerHTML) {
350+
let html = props.dangerouslySetInnerHTML.__html || '';
351+
return '<!--$h-->' + html + '<!--/$h-->';
349352
}
350353

351354
rendered = props.children;

test/render.test.jsx

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -857,6 +857,59 @@ describe('render', () => {
857857
);
858858
expect(rendered).to.equal('<div>foo</div>');
859859
});
860+
861+
it('should support dangerouslySetInnerHTML on Fragments', () => {
862+
let rendered = render(
863+
<div>
864+
foo
865+
<Fragment dangerouslySetInnerHTML={{ __html: 'bar' }} />
866+
baz
867+
</div>
868+
);
869+
expect(rendered).to.equal('<div>foo<!--$h-->bar<!--/$h-->baz</div>');
870+
});
871+
872+
it('should ignore children on Fragments with dangerouslySetInnerHTML', () => {
873+
let rendered = render(
874+
<div>
875+
foo
876+
<Fragment dangerouslySetInnerHTML={{ __html: 'bar' }}>
877+
<p>ignored</p>
878+
</Fragment>
879+
baz
880+
</div>
881+
);
882+
expect(rendered).to.equal('<div>foo<!--$h-->bar<!--/$h-->baz</div>');
883+
});
884+
885+
it('should support falsy dangerouslySetInnerHTML on Fragments', () => {
886+
let rendered = render(
887+
<div>
888+
foo
889+
<Fragment dangerouslySetInnerHTML={{ __html: null }} />
890+
baz
891+
</div>
892+
);
893+
expect(rendered).to.equal('<div>foo<!--$h--><!--/$h-->baz</div>');
894+
895+
rendered = render(
896+
<div>
897+
foo
898+
<Fragment dangerouslySetInnerHTML={{ __html: undefined }} />
899+
baz
900+
</div>
901+
);
902+
expect(rendered).to.equal('<div>foo<!--$h--><!--/$h-->baz</div>');
903+
904+
rendered = render(
905+
<div>
906+
foo
907+
<Fragment dangerouslySetInnerHTML={{ __html: false }} />
908+
baz
909+
</div>
910+
);
911+
expect(rendered).to.equal('<div>foo<!--$h--><!--/$h-->baz</div>');
912+
});
860913
});
861914

862915
describe('className / class massaging', () => {

0 commit comments

Comments
 (0)