parent
d07f3d4186
commit
0de469d273
4 changed files with 41 additions and 4 deletions
7
packages/astro/test/fixtures/react-component/src/components/Child.jsx
vendored
Normal file
7
packages/astro/test/fixtures/react-component/src/components/Child.jsx
vendored
Normal file
|
@ -0,0 +1,7 @@
|
|||
import React from 'react';
|
||||
|
||||
export default ({ id, children }) => {
|
||||
return (
|
||||
<div id={id}>{children}</div>
|
||||
);
|
||||
}
|
12
packages/astro/test/fixtures/react-component/src/pages/child-prop.astro
vendored
Normal file
12
packages/astro/test/fixtures/react-component/src/pages/child-prop.astro
vendored
Normal file
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
import Child from '../components/Child.jsx';
|
||||
---
|
||||
|
||||
<html>
|
||||
<head><title>Children tests</title></head>
|
||||
<body>
|
||||
<Child id="content"><span>content</span></Child>
|
||||
<Child id="prop" children={<span>prop</span>} />
|
||||
<Child id="prop-and-content" children={<span>prop</span>}><span>content</span></Child>
|
||||
</body>
|
||||
</html>
|
|
@ -79,4 +79,14 @@ React('Get good error message when react import is forgotten', async () => {
|
|||
assert.equal(result.error.message, 'React is not defined');
|
||||
});
|
||||
|
||||
React('Children passed as props', async () => {
|
||||
const result = await runtime.load('/child-prop');
|
||||
const html = result.contents;
|
||||
|
||||
const $ = doc(html);
|
||||
assert.equal($('#content').html(), '<span>content</span>');
|
||||
assert.equal($('#prop').html(), '<span>prop</span>');
|
||||
assert.equal($('#prop-and-content').html(), '<span>content</span>');
|
||||
});
|
||||
|
||||
React.run();
|
||||
|
|
|
@ -4,7 +4,7 @@ import StaticHtml from './static-html.js';
|
|||
|
||||
const reactTypeof = Symbol.for('react.element');
|
||||
|
||||
function check(Component, props, children) {
|
||||
async function check(Component, props, children) {
|
||||
if (typeof Component !== 'function') return false;
|
||||
|
||||
if (Component.prototype != null && typeof Component.prototype.render === 'function') {
|
||||
|
@ -26,16 +26,24 @@ function check(Component, props, children) {
|
|||
return h('div');
|
||||
}
|
||||
|
||||
renderToStaticMarkup(Tester, props, children, {});
|
||||
await renderToStaticMarkup(Tester, props, children, {});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return isReactComponent;
|
||||
}
|
||||
|
||||
function renderToStaticMarkup(Component, props, children, metadata) {
|
||||
const vnode = h(Component, { ...props, children: h(StaticHtml, { value: children }), innerHTML: children });
|
||||
async function renderToStaticMarkup(Component, props, children, metadata) {
|
||||
const childrenValue = children || (await props.children);
|
||||
const vnode = h(Component, {
|
||||
...props,
|
||||
children: h(StaticHtml, {
|
||||
value: childrenValue
|
||||
}),
|
||||
innerHTML: children
|
||||
});
|
||||
let html;
|
||||
if (metadata && metadata.hydrate) {
|
||||
html = renderToString(vnode);
|
||||
|
|
Loading…
Reference in a new issue