react:如何将孩子作为字符串?

IT技术 reactjs
2021-03-26 06:58:54

我正在为我们正在构建的几个组件编写文档,因此文档(也是一个 react 组件)如下所示:

const myDoc = () => (
  <div>
    <MyComponent title="MyTitle" />
    <code className="language-jsx">
       {`<MyComponent title="MyTitle" />`}
    </code>
  </div>
)

看到 MyComponent 上的重复了吗?所以我创建了“代码”组件来处理:

const Code = ({ children }) => (
  <div>
    {children}
    <code>
       {children}
    </code>
  </div>
)

那么 MyDoc 现在是:

const myDoc = () => (
  <Code>
    <MyComponent title="MyTitle" />
  </Code>
)

但是由于 Code 中的 children 是一个对象,它不会呈现为字符串。

有没有办法实现这一目标?或者也许有更好的解决方案?

3个回答

我也在写文档,我也不想每次更改演示时都更改降价文件。我想要类似 element.innerHTML 的东西。

我偶然发现了这个答案,并在进一步搜索时在 github 中找到了这个名为jsxToString 的

只是提一下以防其他人也试图做文档并在这篇文章中跌跌撞撞。

试试这个:

const MyComponent = ({
  title
}) => (
  <div>{title}</div>
)

const MyDoc = () => (
  <Code>
    <MyComponent title="My title" obj={{obj: {obj: 1}}}>
      <MyComponent title="My another component title">
        <MyComponent title="My another component title" />
      </MyComponent>
    </MyComponent>
  </Code>
)

const Code = ({
  children
}) => (
  <div>
    {children}
    <pre><code>
      {JsxString(children)}
      </code></pre>
  </div>
)

const JsxString = (component, counter = 0) => {
  let type = component.type.name;
  let props = component.props;
  let propsString = "";
  for (let key in props) {
    if (key !== "children") {
      let propValue = props[key];
      let value = "";
      if (propValue instanceof Object) {
        value = `{${JSON.stringify(propValue).replace(/['"]+/g, '')}}`;
      } else {
        value = `"${propValue}"`;
      }
      propsString += ` ${key}=${value}`;
    }
  }
  if (props.children) {
    counter += 2;
    var children = JsxString(props.children, counter);
    return `<${type}${propsString}>
${Array(counter).join(" ")}  ${children}
${Array(counter).join(" ")}</${type}>`;
  }
  return `<${type}${propsString} />`;
}

ReactDOM.render(
  <MyDoc />,
  document.getElementById('container')
);
请尝试在您的答案中包含文本以配合您发布的代码。附加文本添加上下文并有助于使您的答案更加具体。
2021-06-02 06:58:54
安装它的好主意。我发现了一些使用它的错误(例如:当孩子是一组项目(兄弟姐妹)时)。然而,这是一个好的开始。谢谢!
2021-06-21 06:58:54

你真的没有重复。因为第一个<MyComponent title="MyTitle" />是(编译和)运行的代码,而第二个是您想要显示的字符串。一旦从 JSX 编译到 JS,它们之间就没有太多相似之处,这使得充其量很难以通用方式从另一个中获取一个。

我建议直接离开。