[javascript] 반응-토글 클래스 onclick

onClickCSS 속성을 변경하기 위해 활성 클래스 를 전환하는 방법을 알아 내려고 합니다.

나는 많은 접근 방식을 취했고 많은 답변을 읽었습니다. jquery를 사용하면 상대적으로 간단하지만 반응으로 이것을 할 수는 없습니다. 내 코드는 다음과 같습니다. 누구든지 내가 이것을 어떻게해야하는지 조언 할 수 있습니까?

각 항목에 대한 새 구성 요소를 만들지 않고도이 작업을 수행 할 수 있습니까?

class Test extends Component(){

    constructor(props) {

    super(props);
    this.addActiveClass= this.addActiveClass.bind(this);

  }

  addActiveClass() {

    //not sure what to do here

  }

    render() {
    <div>
      <div onClick={this.addActiveClass}>
        <p>1</p>
      </div>
      <div onClick={this.addActiveClass}>
        <p>2</p>
      </div>
        <div onClick={this.addActiveClass}>
        <p>3</p>
      </div>
    </div>
  }

}



답변

상태를 사용하십시오. Reacts 문서는 여기에 있습니다 .

class MyComponent extends Component {
    constructor(props) {
        super(props);
        this.addActiveClass= this.addActiveClass.bind(this);
        this.state = {
            active: false,
        };
    }
    toggleClass() {
        const currentState = this.state.active;
        this.setState({ active: !currentState });
    };

    render() {
        return (
            <div
                className={this.state.active ? 'your_className': null}
                onClick={this.toggleClass}
            >
                <p>{this.props.text}</p>
            </div>
        )
  }
}

class Test extends Component {
    render() {
        return (
            <div>
                <MyComponent text={'1'} />
                <MyComponent text={'2'} />
            </div>
        );
    }
}


답변

인라인 if 문에서 “&&”연산자를 사용하는 것을 선호합니다. 내 의견에서는 이런 식으로 더 깨끗한 코드베이스를 제공합니다.

일반적으로 다음과 같이 할 수 있습니다.

render(){
return(
  <div>
    <button className={this.state.active && 'active'}
      onClick={ () => this.setState({active: !this.state.active}) }>Click me</button>
  </div>
)
}

화살표 함수는 ES6 기능이라는 점을 명심하고 constructor () {} 클래스에서 ‘this.state.active’값을 설정하는 것을 잊지 마십시오.

this.state = { active: false }

또는 JSX에 CSS를 삽입하려면 이렇게 할 수 있습니다.

<button style={this.state.active && style.button} >button</button>

스타일 json 변수를 선언 할 수 있습니다.

const style = { button: { background:'red' } }

JSX 스타일 시트에서 camelCase를 사용하는 것을 기억하십시오.


답변

글쎄, 당신의 addActiveClass는 무엇을 클릭했는지 알아야합니다. 이와 같은 것이 작동 할 수 있습니다 (어떤 div가 상태 배열로 활성 상태인지 정보를 추가했으며 onClick이 이제 매개 변수로 클릭 된 정보를 전달한 후 상태가 그에 따라 업데이트된다는 점에 유의하십시오. 확실히 더 현명한 방법이 있습니다. 하지만 당신은 아이디어를 얻습니다).

class Test extends Component(){

  constructor(props) {
    super(props);
    this.state = {activeClasses: [false, false, false]};
    this.addActiveClass= this.addActiveClass.bind(this);
  }

  addActiveClass(index) {
    const activeClasses = [...this.state.activeClasses.slice(0, index), !this.state.activeClasses[index], this.state.activeClasses.slice(index + 1)].flat();
    this.setState({activeClasses});
  }

  render() {
    const activeClasses = this.state.activeClasses.slice();
    return (
      <div>
        <div className={activeClasses[0]? "active" : "inactive"} onClick={() => this.addActiveClass(0)}>
          <p>0</p>
        </div>
        <div className={activeClasses[1]? "active" : "inactive"} onClick={() => this.addActiveClass(1)}>
          <p>1</p>
        </div>
          <div  onClick={() => this.addActiveClass(2)}>
          <p>2</p>
        </div>
      </div>
    );
  }
}


답변

후크를 사용 하여이 작업을 수행 할 수도 있습니다 .

function MyComponent (props) {
  const [isActive, setActive] = useState(false);

  const toggleClass = () => {
    setActive(!isActive);
  };

  return (
    <div
      className={isActive ? 'your_className': null}
      onClick={toggleClass}
    >
      <p>{props.text}</p>
    </div>
   );
}


답변

React를 사용하면 모든 ID / 요소에 토글 클래스를 추가 할 수 있습니다.

style.css

.hide-text{
    display: none !important;
    /* transition: 2s all ease-in 0.9s; */
  }
.left-menu-main-link{
    transition: all ease-in 0.4s;
}
.leftbar-open{
    width: 240px;
    min-width: 240px;
    /* transition: all ease-in 0.4s; */
}
.leftbar-close{
    width: 88px;
    min-width:88px;
    transition: all ease-in 0.4s;
}

fileName.js

......
    ToggleMenu=()=>{
             this.setState({
                isActive: !this.state.isActive
              })
              console.log(this.state.isActive)
        }
        render() {
            return (
                <div className={this.state.isActive===true ? "left-panel leftbar-open" : "left-panel leftbar-close"} id="leftPanel">
                    <div className="top-logo-container"  onClick={this.ToggleMenu}>
                            <span className={this.state.isActive===true ? "left-menu-main-link hide-from-menu" : "hide-text"}>Welcome!</span>
                    </div>

                    <div className="welcome-member">
                        <span className={this.state.isActive===true ? "left-menu-main-link hide-from-menu" : "hide-text"}>Welcome<br/>SDO Rizwan</span>
                    </div>
    )
    }
......


답변

React에는 구성 요소 상태 개념이 있으므로 전환하려면 다음을 수행하십시오 setState.

constructor(props) {
  super(props);

  this.addActiveClass= this.addActiveClass.bind(this);
  this.state = {
    isActive: false
  }
}

addActiveClass() {
  this.setState({
    isActive: true
  })
}

구성 요소에서 this.state.isActive필요한 것을 렌더링하는 데 사용하십시오.

컴포넌트 # 1에서 상태를 설정하고 컴포넌트 # 2에서 사용하려는 경우 더 복잡해집니다. 반응 단방향 데이터 흐름에 대해 더 자세히 알아보고 처리하는 데 도움이 될 수있는 redux를 사용하십시오.


답변

위의 답변은 작동하지만 다른 접근 방식을 원할 경우 클래스 이름을 시도 하십시오 : https://github.com/JedWatson/classnames