반응-토글 클래스 onclick
onClick
CSS 속성을 변경하기 위해 활성 클래스 를 전환하는 방법을 알아 내려고 합니다.
나는 많은 접근 방식을 취했고 많은 답변을 읽었습니다. 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)];
this.setState({activeClasses});
}
render() {
const activeClasses = this.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>
);
}
}
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>
)
}
......
위의 답변은 작동하지만 다른 접근 방식을 원할 경우 클래스 이름을 시도 하십시오 : https://github.com/JedWatson/classnames
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도 가능합니다.
좋은 샘플 은 상황을 더 잘 이해하는 데 도움이됩니다.
HTML
<div id="root">
</div>
CSS
.box {
display: block;
width: 200px;
height: 200px;
background-color: gray;
color: white;
text-align: center;
vertical-align: middle;
cursor: pointer;
}
.box.green {
background-color: green;
}
반응 코드
class App extends React.Component {
constructor(props) {
super(props);
this.state = {addClass: false}
}
toggle() {
this.setState({addClass: !this.state.addClass});
}
render() {
let boxClass = ["box"];
if(this.state.addClass) {
boxClass.push('green');
}
return(
<div className={boxClass.join(' ')} onClick={this.toggle.bind(this)}>{this.state.addClass ? "Remove a class" : "Add a class (click the box)"}<br />Read the tutorial <a href="http://www.automationfuel.com" target="_blank">here</a>.</div>
);
}
}
ReactDOM.render(<App />, document.getElementById("root"));
토글 클래스 를 추가 하거나 클릭시 상태를 토글 할 수 있습니다.
class Test extends Component(){
state={
active:false,
}
toggleClass() {
console.log(this.state.active)
this.setState=({
active:true,
})
}
render() {
<div>
<div onClick={this.toggleClass.bind(this)}>
<p>1</p>
</div>
</div>
}
}
저는 최근에 React를 배우기 시작했고 제 지식이 얼마나 발전했는지 확인하기 위해 탭을 만들고 싶었습니다. 나는 이것을 발견하고 redux없이 무언가를 구현하기로 결정했습니다. 나는 대답이 op가 달성하려는 것을 반영하지 않는다고 생각합니다. 그는 하나의 활성 구성 요소 만 원하지만 여기에 대한 답변은 모든 구성 요소를 활성으로 설정합니다. 나는 그것을 주었다.
아래는 탭 파일입니다.
import React, { Component } from 'react';
class Tab extends Component {
render(){
const tabClassName = "col-xs-3 tab-bar";
const activeTab = this.props.activeKey === this.props.keyNumber ? "active-tab" : null;
return (
<div
className = {`${tabClassName} ${activeTab}`}
onClick={()=>this.props.onClick(this.props.keyNumber)}
>
I am here
</div>
);
}
}
export default Tab;
탭 파일 ...
import React, { Component } from 'react';
import Tab from './tab';
class Tabs extends Component {
constructor(props){
super(props);
this.state = {
currentActiveKey: 0,
tabNumber: 2
};
this.setActive = this.setActive.bind(this);
this.setTabNumber = this.setTabNumber.bind(this);
}
setTabNumber(number){
this.setState({
tabNumber: number
});
}
setActive (key){
this.setState({
currentActiveKey: key
});
}
render(){
let tabs = [];
for(let i = 0; i <= this.state.tabNumber; i++){
let tab = <Tab key={i} keyNumber={i} onClick={this.setActive} activeKey={this.state.currentActiveKey}/>;
tabs.push(tab);
}
return (
<div className="row">
{tabs}
</div>
);
}
}
export default Tabs;
색인 파일 ...
import React from 'react';
import ReactDOM from 'react-dom';
import Tabs from './components/tabs';
ReactDOM.render(
<Tabs />
, document.querySelector('.container'));
그리고 CSS
.tab-bar {
margin: 10px 10px;
border: 1px solid grey;
}
.active-tab {
border-top: 1px solid red;
}
This is a skeleton of something I want to improve on so increasing the tabNumber beyond 4 will break the css.
참고URL : https://stackoverflow.com/questions/42630473/react-toggle-class-onclick
'development' 카테고리의 다른 글
Python setuptools : install_requires 아래에 개인 저장소를 나열하려면 어떻게해야합니까? (0) | 2020.11.28 |
---|---|
유효한 git 태그는 어떤 이름입니까? (0) | 2020.11.28 |
'새로 고침'HTTP 헤더 (0) | 2020.11.28 |
OnLocationChanged 콜백은 호출되지 않습니다. (0) | 2020.11.28 |
GitHub 커밋 메시지의 그래픽 (0) | 2020.11.28 |