প্রতিক্রিয়া - টগল ক্লাস অনক্লিক


93

আমি onClickসিএসএসের বৈশিষ্ট্যগুলি পরিবর্তন করতে কীভাবে সক্রিয় শ্রেণিতে টগল করব তা নির্ধারণ করার চেষ্টা করছি am

আমি অনেক পন্থা গ্রহণ করেছি, এবং অনেক এসও উত্তর পড়েছি। 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>
  }

}

উত্তর:


86

রাষ্ট্র ব্যবহার করুন। প্রতিক্রিয়া ডক্স এখানে

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>
        );
    }
}

4
অতিরিক্ত উপাদান তৈরি না করে এটি করার কোনও উপায় আছে?
পিটার ফ্লানাগান

4
আপনি জটিল উপাদানগুলিকে ছোট ছোট ভাগে বিভক্ত করতে চান ফেসবুক.
github.io/react/docs/…

4
আমি উপাদানটি ভেঙে ফেলেছি, তবে activeএটি ক্লিকের প্রতিটি উপাদানকে যুক্ত করে। আমি কেবল একটি উপাদানকে একটি সক্রিয় ক্লাস করতে চাই
পিটার ফ্লানাগান

4
এটিকে টগলড 'সক্রিয়' শ্রেণি বলা যায় না কারণ অন্যান্য উপাদানগুলির সক্রিয় ক্লাসগুলি এখনও রয়েছে।
ডেটা টিটি

6
আপনি দয়া করে onClickভুল হিসাবে সমস্ত ছোট হাতের বিপরীতে ব্যবহার করার উত্তর আপডেট করতে পারেন
পিটার ফ্লানাগান

24

আমি যদি ইন-স্টেটমেন্টে ইনলাইনটিতে "&&" -অপরেটর ব্যবহার পছন্দ করি। আমার মতামতে এটি ক্লিনার কোডবেস এইভাবে দেয়।

সাধারণত আপনি এই জাতীয় কিছু করতে পারেন

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

শুধু মনে রাখবেন তীর ফাংশনটি ES6 বৈশিষ্ট্য এবং ক্লাস কনস্ট্রাক্টর () {in এ 'this.state.active' মান সেট করতে মনে রাখবেন feature

this.state = { active: false }

অথবা আপনি যদি জেএসএক্সে সিএসএস ইনজেক্ট করতে চান তবে আপনি এটি এইভাবে সক্ষম করতে পারবেন

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

এবং আপনি স্টাইল জেসন ভেরিয়েবল ঘোষণা করতে পারেন

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

জেএসএক্স স্টাইলশিটে উটকেস ব্যবহার করা মনে রাখবেন।


4
উপাদানগুলিতে সাধারণ শ্রেণীবদ্ধদের টগল করার এটি হ'লতম উপায়।
সিওয়ারারিওর 404

11

ঠিক আছে, আপনার addActiveClass এ ক্লিক করা হয়েছে তা জানতে হবে। এর মতো কিছু কাজ করতে পারে (লক্ষ্য করুন যে আমি তথ্যগুলি যুক্ত করেছি যা ডিভগুলি স্টেট অ্যারে হিসাবে সক্রিয় রয়েছে, এবং সেই অনক্লিক এখন সেই তথ্যটিকে পরামিতি হিসাবে ক্লিক করেছিল যা পরে সেই অনুযায়ী রাষ্ট্র আপডেট করা হয় - অবশ্যই স্পষ্টতর উপায় আছে এটি করুন, তবে আপনি ধারণা পাবেন)।

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>
    );
  }
}

8

আপনি এটি হুক দিয়েও করতে পারেন ।

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>
   );
}  

4

প্রতিক্রিয়া ব্যবহার করে আপনি কোনও আইডি / এলিমেন্টে টগল ক্লাস যুক্ত করতে পারেন, চেষ্টা করুন

স্টাইল। 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>
    )
    }
......

আমি এটিতে যুক্ত করতে চাই যে আপনি যদি একটি "অ্যাক্টিভ" স্টেটমেন্টের প্রতিটিটির জন্য সংজ্ঞায়িত করতে চান না এমন একটি স্ট্যাটিক ক্লাস থাকে তবে আপনি নীচের কোড-স্টাইলটি ব্যবহার করতে পারেন:className={`left-panel ${this.state.isActive===true ? 'leftbar-open' : 'leftbar-close'}`}
জেলিএক্স

4

প্রতিক্রিয়াটির উপাদানগুলির একটি ধারণা রয়েছে, সুতরাং আপনি যদি এটি পরিবর্তন করতে চান তবে একটি করুন 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 তে ব্যবহার করতে চান এটি আরও জটিল হয়ে ওঠে। অভিমুখী ডেটা প্রবাহকে প্রতিক্রিয়া জানাতে এবং সম্ভবত রিডেক্সের ক্ষেত্রে আরও খনন করুন যা আপনাকে এটি পরিচালনা করতে সহায়তা করবে।


