我正在尝试构建一个组件,
pre
中显示子DOM 一种解决方案是将JSX作为单独的prop
传递。这使得它重复,因为我已经能够通过this.props.children
访问它。理想情况下,我只需要以某种方式将children
道具转换为string
,以便我可以在pre
中呈现它以显示“此代码生成此结果”
这是我到目前为止所拥有的
class DocumentationSection extends React.Component{
render(){
return <div className="section">
<h1 className="section__title">{heading || ""}</h1>
<div className="section__body"> {this.props.children}</div>
<pre className="section__src">
//Change this to produce a JSX string from the elements
{this.props.children}
</pre>
</div>;
}
}
当我将DocumentationSection渲染为
时,如何以'<Div className='myDiv'>...</Div>
格式获取jsx字符串
<DocumentationSection heading='Heading 1'>
<Div className='myDiv'>...</Div>
</DocumentationSection>
感谢。
修改:
我尝试过toString,它dint work,给了[object Object]
答案 0 :(得分:13)
如果您想要React元素的HTML表示,可以使用#renderToString
或#renderToStaticMarkup
。
React.renderToString(<div>p</div>);
React.renderToStaticMarkup(<div>p</div>);
将产生
<div data-reactid=".1" data-react-checksum="-1666119235">p</div>
和
<div>p</div>
分别。但是,您将无法将父项本身呈现为字符串。如果您也需要父级,那么从您渲染的父级传递它的renderToString
版本作为其自身的道具。
答案 1 :(得分:7)
React.renderToString
从React v0.14.0
开始贬值,建议改用ReactDOMServer.renderToString
。
例如
import ReactDOMServer from 'react-dom/server'
...
ReactDOMServer.renderToString(YourJSXElement())
答案 2 :(得分:3)
您可以使用react-element-to-jsx-string:
import React from 'react';
import reactElementToJSXString from 'react-element-to-jsx-string';
console.log(reactElementToJSXString(<div a="1" b="2">Hello, world!</div>));
// <div
// a="1"
// b="2"
// >
// Hello, world!
// </div>
答案 3 :(得分:0)
您还可以使用pretty-format软件包,它是Jest的一部分,由Jest使用,用于显示JSX断言中的差异。
import React from "react";
import prettyFormat from "pretty-format";
import renderer from 'react-test-renderer';
const { ReactTestComponent } = prettyFormat.plugins;
function App() {
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<h2>Start editing to see some magic happen!</h2>
</div>
);
}
console.log(
prettyFormat(renderer.create(<App />), {
plugins: [ReactTestComponent],
printFunctionName: true,
})
);
这将输出如下内容:
<div
className="App"
>
<h1>
Hello CodeSandbox
</h1>
<h2>
Start editing to see some magic happen!
</h2>
</div>
您可以在此CodeSandbox中自行尝试:https://codesandbox.io/s/xvxlw370xp