【问题标题】:Writing conditional statement inside render function in jsx [duplicate]在jsx的渲染函数中编写条件语句[重复]
【发布时间】:2017-05-22 18:22:33
【问题描述】:

我的状态是{visibilityFilter: "completed"}{visibilityFilter: "todo"}。基于此,我想为元素分配类名。像这样的,

<span {this.state.visibilityFilter=="completed"?className="active":className:""}>Completed</span>

但它不起作用。我尝试了它的不同变体,

{<span this.state.visibilityFilter=="completed"?className="active":className:"">Completed</span>}

但它们都不起作用。我知道如果我在 return 语句之外创建一个变量并在 HTML 中分配它,它就可以工作。像这样,

let classCompleted = this.state.visibilityFilter == "completed"? "active":"";

然后,

<span className={`$(classCompleted)`}></span>

但我想知道如何在 return 语句中评估类。

【问题讨论】:

  • This answer 似乎非常适合您的问题
  • @Icepickle:我应该意识到这将是重复的,很好的发现。

标签: javascript reactjs jsx


【解决方案1】:

你已经接近了,你只需将className 部分放在外面:

<span className={this.state.visibilityFilter=="completed" ? "active" : ""} onClick={this.handleFilter.bind(this,'completed')}>Completed</span>

题外话:

每次在onClick 中使用bind 意味着每次该元素渲染时都会重新绑定。您可以考虑在组件的构造函数中执行一次:

class YourComponent extends React.Component {
    constructor(...args) {
        super(...args);
        this.handleFilter = this.handleFilter.bind(this);
        // ...
    }
    handleFilter() {
        // ...
    }
    render() {
        return <span className={this.state.visibilityFilter=="completed" ? "active" : ""} onClick={this.handleFilter}>Completed</span>;
    }
}

如果您在转译器中启用了类属性(截至 2017 年 1 月撰写本文时,它们位于 Babel 中的 stage-2 预设中),则另一个选项是使其成为箭头函数:

class YourComponent extends React.Component {
    // ...
    handleFilter = event => {
        // ...
    };
    render() {
        return <span className={this.state.visibilityFilter=="completed" ? "active" : ""} onClick={this.handleFilter}>Completed</span>;
    }
}

那个例子:

class YourComponent extends React.Component {
    constructor() {
      super();
      this.state = {
        visibilityFilter: ""
      };
    }
    handleFilter = event => {
      this.setState({
        visibilityFilter: "completed"
      });
    };
    render() {
        return <span className={this.state.visibilityFilter == "completed" ? "active" : ""} onClick={this.handleFilter}>Completed</span>;
    }
}
ReactDOM.render(
  <YourComponent />,
  document.getElementById("react")
);
.active {
  color: blue;
}
<div id="react"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

【讨论】:

  • 虽然这完全正确,但 classNames 不是更好的方法吗,例如 here
  • @Icepickle:显然,如果需要,可以免费使用额外的库。
  • @T.J.Crowder 感谢您的回答和建议。
  • @AnuragAwasthi 请使用classNames 库。我试过了,不管有没有,都太棒了。
【解决方案2】:

使用 classNames,一个简单的 JavaScript 实用程序,用于有条件地将类名连接在一起。

注意:我添加了 statetodo 类来演示如何使用多个类。顺便说一句 - cmets 不是有效的 JSX,所以不要按原样使用代码。

<span className={
    state: true, // always 
    active: this.state.visibilityFilter === "completed", // conditional
    todo: this.state.visibilityFilter !== "todo" // conditional
}>
Completed
</span>}

示例(基于T.J. Crowder`s code):

class YourComponent extends React.Component {
    constructor() {
      super();
      this.state = {
        visibilityFilter: ""
      };
    }
    handleFilter = event => {
      this.setState({
        visibilityFilter: "completed"
      });
    };
    render() {
        return (
          <span className={classNames({
          state: true,
          active: this.state.visibilityFilter === "completed"
        })} onClick={this.handleFilter}>Completed
        </span>
       );
    }
}
ReactDOM.render(
  <YourComponent />,
  document.getElementById("react")
);
.state {
  color: red;
  cursor: pointer;
}

.active {
  color: blue;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/classnames/2.2.5/index.min.js"></script>
<div id="react"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

【讨论】:

  • 谢谢。但我想知道我的 jsx 有什么问题。
  • 为此,您已经得到了@T.J.Crowder 的回答 :) 我想您可能想知道存在 classNames 选项。
猜你喜欢
  • 2018-08-02
  • 2017-10-16
  • 2021-05-10
  • 2020-10-12
  • 2018-10-16
  • 2019-12-10
  • 2021-08-24
  • 1970-01-01
  • 2021-10-11
相关资源
最近更新 更多