আমি বুঝতে পারি stateতবে এটি এখনও কোনও উপাদান ক্লিক করলে ক্লাসের নাম কীভাবে আপডেট করবেন তা সত্যভাবে ব্যাখ্যা করে না
পিটার ফ্লানাগান

আপনার jsx মার্কআপ করতে - <div className={this.state.isActive ? 'active' : ''}>। এটি শর্তাধীন রেন্ডারিং সম্পর্কে, তবে এখনও রাষ্ট্রের উপর নির্ভর করে।
ধোরলিক

তবে এটি ক্লিকের প্রতিটি আইটেমে সক্রিয় শ্রেণি যুক্ত করবে। আমি কেবল আইটেমটির activeক্লাসের নামটি পেতে ক্লিক করতে চাই
পিটার ফ্লানাগান

4
কেন প্রতিটি আইটেম? এটি আপনি যে আইটেমটির জন্য শর্তটি যুক্ত করেছেন তাতে ক্লাস যুক্ত হবে। আদর্শভাবে আপনার আইটেমগুলি Itemউপাদানটিতে বিমূর্ত হওয়া উচিত । এরপরে আপনি এটি 3 বার অন্তর্ভুক্ত করবেন এবং মূলত 3 টি আইটেম থাকবে যার প্রত্যেকটির নিজস্ব isActiveরাজ্য থাকবে। তুমি কি বোঝাতে চাইছ?
ধোরলিক

এটি একটি Itemউপাদান মধ্যে বিভক্ত না করে এটি করার কোন উপায় আছে?
পিটার ফ্লানাগান


2

একটি ভাল নমুনা জিনিসগুলি আরও ভালভাবে বুঝতে সাহায্য করবে:

এইচটিএমএল

<div id="root">
</div>

সিএসএস

.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"));

2

আপনি ক্লিকে টগল ক্লাস বা টগল স্টেট যুক্ত করতে পারেন

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>
  }

}

2

সঠিক উত্তর প্রদানের জন্য @ সিএসএসকোকে ধন্যবাদ, তবে আপনি নিজে চেষ্টা করে দেখলে বুঝতে পারবেন যে এটি কার্যকর হয় না। @ মেটেই রাদু দ্বারা একটি পরামর্শ দেওয়া হয়েছে, তবে @cssko দ্বারা প্রত্যাখ্যান করা হয়েছে, সুতরাং কোডটি অগ্রহণযোগ্য থেকে যায় (এটি ত্রুটি ছুঁড়ে ফেলবে 'অপরিজ্ঞাতিত সম্পত্তি সংশোধন করতে পারে না')। নীচে কার্যকারী সঠিক উত্তর:

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

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

class Test extends React.Component {
  render() {
    return ( <
      div >
      <
      MyComponent text = {
        'Clicking this will toggle the opacity through css class'
      }
      /> < /
      div >
    );
  }
}

