如何在React组件的渲染方法中使用注释?

我有以下组件:

'use strict';
 var React = require('react'),
   Button = require('./button'),
   UnorderedList = require('./unordered-list');

class Dropdown extends React.Component{
  constructor(props) {
    super(props);
  }
  handleClick() {
    alert('I am click here');
  }

  render() {
    return (
      <div className="dropdown">
        // whenClicked is a property not an event, per se.
        <Button whenClicked={this.handleClick} className="btn-default" title={this.props.title} subTitleClassName="caret"></Button>
        <UnorderedList />
      </div>
    )
  }
}

module.exports = Dropdown;

我的评论显示在UI中。

在组件的呈现方法中应用单行和多行注释的正确方法是什么?


在呈现方法中允许使用注释,但是为了在JSX中使用它们,必须将它们括在大括号中并使用多行风格的注释。

<div className="dropdown">
    {/* whenClicked is a property not an event, per se. */}
    <Button whenClicked={this.handleClick} className="btn-default" title={this.props.title} subTitleClassName="caret"></Button>
    <UnorderedList />
</div>

您可以在这里阅读更多关于JSX中注释如何工作的信息。


下面是另一种允许你使用//来包含注释的方法:

return (
  <div>
    <div>
      {
        // Your comment goes in here.
      }
    </div>
    {
      // Note that comments using this style must be wrapped in curly braces!
    }
  </div>
);

这里的问题是,使用这种方法不能包含一行注释。例如,这是行不通的:

{// your comment cannot be like this}

因为右括号}被认为是注释的一部分,因此被忽略,这会抛出一个错误。


这就是方法。

有效:

...
render() {

  return (
    <p>
       {/* This is a comment, one line */}

       {// This is a block 
        // yoohoo
        // ...
       }

       {/* This is a block 
         yoohoo
         ...
         */
       }
    </p>
  )

}
...

无效:

...
render() {

  return (
    <p>
       {// This is not a comment! oops! }

       {//
        Invalid comment
       //}
    </p>
  )

}
...

JSX中的JavaScript注释被解析为文本并显示在应用程序中。

你不能只在JSX中使用HTML注释,因为它将它们视为DOM节点:

render() {
  return (
    <div>
      <!-- This doesn't work! -->
    </div>
  )
}

用于单行和多行注释的JSX注释遵循约定

单行注释:

{/* A JSX comment */}

多行注释:

{/*
  Multi
  line
  comment
*/}

另一方面,下面是一个有效的注释,直接从一个工作的应用程序:

render () {
    return <DeleteResourceButton
            // Confirm
            onDelete = {this.onDelete.bind(this)}
            message = "This file will be deleted from the server."
           />
}

显然,在JSX元素的尖括号内,//语法是有效的,但{/**/}是无效的。以下是休息时间:

render () {
    return <DeleteResourceButton
            {/* Confirm */}
            onDelete = {this.onDelete.bind(this)}
            message = "This file will be deleted from the server."
           />
}

{
    // Any valid JavaScript expression
}

如果您想知道为什么它可以工作,那是因为大括号{}内的所有内容都是JavaScript表达式。

所以这也很好:

{ /*
         Yet another JavaScript expression
*/ }

JSX注释语法: 你可以使用

{/** 
  your comment 
  in multiple lines
  for documentation 
**/} 

or

{/* 
  your comment 
  in multiple lines
*/} 

对于多行注释。 而且,

{ 
  //your comment 
} 

对于单行注释。

注意:语法: {//你的评论} 是行不通的。你需要在新行中输入大括号。

花括号用于在React组件中区分JSX和JavaScript。 在花括号内,我们使用JavaScript注释语法。

参考资料:按此处


总而言之,JSX不支持注释,无论是类似html的还是类似js的:

<div>
    /* This will be rendered as text */
    // as well as this
    <!-- While this will cause compilation failure -->
</div>

在JSX中添加注释的唯一方法实际上是逃到JS中并在那里添加注释:

<div>
    {/* This won't be rendered */}
    {// just be sure that your closing bracket is out of comment
    }
</div>

如果你不想做些无聊的事

<div style={{display:'none'}}>
    actually, there are other stupid ways to add "comments"
    but cluttering your DOM is not a good idea
</div>

最后,如果你确实想通过React创建一个注释节点,你必须更加花哨,看看这个答案。


除了其他答案,还可以在JSX开始或结束之前或之后使用单行注释。以下是一个完整的总结:

有效的

(
  // this is a valid comment
  <div>
    ...
  </div>
  // this is also a valid comment
  /* this is also valid */
)

如果我们要在JSX呈现逻辑中使用注释:

(
  <div>
    {/* <h1>Valid comment</h1> */}
  </div>
)

在声明props时,可以使用单行注释:

(
  <div
    className="content" /* valid comment */
    onClick={() => {}} // valid comment
  >
    ...
  </div>
)

无效的

当在JSX中使用单行或多行注释而不使用{}包装它们时,注释将被呈现给UI:

(
  <div>
    // invalid comment, renders in the UI
  </div>
)

在React Native中添加注释的两种方法

//(双正斜杠)只用于注释React Native代码中的一行,但它只能在渲染块之外使用。如果您想在我们使用JSX的呈现块中注释,则需要使用第二种方法。 如果你想在JSX中注释一些东西,你需要在花括号内使用JavaScript注释,如{/* comment here /}。它是一个常规的/ Block注释*/,但它需要用大括号括起来。

/*块注释*/的快捷键:

Windows和Linux下按Ctrl + /。 Cmd + /在macOS上。


根据React的文档,你可以像这样在JSX中编写注释:

单行注释:

<div>
  {/* Comment goes here */}
  Hello, {name}!
</div>

多行注释:

<div>
  {/* It also works 
  for multi-line comments. */}
  Hello, {name}! 
</div>

{/ * <标题- > <内容- > < MapList - > < HelloWorld - > * /}


根据官方网站,这是两种方式:

<div>
  {/* Comment goes here */}
  Hello, {name}!
</div>

第二个例子:

<div>
    {/* It also works 
    for multi-line comments. */}
    Hello, {name}! 
</div>

参考资料如下:如何在JSX中编写注释?


有条件的呈现

React文档中提到的这种方法也适用于嵌套的/**/注释,不像{/**/}方法,例如:

{false && <>
<div>
  Commented out.
  /* Anything goes. */
</div>
</>}

完整的例子:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hello, World!</title>
<script src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone@7.14.7/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
ReactDOM.render(
  <div>
    before
    {false && <>
    <div>
      Commented out.
      /* Anything goes. */
    </div>
    <div>
      Also commented out.
      /* Anything goes. */
    </div>
    </>}
    after
  </div>
  ,
  document.getElementById('root')
);
</script>
</body>
</html>

只渲染前后。

啊,刚刚注意到,这样做的一个缺点是,像typescript这样的linter可能会抱怨“注释”中不正确的东西。


下面是React中注释的6种方式:

多行TypeScript注释 属性注释 单行JSX注释 单行JSX注释 多行JSX注释 单行JavaScript注释

/**
 * 1. Multi-line
 * TypeScript comment
 * @constructor
 */

export const GoodQuote = observer(({model} : { model: HomeModel }) => {

    console.log(model.selectedIndex)
    return useObserver(() =>
        <div /* 2. HTML attribute comment */ onClick={() => model.toggleQuote()}>
            <p>{model.quotes[model.selectedIndex]}</p>
            {
                // 3. Single-line comment
            }
            { /* 4. True Single-line comment */}
            { /*
              5. Multi-line
              React comment
            */ }
        </div> // 6. Javascript style comment

    )
})