#node.js #reactjs #jsx #babeljs #server-side-rendering
#node.js #reactjs #jsx #babeljs #рендеринг на стороне сервера
Вопрос:
Я новичок в reactjs..
Я пытаюсь отобразить компонент (jsx) с помощью renderToStaticMarkup, но я получаю следующую ошибку:
Ошибка:
Invariant Violation: Invalid tag: <html data-reactroot="" data-reactid="1" data-re....
server.js (фрагмент текста)
var html = ReactDOMServer.renderToStaticMarkup(
React.createElement(
ReactDOMServer.renderToString(Component(props))
),
script({dangerouslySetInnerHTML: {__html:
'var APP_PROP = ' safeStringify(props) ';'
}}),
script({src: '//cdnjs.cloudflare.com/ajax/libs/react/15.3.0/react.min.js'}),
script({src: '//cdnjs.cloudflare.com/ajax/libs/react/15.3.0/react-dom.min.js'}),
script({src: '/bundle.js'})
)
response.send(html)
}
component.jsx
return(
<html>
<head></head>
<body>
<div>
<ul>{values}</ul>
<button onClick={this.handleClick}>Click Me!</button>
</div>
</body>
</html>
);
}
Ответ №1:
React.createElement
Принимает либо одну строку, которая может быть тегом HTML (div, li, пользовательский html-тег), либо a ReactClass
вашего компонента.
Итак, вы можете сделать следующее
// Declaring the component (a stateless component in this case)
const MyComponent = ({ onClickHndlr, children }) => (
<html>
<head></head>
<body>
<div>
<ul>{children}</ul>
<button onClick={onClickHndlr}>Click Me!</button>
</div>
</body>
</html>
);
// Declaring my click function handler that I'll
// be passing it as a prop to the React.createElement method.
const onClickHndlr = () => {}
ReactDOMServer.renderToStaticMarkup(
React.createElement(
MyComponent,
{
onClickHndlr: onClickHndlr
},
[ <li>first children</li>, <li>second children</li> ]
)
);
Пожалуйста, обратите внимание, что я передаю методу аргумент типа ReactClass
(компонент без MyComponent
состояния) renderToStaticMarkup
.
Вы могли бы также использовать некоторый JSX в качестве аргумента, как обычно в render()
методе компонента, например:
ReactDOMServer.renderToStaticMarkup(
<MyComponent onClickHndlr={onClickHndlr}>
<li>first children</li>
<li>second children</li>
</MyComponent>
);
Просто имейте в виду, что JSX (примерно) выполняет это преобразование:
- Если имя тега представляет собой строку, которая сопоставляется элементу HTML, используйте класс component для этого элемента HTML.
- Если имя тега не является элементом HTML, предположим, что это имя локальной переменной, которое указывает на пользовательский класс компонента.
- Атрибуты преобразуются в объект и передаются в качестве второго параметра.
- Дочерние элементы передаются в качестве оставшихся параметров.
Извлечено из руководства по React JS и руководства по ошибкам.