virtual DOM JSX 中的操作(React)

virtual DOM Manipulation in JSX (React)

我正在阅读 Full Stack React The Complete Guide 并且遇到了这个代码片段:

render() {
    if(this.props.timerIsRunning){
        return(
            <div
                className='ui bottom attached red basic button'
                onClick={this.props.onStopClick}
            >
            Stop
            </div>
        )    
    } else {
        return(
            <div
                className='ui bottom attached green basic button'
                onClick={this.props.onStartClick}
            >
            Start
            </div>
        )  
    }
} 

它使用 if 语句来确定组件将呈现什么,是秒表的停止按钮还是开始按钮。这个例子让我想知道是否有一种方法可以使用 less space 来做到这一点。有没有一种方法可以创建 div,然后根据 this.props.timerIsRunning 的值向 div 添加某些属性和 classes?如果这不是 JSX,我会提出这样的建议:

<div id=timerbutton></div>
<script> 
    let timerButtonDiv = document.getElementById(timerbutton)
    if(this.props.timerIsRunning) {
        timerbuttonDiv.className = 'ui bottom attached red basic 
        button'
        timerbuttonDiv.innerHTML = Stop
    } else {
        timerbuttonDiv.className = 'ui bottom attached green basic 
        button'
        timerbuttonDiv.innerHTML = Start
    }
</script>

所以...让这个例子说明我对 JSX 的理解不足,但我想,我只是想知道(来自 Angular 1.X 背景)是否有 React/JSX 相当于 ng-show 或 ng-class。更广泛地说,我想知道就标准 DOM 操作而言,虚拟 DOM 和实际 DOM 之间的界线在哪里。任何关于 React 如何转换 JSX 的资源肯定会有帮助。

JSX 允许你在某些地方使用 {} 块来使用任意 JS。您可以在每个地方检查 timerIsRunning

const running = this.props.timerIsRunning;
return (
    <div
        className={
          `ui bottom attached ${running ? "red" : "green"} basic button`
        }
        onClick={running ? this.props.onStopClick : this.props.onStartClick}
    >
    {running ? "Stop" : "Start"}
    </div>
);

或使用解构将事物组合在一起

const {color, handler, text} = this.props.timerIsRunning ? {
    color: "red",
    handler: this.props.onStopClick,
    text: "Stop",
} : {
    color: "greed",
    handler: this.props.onStartClick,
    text: "Start",
};
return (
    <div
        className={`ui bottom attached ${color} basic button`}
        onClick={handler}
    >
    {text}
    </div>
);

ng-show 等价于 React conditional rendering

ng-class 的等价物(有点)是 classnames 包(不是 React 的一部分),它允许你像这样编写 className 道具:

return (
    <div
        className={classnames('ui bottom attached basic button', {
          red: this.props.timerIsRunning,
          green: !this.props.timerIsRunning,
        })
        onClick={running ? this.props.onStopClick : this.props.onStartClick}
    >
    {running ? "Stop" : "Start"}
    </div>
);