【问题标题】:Can I pass HTML tag as prop - React我可以将 HTML 标记作为道具传递吗 - React
【发布时间】:2018-08-16 06:45:40
【问题描述】:

我想做这样的事情。

在父组件中

<child tag={h1}/>

在子组件中

<this.props.tag />

当我传递 html 组件(标签)之一时抛出“未解析的变量或类型 div”问题,例如(div、h1、ext.)

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    更新:

    是的,我们可以将 HTML 标记作为道具传递。根据您的需要,有几种方法。

    1. 将标签作为道具传递
    <ChildComponent tag="h1" />
    

    在子组件内部,我们可以使用如下标签。

    const Child = ({ tag: Tag}) => (
        <Tag>Hello World</Tag>
    )
    
    1. 通过设置dangerouslySetInnerHTML
    <Child tags="<h1>Hello world</h1>" />
    

    子组件内部:

    const Child = props => <div dangerouslySetInnerHTML={{ __html: props.tags.outerHTML }}/>
    

    Here 是您应该了解的危险SetInnerHTML。简而言之,这暴露了 XSS 攻击。

    这个与作为道具传递无关。但你可能要考虑

    如果您正在执行与 SEO 相关的任务(可能是 nextjs)并且您需要渲染条件标签(有时是 h2,有时是 h3)。然后你就可以按照以下方式进行操作了!

    1. 条件语句
    // Parent
    const Parent = () => <Child isH3Tag />
    
    // Child
    const Child = ({ isH3Tag = false, children }) => isH3Tag ? <h3>{children}</h3> : <h2>{children}</h2>;
    

    这是一个演示。 https://codesandbox.io/s/8x65l707yj

    【讨论】:

    • @Si8 怎么样?如果你说const h1 =' h1' 并且你想通过它。使用第一种方法。否则,请与我分享代码的简要说明。
    • 如何在方法1中定义默认标签?
    • 你可以像const Child = ({ tag: Tag = yourTag }) =&gt; {}那样做。
    【解决方案2】:

    JSX 表达式必须以大写字母开头,例如&lt;Elment /&gt;

    在您的情况下,当您想传递标签名称时,请使用 createElement:

    <div>
      {React.createElement(this.props.tag, {children: <content>, prop1: <v1>, ...})}
    <div>
    

    另一种选择是使用recompose#componentFromProp

    【讨论】:

      【解决方案3】:

      您可以像这样从父组件传递tag 作为子组件:
      在父组件中:

      <Child> <h1></h1> </Child>
      

      在子组件中你可以像这样访问:

      使成为() { 返回 ( {this.props.children} ) }

      【讨论】:

        猜你喜欢
        • 2021-11-01
        • 2020-09-14
        • 2017-02-01
        • 1970-01-01
        • 2020-02-18
        • 2023-03-12
        • 2018-08-01
        • 2022-11-05
        • 1970-01-01
        相关资源
        最近更新 更多