javascript - JSX 内联函数(以编程方式设置?)

标签 javascript reactjs jsx

我想检查状态的真实值并相应地设置一个类。下面的代码就是这样做的,但是......

有没有办法以编程方式执行此操作,也许通过 for 循环来添加所有内联函数检查。

这样做的原因是因为在某些情况下我有数百个项目,并且我不想重复并粘贴相同的代码数百次。

class App extends React.Component {
  constructor() {
    super();
      
    this.state = {
      item1: false,
      item2: true,
      item3: false
    }
  }
  
  render() {    
    return(
      <div className="app">
        <ul>
            <li data-item="item1" className={(this.state.item1) ? "active" : null}>Item 1</li>
            <li data-item="item2" className={(this.state.item2) ? "active" : null}>Item 2</li>
            <li data-item="item3" className={(this.state.item3) ? "active" : null}>Item 3</li>
        </ul>
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById('app'));
.active {
  color: green;
}
<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>

<div id="app"></div>

最佳答案

如果有数千个,它们可能应该位于数组中而不是对象中。但如果需要的话,我们可以以数组的形式获取对象的属性名称。

使用数组代替(参见注释):

class App extends React.Component {
  constructor() {
    super();

    // Turning items into an array
    this.state = {
      items: [
        {name: "item1", label: "Item 1", state: false},
        {name: "item2", label: "Item 2", state: true},
        {name: "item3", label: "Item 3", state: false}
      ]
    };
  }
  
  render() {    
    return(
      <div className="app">
        <ul>
          {/* Loop through the items, outputting them*/}
          {this.state.items.map(item => (
            <li data-item={item.name} className={item.state ? "active" : null}>{item.label}</li>
          ))}
        </ul>
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById('app'));
.active {
  color: green;
}
<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>

<div id="app"></div>

使用您现有的对象加上另一个对象为我们提供项目标签(请参阅评论):

class App extends React.Component {
  constructor() {
    super();
      
    this.state = {
      item1: false,
      item2: true,
      item3: false
    };
    
    // The labels we want on the items
    this.itemNames = {
      item1: "Item 1",
      item2: "Item 2",
      item3: "Item 3"
    };
  }
  
  render() {    
    return(
      <div className="app">
        <ul>
          {/* Loop through the items, outputting them*/}
          {Object.keys(this.state).map(key => (
            <li data-item={key} className={this.state[key] ? "active" : null}>{this.itemNames[key]}</li>
          ))}
        </ul>
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById('app'));
.active {
  color: green;
}
<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>

<div id="app"></div>

关于javascript - JSX 内联函数(以编程方式设置?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39961542/

相关文章:

javascript - 如何找出脚本加载两次的位置?

javascript - 返回导航/页面刷新问题

reactjs - React.memo 性能比 React.PureComponent 差

javascript - 无法正确使用 Next.js 进行获取

css - 如何在 Meteor-React 设置中使用 D3-force 渲染 D3?

javascript - react JSX : Maximum update depth exceeded

javascript - 包含动态 html 的 React 函数返回未呈现

javascript - 在嵌套导航器中导航时未定义 route.params?

reactjs - 模块解析失败: es6 react component with JSX inside . JS文件

javascript - 如何使用反向 float 和溢出渲染内联列表