【问题标题】:Why component name must be enclosed in tag when we render it为什么渲染时组件名称必须包含在标签中
【发布时间】:2021-11-12 15:56:46
【问题描述】:

我只是好奇为什么我们在渲染时必须将组件名称包含在标签中。 我们也可以不用它。

例如

function TemporaryName() {
    return (
        <div>
            <h1>Stack Overflow Question</h1>
            <h1>Stack Overflow Question</h1>
        </div>
    )
}

ReactDOM.render(<TemporaryName />, document.getElementById("root"))

这是附和的行

ReactDOM.render(TemporaryName(), document.getElementById("root"))

也给出了相同的结果。 我知道它必须有一些意义,我想知道为什么?请帮忙

【问题讨论】:

  • 在这种情况下它可以工作,但如果你在 TemporaryName 函数中使用任何钩子,它就不会。这是因为第二个示例没有编译为React.createElement-call。
  • 谢谢你我现在明白了

标签: reactjs jsx


【解决方案1】:

您的第二个示例是将 TemporaryName 作为函数调用,然后将输出传递给渲染。基本上,就像你写的一样:

ReactDOM.render((
  <div>
    <h1>Stack Overflow Question</h1>
    <h1>Stack Overflow Question</h1>
  </div>
), document.getElementById('root'))

&lt;div&gt; 传递给ReactDOM.render 很好,所以您没有看到问题,但是您会遇到更复杂的组件的问题。一旦你尝试使用TemporaryName 中的任何钩子,你就会得到一个错误。您将尝试在调用ReactDOM.render 之前调用钩子,这不起作用。

选项 1 将与钩子一起使用。这样,您可以使用 JSX 标签创建一个反应元素,并将该元素传递给ReactDOM.render。此时这不会调用您的函数,因此不会滥用钩子。稍后,react 将调用您的组件,并且钩子将起作用,因为我们将处于 react 渲染周期的中间。

第二种方法会失败的例子:

function TemporaryName() {
  const [name, setName] = useState('Stack Overflow');
  return (
    <div>
      <h1>{name} Question</h1>
      <h1>{name} Question</h1>
    </div>
  )
}

【讨论】:

  • 感谢您的详细解答
【解决方案2】:

也许是因为当你声明你的组件时你声明了一个函数:function TemporaryName()

【讨论】:

  • 我明白了,但如果我们可以那样做,为什么我们要把它括在标签中呢?
猜你喜欢
  • 1970-01-01
  • 2012-09-19
  • 2015-05-31
  • 1970-01-01
  • 2014-02-16
  • 2021-05-13
  • 2011-09-02
  • 1970-01-01
  • 2016-11-13
相关资源
最近更新 更多