1

我正在尝试:使一个选项卡处于活动状态并关闭所有其他选项卡。目前我只能让它在一次关闭和打开的地方工作。

我试图弄清楚我该如何做到这一点。我在想有没有办法将父组件传递给函数,然后能够访问其所有子组件的 className 属性?目前我有:

import React from 'react';
import ReactDOM from 'react-dom';


export default class TestContainer extends React.Component{


        setActive(event){
           event.preventDefault();

           //getting id from component
           let isActive = event.target.id;


           if(event.currentTarget.className === "list-group-item text-center active"){
                   event.currentTarget.className = "list-group-item text-center";
           } else if(event.currentTarget.className === "list-group-item text-center") {
                   event.currentTarget.className = "list-group-item text-center active";
           }

        }



        render(){   




         return (                               

                <div className="col-lg-6 col-md-6 col-sm-6 col-xs-6 bhoechie-tab-container    scroll-y">
                        <div className="col-lg-2 col-md-2 col-sm-2 col-xs-2 bhoechie-tab-menu">
                                <div className="list-group">
                                        <a href="#" onClick={this.setActive} id="eyes" className="list-group-item text-center active">
                                                <h4 className="glyphicon glyphicon-eye-close"></h4><br/>1
                                        </a>
                                        <a href="#" onClick={this.setActive} id="hair" className="list-group-item text-center">
                                                <h4 className="glyphicon glyphicon-tint"></h4><br/>2
                                        </a>
                                        <a href="#" onClick={this.setActive} id="mouth" className="list-group-item text-center">
                                                <h4 className="glyphicon glyphicon-minus"></h4><br/>3
                                        </a>
                                        <a href="#" onClick={this.setActive} id="clothing" className="list-group-item text-center">
                                                <h4 className="glyphicon glyphicon-user"></h4><br/>4
                                        </a>
                                        <a href="#" onClick={this.setActive} id="props" className="list-group-item text-center">
                                                <h4 className="glyphicon glyphicon-gift"></h4><br/>5
                                        </a>
                                </div>
                        </div>
)}
4

1 回答 1

0

通过尝试在方法之外更改元素的状态render(),您正在与 React 渲染引擎的优势作斗争。使用组件内部或通过 props/context(最好是 props)提供的状态来确定应该active在其 className 中呈现哪个选项卡。

当您响应单击时,更改状态并让 React 根据新状态重新渲染组件。

对于此处提供的有限示例,我建议将活动元素的 ID 在内部存储在组件的状态中。

export default class TestContainer extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      activeTab: this.props.activeTab || 'eyes'
    };
  }

  setActive(event) {
    this.setState({ activeTab: event.target.id });
  }

  render() {
    const { activeTab } = this.state;
    const tabClassName = "list-group-item text-center";
    const eyesTabClassName = tabClassName + (activeTab === 'eyes' ? ' active' : '');

    ...

              <a href="#" onClick={this.setActive} id="eyes" className={eyesTabClassName}>

    ...

  }
}

这是一个粗略的、未经优化的解决方案,但它应该可以理解这个想法。当您调用 时this.setState,React 会通过将组件标记为需要重新渲染来做出响应。该render()方法将被自动调用,因此您的所有 JSX 都将被重新评估和重新渲染。然后,React 将查看它刚刚生成的内容与虚拟 DOM 中已经存在的内容之间的差异,并合并您的更改。

这意味着先前在其 className 中使用“活动”呈现的任何选项卡都将被重新呈现。如果它不再处于活动状态,您的渲染代码将不会将活动类连接到该选项卡的类名中。此外,现在无论哪个类处于活动状态,其 className 都将附加“活动”。

TL;博士

不要在事件处理程序中操纵 DOM。操纵状态,让 React 通过重新渲染你的新状态来发挥它的魔力。

于 2016-06-17T13:41:57.713 回答