ReactDOM.render( <
  Test / > ,
  document.body
);
.your_className {
  opacity: 0.3
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.12.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.12.0/umd/react-dom.production.min.js"></script>


1

আমি সম্প্রতি প্রতিক্রিয়া শিখতে শুরু করেছি এবং আমার জ্ঞানটি কতটা এগিয়ে গেছে তা দেখার জন্য একটি ট্যাব তৈরি করতে চেয়েছিলাম। আমি এটি পেরিয়ে এসে রিডেক্স ছাড়াই কিছু বাস্তবায়ন করার সিদ্ধান্ত নিয়েছি। আমি একরকম অনুভব করি যে উত্তরগুলি কী অর্জন করতে চায় তা প্রতিফলিত করে না। তিনি কেবল একটি সক্রিয় উপাদান চান তবে এখানে উত্তরগুলি সমস্ত উপাদান সক্রিয় করে দেবে। আমি এটি একটি শট দেওয়া আছে।

নীচে একটি ট্যাব ফাইল রয়েছে

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'));

এবং সিএসএস

.tab-bar {
    margin: 10px 10px;
    border: 1px solid grey;
}

.active-tab {
    border-top: 1px solid red;
}

এটি এমন কিছুর একটি কঙ্কাল যা আমি উন্নত করতে চাই তাই 4 এর বাইরে ট্যাববার্বার বৃদ্ধি করা CSS টি ভেঙে দেবে।


1

এখানে একটি কোড আমি এনেছি:

import React, {Component} from "react";
import './header.css'

export default class Header extends Component{
    state = {
        active : false
    };


    toggleMenuSwitch = () => {
        this.setState((state)=>{
            return{
                active: !state.active
            }
        })
    };
    render() {
        //destructuring
        const {active} = this.state;

        let className = 'toggle__sidebar';

        if(active){
            className += ' active';
        }

        return(
            <header className="header">
                <div className="header__wrapper">
                    <div className="header__cell header__cell--logo opened">
                        <a href="#" className="logo">
                            <img src="https://www.nrgcrm.olezzek.id.lv/images/logo.svg" alt=""/>
                        </a>
                        <a href="#" className={className}
                           onClick={ this.toggleMenuSwitch }
                           data-toggle="sidebar">
                            <i></i>
                        </a>
                    </div>
                    <div className="header__cell">

                    </div>
                </div>
            </header>
        );
    };
};

1

প্রতিক্রিয়াটির উপাদানগুলির একটি ধারণা রয়েছে, সুতরাং আপনি যদি টগল করতে চান তবে সেটস্টেটটি ব্যবহার করুন:

  1. App.js
import React from 'react';

import TestState from './components/TestState';

class App extends React.Component {
  render() {
    return (
      <div className="App">
        <h1>React State Example</h1>
        <TestState/>
      </div>
    );
  }
}

export default App;
  1. উপাদান / টেস্টস্টেট.জেএস
import React from 'react';

class TestState extends React.Component
{

    constructor()
    {
        super();
        this.state = {
            message: 'Please subscribe',
            status: "Subscribe"
        }
    }

    changeMessage()
    {
        if (this.state.status === 'Subscribe')
        {
            this.setState({message : 'Thank You For Scubscribing.', status: 'Unsubscribe'})
        }
        else
        {
            this.setState({ message: 'Please subscribe', status: 'Subscribe' })
        }
    }
    
    render()
    {
        return (
            <div>
                <h1>{this.state.message}</h1>
        <button onClick={()=> this.changeMessage() } >{this.state.status}</button>
            </div>
        )
    }
}

export default TestState;
  1. আউটপুট

এখানে চিত্র বর্ণনা লিখুন


0

শুধু আমার পদ্ধতির যোগ করতে চেয়েছিলেন। হুকস এবং প্রসঙ্গ সরবরাহকারী ব্যবহার করে।

Nav.js

function NavBar() {
  const filterDispatch = useDispatchFilter()
  const {filter} = useStateFilter()
  const activeRef = useRef(null)
  const completeRef = useRef(null)
  const cancelRef = useRef(null)

  useEffect(() => {
    let activeClass = '';
    let completeClass = '';
    let cancelClass = '';
    if(filter === ACTIVE_ORDERS){
      activeClass='is-active'
    }else if ( filter === COMPLETE_ORDERS ){
      completeClass='is-active'
    }else if(filter === CANCEL_ORDERS ) {
      cancelClass='is-active'
    }
    activeRef.current.className = activeClass
    completeRef.current.className = completeClass
    cancelRef.current.className = cancelClass
  }, [filter])

  return (
    <div className="tabs is-centered">
      <ul>
        <li ref={activeRef}>
          <button
            className="button-base"
            onClick={() => filterDispatch({type: 'FILTER_ACTIVE'})}
          >
            Active
          </button>
        </li>

        <li ref={completeRef}>
          <button
            className="button-base"
            onClick={() => filterDispatch({type: 'FILTER_COMPLETE'})}
          >
            Complete
          </button>
        </li>
        <li ref={cancelRef}>
          <button
            className={'button-base'}
            onClick={() => filterDispatch({type: 'FILTER_CANCEL'})}
          >
            Cancel
          </button>
        </li>
      </ul>
    </div>
  )
}

export default NavBar

ফিল্টারকন্টেক্সট.জেএস

export const ACTIVE_ORDERS = [
  "pending",
  "assigned",
  "pickup",
  "warning",
  "arrived",
]
export const COMPLETE_ORDERS = ["complete"]
export const CANCEL_ORDERS = ["cancel"]

const FilterStateContext = createContext()
const FilterDispatchContext = createContext()

export const FilterProvider = ({ children }) => {
  const [state, dispatch] = useReducer(FilterReducer, { filter: ACTIVE_ORDERS })
  return (
    <FilterStateContext.Provider value={state}>
      <FilterDispatchContext.Provider value={dispatch}>
        {children}
      </FilterDispatchContext.Provider>
    </FilterStateContext.Provider>
  )
}
export const useStateFilter = () => {
  const context = useContext(FilterStateContext)
  if (context === undefined) {
    throw new Error("place useStateMap within FilterProvider")
  }
  return context
}
export const useDispatchFilter = () => {
  const context = useContext(FilterDispatchContext)
  if (context === undefined) {
    throw new Error("place useDispatchMap within FilterProvider")
  }
  return context
}


export const FilterReducer = (state, action) => {
  switch (action.type) {
    case "FILTER_ACTIVE":
      return {
        ...state,
        filter: ACTIVE_ORDERS,
      }
    case "FILTER_COMPLETE":
      return {
        ...state,
        filter: COMPLETE_ORDERS,
      }
    case "FILTER_CANCEL":
      return {
        ...state,
        filter: CANCEL_ORDERS,
      }
  }
  return state
}

দ্রুত কাজ করে এবং রিডেক্সকে প্রতিস্থাপন করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.