将React.element转换为JSX字符串

时间:2015-12-06 06:19:31

标签: javascript reactjs

我正在尝试构建一个组件,

  1. 带孩子和
  2. 在DOM中呈现子项,
  3. 出于文档考虑,在pre中显示子DOM
  4. 一种解决方案是将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]

4 个答案:

答案 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.renderToStringReact 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