प्रतिक्रिया में तत्व दिखाना या छिपाना


532

मैं पहली बार React.js के साथ खिलवाड़ कर रहा हूं और क्लिक इवेंट के माध्यम से किसी पृष्ठ पर कुछ दिखाने या छिपाने का कोई तरीका नहीं खोज सकता। मैं किसी अन्य लाइब्रेरी को पेज पर लोड नहीं कर रहा हूं, इसलिए मैं रिएक्ट लाइब्रेरी का उपयोग करके कुछ देशी तरीके ढूंढ रहा हूं। अभी तक मेरे पास इतना ही है। क्लिक इवेंट की आग लगने पर मैं परिणाम div दिखाना चाहूंगा।

var Search= React.createClass({
    handleClick: function (event) {
        console.log(this.prop);
    },
    render: function () {
        return (
            <div className="date-range">
                <input type="submit" value="Search" onClick={this.handleClick} />
            </div>
        );
    }
});

var Results = React.createClass({
    render: function () {
        return (
            <div id="results" className="search-results">
                Some Results
            </div>
        );
    }
});

React.renderComponent(<Search /> , document.body);

11
स्वीकृत टिप्पणी उपन्यास तकनीक का उपयोग करती है जो कि मूल स्तर पर मौजूदा तकनीक दोनों अन्य भाषाओं और पुस्तकालयों के साथ और अधिक आसानी से, तेज, और बेशर्मी से कर सकती है। मानक सीएसएस के साथ इसे संभालना लगभग निश्चित रूप से बेहतर जवाब है।
जॉन ह्युगलैंड

13
@ जॉनहॉगलैंड, रिएक्ट फ्रेमवर्क का उपयोग करते समय सबसे अच्छा जवाब स्वीकृत उत्तर है, सभी रिएक्ट शैली जा रहा है, जिसमें सफाई कार्य हैं जो कुछ मामलों में आपको करना चाहिए। यह सिर्फ अंधेरे में घटकों को छिपाने के लिए अच्छा अभ्यास नहीं है। यदि आप सामान मिलाते हैं तो आप बेहतर सभी देशी जा रहे हैं जो हमेशा किसी भी चीज़ की तुलना में तेज़ होता है।
क्लाउडी होजाडा

4
नहीं, यह वास्तव में नहीं है। CSS को रीइंस्टॉल करने के लिए प्रतिक्रिया का उपयोग करना एक बुरा विचार है।
जॉन ह्युगलैंड

8
इसके अलावा, आपको लगता है कि मैंने जो कहा था, उस बिंदु को पूरी तरह से याद किया है, जो कि सीएसएस का उपयोग करने के लिए तत्व को छिपाने और दिखाने के लिए किया गया था, बजाय प्रतिक्रिया का उपयोग करने के लिए इसे शारीरिक रूप से हटाने के लिए। आप तत्व को आसानी से छिपाने और दिखाने के लिए CSS का उपयोग करने के लिए React का उपयोग कर सकते हैं: <div style = {{display: this.props.example}} />।
जॉन ह्युगलैंड

5
@ कलौड़ीहोज्डा वाले घटक अंधेरे में छिपे हुए हैं वास्तव में कुछ मामलों में बहुत अच्छा अभ्यास है, मैं उत्तरदायी नेविगेशन के बारे में सोच रहा हूं, जहां आपको HTML में रहने के लिए लिंक की आवश्यकता होती है, भले ही वे सीएसएस के साथ छिपे हों
Toni Leigh

जवाबों:


543

रिएक्ट सर्का 2020

में onClickकॉलबैक, कॉल राज्य हुक के राज्य अद्यतन करने के लिए सेटर समारोह और फिर से प्रस्तुत करना:

const Search = () => {
  const [showResults, setShowResults] = React.useState(false)
  const onClick = () => setShowResults(true)
  return (
    <div>
      <input type="submit" value="Search" onClick={onClick} />
      { showResults ? <Results /> : null }
    </div>
  )
}

const Results = () => (
  <div id="results" className="search-results">
    Some Results
  </div>
)

ReactDOM.render(<Search />, document.querySelector("#container"))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.13.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.13.1/umd/react-dom.production.min.js"></script>

<div id="container">
  <!-- This element's contents will be replaced with your component. -->
</div>

JSFiddle

रिएक्ट सर्का 2014

कुंजी का उपयोग कर क्लिक हैंडलर में घटक की स्थिति को अपडेट करना है setState। जब राज्य परिवर्तन लागू होते हैं, तो renderविधि नए राज्य के साथ फिर से कॉल की जाती है:

var Search = React.createClass({
    getInitialState: function() {
        return { showResults: false };
    },
    onClick: function() {
        this.setState({ showResults: true });
    },
    render: function() {
        return (
            <div>
                <input type="submit" value="Search" onClick={this.onClick} />
                { this.state.showResults ? <Results /> : null }
            </div>
        );
    }
});

var Results = React.createClass({
    render: function() {
        return (
            <div id="results" className="search-results">
                Some Results
            </div>
        );
    }
});

ReactDOM.render( <Search /> , document.getElementById('container'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.6.2/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/15.6.2/react-dom.min.js"></script>

<div id="container">
  <!-- This element's contents will be replaced with your component. -->
</div>

JSFiddle


3
हाँ, राज्य बनाम सहारा के बारे में अच्छी बात है। इस व्हाट्सएप को करने का एक बेहतर तरीका यहां के ट्यूटोरियल की तरह है, जहां सर्च बार और रिजल्ट टेबल सर्च के अंदर रिजल्ट डालने के बजाय भाई-बहन हैं: facebook.github.io/react/docs/thinking-in-react.html
डगलस

53
जैसा कि अन्य उत्तर में कहा गया है, सम्मिलन / विलोपन साधारण वर्ग के मास्किंग की तुलना में बहुत धीमा है।
जॉन ह्युगलैंड

4
मुझे लगता है कि जॉन्स टिप्पणियों की समीक्षा की आवश्यकता है। मैं इच्छित उत्तर के साथ गया था और वह साफ-सुथरा था। हालाँकि मैं प्रारंभिक अवस्थाओं को निर्धारित करने में असमर्थ था और कुछ भी असम्बद्ध घटक पर उपयोगी नहीं था। मैं चीजों को छिपाने के लिए सीएसएस का उपयोग कर रहा हूं। असम्बद्ध घटकों पर श्रोता चुपचाप असफल हो जायेंगे, इससे मुझे आज बड़ी हानि हुई है।
उतरा

क्या इसका मतलब है कि प्रतिक्रिया तब घटक को फिर से प्रस्तुत करेगी जब शैली बदल जाएगी (दिखाने / छिपाने के लिए निर्धारित है)!?
एलेक्स

@ डगलस जब तक मैं इसे याद नहीं करता, इस तरह से मूल वापस टॉगल करने की अनुमति नहीं देता है। मुझे लगता है कि ओपी यह नहीं चाहता होगा, लेकिन मैं इसे कैसे शामिल कर सकता हूं?
कृमि

221
<style type="text/css">
    .hidden { display:none; }
</style>
render: function() {
    return (
      <div className={this.props.shouldHide ? 'hidden' : ''}>
        This will be hidden if you set <tt>props.shouldHide</tt> 
        to something truthy.
      </div>
    );
}

// or in more modern JS and stateless react
const Example = props => <div className={props.shouldHide}/>Hello</div>

12
डगलस के उत्तर के रूप में सशर्त रूप से वापसी करना बेहतर है। यह प्रतिक्रिया को DOM से पूरी तरह हटाने की अनुमति देता है। आपके मामले में div और इसकी सामग्री अभी भी DOM में नहीं दिख रही है। इसका प्रदर्शन निहितार्थ हो सकता है।
अपराह्न

125
प्रदर्शन तत्व जोड़ने और हटाने के लिए बहुत खराब हैं क्योंकि वे इसे छिपाने और दिखाने के लिए हैं। मुझे उनके दृष्टिकोण और मेरे बीच अंतर के बारे में पता है, और मुझे विश्वास है कि आपके पास यह बिल्कुल गलत है। कृपया "प्रदर्शन निहितार्थ" को परिभाषित करने के लिए समय निकालें और फिर इसे मापें।
जॉन हागलैंड

6
"Reflows को जोड़ने / हटाने के साथ गारंटी दी जाती है" - बिल्कुल तैनात तत्वों के साथ नहीं, जो कि कैसे प्रसिद्ध अपने अविश्वसनीय प्रदर्शन को प्राप्त करता है। लेकिन आप मीट्रिक पर एक वैध बिंदु बनाते हैं।
दोपहर

9
इसके लायक क्या है, इसका उल्लेख यहां दिए गए डॉक्यूमेंट्स में किया गया है: facebook.github.io/react/docs/…
ब्रैड पार्क

85
तो मैं सिर्फ 161 काफी बड़े डोम नोड्स के साथ एक छिपे हुए वर्ग की स्थापना बनाम रिटर्निंग नल का परीक्षण किया। नोड को हटाने की तुलना में एक वर्ग का उपयोग करना काफी तेज है।
जोनाथन रोनी

120

यहाँ टेनेरी ऑपरेटर के लिए एक वैकल्पिक वाक्यविन्यास है:

{ this.state.showMyComponent ? <MyComponent /> : null }

के बराबर है:

{ this.state.showMyComponent && <MyComponent /> }

झुक क्यों?


इसके साथ ही वैकल्पिक वाक्यविन्यास display: 'none';

<MyComponent style={this.state.showMyComponent ? {} : { display: 'none' }} />

हालाँकि, यदि आप अधिक उपयोग करते हैं display: 'none', तो यह DOM प्रदूषण की ओर ले जाता है और अंततः आपके आवेदन को धीमा कर देता है।


चेतावनी! केवल बूल मानों के लिए 'डबल एम्परसेंड (&&)' दृष्टिकोण का उपयोग करें। {This.state.myComponents.length && <MyComponent />} 0 प्रस्तुत करना होगा, अगर myComponents खाली सरणी (उदाहरण के लिए)
मेगा Proger

57

यहाँ मेरा दृष्टिकोण है।

import React, { useState } from 'react';

function ToggleBox({ title, children }) {
  const [isOpened, setIsOpened] = useState(false);

  function toggle() {
    setIsOpened(wasOpened => !wasOpened);
  }

  return (
    <div className="box">
      <div className="boxTitle" onClick={toggle}>
        {title}
      </div>
      {isOpened && (
        <div className="boxContent">
          {children}
        </div>
      )}
    </div>
  );
}

उपरोक्त कोड में, इसे प्राप्त करने के लिए, मैं कोड का उपयोग कर रहा हूं:

{opened && <SomeElement />}

यह SomeElementकेवल तभी प्रस्तुत होगा जब openedसत्य हो। यह इस बात के कारण काम करता है कि कैसे जावास्क्रिप्ट तार्किक स्थितियों को हल करता है:

true && true && 2; // will output 2
true && false && 2; // will output false
true && 'some string'; // will output 'some string'
opened && <SomeElement />; // will output SomeElement if `opened` is true, will output false otherwise (and false will be ignored by react during rendering)
// be careful with 'falsy' values eg
const someValue = 0;
someValue && <SomeElement /> // will output 0, which will be rednered by react
// it'll be better to:
!!someValue && <SomeElement /> // will render nothing as we cast the value to boolean

सीएसएस 'प्रदर्शन: कोई नहीं' के बजाय इस दृष्टिकोण का उपयोग करने के कारण;

  • हालांकि CSS के साथ एक तत्व को छिपाने के लिए यह 'सस्ता' हो सकता है - इस तरह के मामले में 'छिपा' तत्व अभी भी प्रतिक्रिया दुनिया में 'जीवित' है (जो इसे वास्तव में अधिक महंगा बना सकता है)
    • इसका मतलब यह है कि अगर मूल तत्व का प्रॉप (उदाहरण के लिए)। <TabView> ) के बदल जाएगी - भले ही आप केवल एक टैब देखें, सभी 5 टैब फिर से प्रदान किए जाएंगे
    • छिपे हुए तत्व में अभी भी कुछ जीवनचक्र विधियाँ चल सकती हैं - जैसे। यह हर अपडेट के बाद भी सर्वर से कुछ डेटा प्राप्त कर सकता है यहां तक ​​कि यह दिखाई नहीं देता है
    • यदि यह गलत डेटा प्राप्त करेगा तो छिपा हुआ तत्व ऐप को क्रैश कर सकता है। यह तब हो सकता है जब आप राज्य को अपडेट करते समय अदृश्य नोड्स के बारे में भूल सकते हैं
    • जब तत्व दिखाई दे रहा है तो आप गलती से गलत 'डिस्प्ले' स्टाइल सेट कर सकते हैं - उदा। कुछ div डिफ़ॉल्ट रूप से 'डिस्प्ले: फ्लेक्स' है, लेकिन आप गलती से 'डिस्प्ले: ब्लॉक' सेट कर देंगेdisplay: invisible ? 'block' : 'none' जिसके लेआउट को तोड़ सकते हैं
    • उपयोग someBoolean && <SomeNode />करना बहुत सरल है और इसके बारे में तर्क करना आसान है, खासकर यदि आपका तर्क कुछ प्रदर्शित करने से संबंधित है या जटिल नहीं है
    • कई मामलों में, जब आप पुन: प्रकट होते हैं, तो आप तत्व स्थिति को 'रीसेट' करना चाहते हैं। जैसे। आपके पास एक स्लाइडर हो सकता है जिसे आप हर बार दिखाए जाने वाले प्रारंभिक स्थान पर सेट करना चाहते हैं। (यदि यह वांछित व्यवहार है कि पिछली तत्व स्थिति को बनाए रखें, भले ही वह छिपा हो, जो IMO दुर्लभ है - मैं वास्तव में CSS का उपयोग करने पर विचार करूंगा यदि इस राज्य को अलग तरीके से याद रखना जटिल होगा)

2
यह एक बेहतरीन उदाहरण है! एक छोटी सी बात, बॉक्स-कॉन्टेंट होना चाहिए क्लासनेम = "बॉक्स-कॉन्टेंट"
भेट्ज़ी

5
वहाँ एक बग यहीं है: this.setState({isOpened: !isOpened});। जब आप राज्य को संशोधित करते हैं, तो स्वयं राज्य पर निर्भर न रहें। यहाँ एक अच्छा उदाहरण है: reactjs.org/docs/… तो यह होना चाहिए this.setState( s => ({isOpened: !s.isOpened}) ):। सेटस्टैट के अंदर तीर फंक्शन पर ध्यान दें।
arcol

क्या आपके पास कोई स्रोत / बेंचमार्क / उदाहरण है जो यह पुष्टि करता है कि "यदि आप प्रदर्शन सेट करते हैं: कोई भी - तत्व अभी भी प्रतिक्रिया द्वारा प्रस्तुत नहीं किया गया है और DOM में जोड़ा गया है - जो प्रदर्शन पर बुरा प्रभाव डाल सकता है।" ?
नीया

@neiya मैं नहीं। सीएसएस छोटे तत्वों के साथ अधिक प्रदर्शन कर सकता है, लेकिन अक्सर आप सामग्री के वैकल्पिक रूप से बड़े हिस्सों को प्रस्तुत करना चाहते हैं। टैब। इसके अलावा, जबकि कुछ तत्व CSS के साथ छिपा हुआ है - यह अभी भी प्रतिक्रिया दुनिया में जीवित है। इसका मतलब है कि यह अपडेट हो सकता है कि यह राज्य है, कुछ डेटा आदि प्राप्त करें जो महंगा हो सकता है और अप्रत्याशित व्यवहार हो सकता है। और यह IMO वास्तव में लागू करने के लिए बहुत सरल है।
6


11

मैंने एक छोटा घटक बनाया है जो आपके लिए इसे संभालता है: प्रतिक्रिया-टॉगल-प्रदर्शन

यह या के display: none !importantआधार पर शैली विशेषता सेट करता हैhideshow प्रॉप्स के ।

उदाहरण उपयोग:

var ToggleDisplay = require('react-toggle-display');

var Search = React.createClass({
    getInitialState: function() {
        return { showResults: false };
    },
    onClick: function() {
        this.setState({ showResults: true });
    },
    render: function() {
        return (
            <div>
                <input type="submit" value="Search" onClick={this.onClick} />
                <ToggleDisplay show={this.state.showResults}>
                    <Results />
                </ToggleDisplay>
            </div>
        );
    }
});

var Results = React.createClass({
    render: function() {
        return (
            <div id="results" className="search-results">
                Some Results
            </div>
        );
    }
});

React.renderComponent(<Search />, document.body);

10

कई शानदार जवाब पहले से ही हैं, लेकिन मुझे नहीं लगता कि उन्हें बहुत अच्छी तरह से समझाया गया है और दिए गए कई तरीकों में कुछ गोचर्स शामिल हैं जो शायद यात्रा कर सकते हैं। तो मैं ऐसा करने के लिए तीन मुख्य तरीकों (प्लस एक-विषय-विकल्प) पर जा रहा हूं और पेशेवरों और विपक्षों को समझाऊंगा। मैं ज्यादातर यह लिख रहा हूं क्योंकि विकल्प 1 की बहुत सिफारिश की गई थी और अगर सही तरीके से उपयोग नहीं किया गया तो उस विकल्प के साथ बहुत सारे संभावित मुद्दे हैं।

विकल्प 1: माता-पिता में सशर्त प्रतिपादन।

मुझे यह तरीका पसंद नहीं है जब तक कि आप केवल एक बार घटक को रेंडर करने के लिए नहीं जा रहे हैं और इसे वहां छोड़ दें। मुद्दा यह है कि यह दृश्यता को टॉगल करने के लिए हर बार खरोंच से घटक बनाने के लिए प्रतिक्रिया देगा। यहाँ उदाहरण है। LogoutButton या LoginButton को मूल रूप से LoginControl में दिया जा रहा है। यदि आप इसे चलाते हैं, तो आप देखेंगे कि निर्माणकर्ता को प्रत्येक बटन क्लिक पर बुलाया जा रहा है। https://codepen.io/Kelnor/pen/LzPdpN?editors=1111

class LoginControl extends React.Component {
  constructor(props) {
    super(props);
    this.handleLoginClick = this.handleLoginClick.bind(this);
    this.handleLogoutClick = this.handleLogoutClick.bind(this);
    this.state = {isLoggedIn: false};
  }

  handleLoginClick() {
    this.setState({isLoggedIn: true});
  }

  handleLogoutClick() {
    this.setState({isLoggedIn: false});
  }

  render() {
    const isLoggedIn = this.state.isLoggedIn;

    let button = null;
    if (isLoggedIn) {
      button = <LogoutButton onClick={this.handleLogoutClick} />;
    } else {
      button = <LoginButton onClick={this.handleLoginClick} />;
    }

    return (
      <div>
        <Greeting isLoggedIn={isLoggedIn} />
        {button}
      </div>
    );
  }
}

class LogoutButton extends React.Component{
  constructor(props, context){
    super(props, context)
    console.log('created logout button');
  }
  render(){
    return (
      <button onClick={this.props.onClick}>
        Logout
      </button>
    );
  }
}

class LoginButton extends React.Component{
  constructor(props, context){
    super(props, context)
    console.log('created login button');
  }
  render(){
    return (
      <button onClick={this.props.onClick}>
        Login
      </button>
    );
  }
}

function UserGreeting(props) {
  return <h1>Welcome back!</h1>;
}

function GuestGreeting(props) {
  return <h1>Please sign up.</h1>;
}

function Greeting(props) {
  const isLoggedIn = props.isLoggedIn;
  if (isLoggedIn) {
    return <UserGreeting />;
  }
  return <GuestGreeting />;
}

ReactDOM.render(
  <LoginControl />,
  document.getElementById('root')
);

अब स्क्रैच से घटक बनाने में रिएक्ट बहुत तेज है। हालांकि, इसे बनाते समय अभी भी अपने कोड को कॉल करना होगा। इसलिए यदि आपका कंस्ट्रक्टर, कंपोनेंटडिमाउंट, रेंडर, आदि कोड महंगा है, तो यह कंपोनेंट दिखाते हुए काफी धीमा हो जाएगा। इसका मतलब यह भी है कि आप इसका उपयोग राज्य के उन घटकों के साथ नहीं कर सकते हैं जहाँ आप चाहते हैं कि जब छिपाया जाए (और प्रदर्शित होने पर राज्य को संरक्षित किया जाए) तो इसका एक फायदा यह है कि छिपे हुए घटक को तब तक नहीं बनाया जाता है जब तक वह चयनित न हो जाए। इसलिए छिपे हुए घटक आपके प्रारंभिक पृष्ठ लोड में देरी नहीं करेंगे। ऐसे मामले भी हो सकते हैं जब आप टॉगल करने के लिए रीसेट करने के लिए एक स्टेटफ़ुल घटक चाहते हैं। किस मामले में यह आपका सबसे अच्छा विकल्प है।

विकल्प 2: बच्चे में सशर्त प्रतिपादन

यह दोनों घटकों को एक बार बनाता है। फिर शॉर्ट सर्किट बाकी रेंडर कोड को छोड़ देता है यदि घटक छिपा हुआ है। आप दृश्यमान प्रोप का उपयोग करके अन्य तरीकों से शॉर्ट सर्किट अन्य लॉजिक भी कर सकते हैं। कोडन पेज में कंसोल.लॉग पर ध्यान दें। https://codepen.io/Kelnor/pen/YrKaWZ?editors=0011

class LoginControl extends React.Component {
  constructor(props) {
    super(props);
    this.handleLoginClick = this.handleLoginClick.bind(this);
    this.handleLogoutClick = this.handleLogoutClick.bind(this);
    this.state = {isLoggedIn: false};
  }

  handleLoginClick() {
    this.setState({isLoggedIn: true});
  }

  handleLogoutClick() {
    this.setState({isLoggedIn: false});
  }

  render() {
    const isLoggedIn = this.state.isLoggedIn;
    return (
      <div>
        <Greeting isLoggedIn={isLoggedIn} />
        <LoginButton isLoggedIn={isLoggedIn} onClick={this.handleLoginClick}/>
        <LogoutButton isLoggedIn={isLoggedIn} onClick={this.handleLogoutClick}/>
      </div>
    );
  }
}

class LogoutButton extends React.Component{
  constructor(props, context){
    super(props, context)
    console.log('created logout button');
  }
  render(){
    if(!this.props.isLoggedIn){
      return null;
    }
    return (
      <button onClick={this.props.onClick}>
        Logout
      </button>
    );
  }
}

class LoginButton extends React.Component{
  constructor(props, context){
    super(props, context)
    console.log('created login button');
  }
  render(){
    if(this.props.isLoggedIn){
      return null;
    }
    return (
      <button onClick={this.props.onClick}>
        Login
      </button>
    );
  }
}

function UserGreeting(props) {
  return <h1>Welcome back!</h1>;
}

function GuestGreeting(props) {
  return <h1>Please sign up.</h1>;
}

function Greeting(props) {
  const isLoggedIn = props.isLoggedIn;
  if (isLoggedIn) {
    return <UserGreeting />;
  }
  return <GuestGreeting />;
}

ReactDOM.render(
  <LoginControl />,
  document.getElementById('root')
);

अब, यदि प्रारंभिक तर्क जल्दी है और बच्चे स्टेटलेस हैं, तो आपको प्रदर्शन या कार्यक्षमता में अंतर नहीं दिखेगा। हालाँकि, क्यों रिएक्ट एक ब्रांड नए घटक हर तरह से टॉगल बनाने के लिए? यदि आरंभीकरण महंगा है, तो विकल्प 1 हर बार जब आप एक घटक को चालू करते हैं, जो स्विच करते समय पृष्ठ को धीमा कर देगा। विकल्प 2 घटक के सभी प्रकार के प्रथम पृष्ठ लोड पर चलेंगे। उस पहले लोड को धीमा करना। फिर से ध्यान देना चाहिए। यदि आप किसी शर्त के आधार पर घटक को केवल एक बार दिखा रहे हैं और इसे टॉगल नहीं कर रहे हैं, या आप चाहते हैं कि यह टॉगल करने के बाद रीसेट हो जाए, तो विकल्प 1 ठीक है और शायद सबसे अच्छा विकल्प है।

यदि धीमा पृष्ठ लोड एक समस्या है, हालांकि, इसका मतलब है कि आपको जीवन चक्र विधि में महंगा कोड मिला है और यह आमतौर पर एक अच्छा विचार नहीं है। आप जीवन चक्र के तरीकों में से महंगे कोड को हटाकर धीमा पेज लोड को हल कर सकते हैं और शायद करना चाहिए। इसे एक ऐसे Async फ़ंक्शन में ले जाएँ, जो ComponentDidMount द्वारा किक किया गया है और कॉलबैक ने इसे स्टेटस्टेट में setState () के साथ रखा है। यदि राज्य चर शून्य है और घटक दिखाई देता है, तो रेंडर फ़ंक्शन को एक प्लेसहोल्डर लौटाएं। अन्यथा डेटा रेंडर करें। इस तरह पेज जल्दी लोड होगा और टैब को लोड करते ही पॉप्युलेट करेगा। आप तर्क को माता-पिता में भी स्थानांतरित कर सकते हैं और परिणाम को बच्चों को सहारा के रूप में धकेल सकते हैं। इस तरह आप प्राथमिकता दे सकते हैं कि कौन सा टैब पहले लोड हो जाए। या परिणामों को कैश करें और केवल एक घटक दिखाए जाने पर तर्क को चलाएं।

विकल्प 3: कक्षा छिपाना

कक्षा छिपाना शायद लागू करना सबसे आसान है। जैसा कि आपने उल्लेख किया है कि आप केवल प्रदर्शन के साथ एक सीएसएस वर्ग बनाते हैं: कोई नहीं और प्रोप के आधार पर कक्षा असाइन करें। नकारात्मक पक्ष हर छिपे हुए घटक का पूरा कोड है और सभी छिपे हुए घटक DOM से जुड़े होते हैं। (विकल्प 1 छिपे हुए घटकों को बिल्कुल भी नहीं बनाता है। और विकल्प 2 शॉर्ट सर्किट अनावश्यक कोड है जब घटक छिपा होता है और DOM के घटक को पूरी तरह से हटा देता है।) ऐसा प्रतीत होता है कि यह टिप्पणीकारों द्वारा किए गए कुछ परीक्षणों के अनुसार दृश्यता को बढ़ाता है। अन्य उत्तर लेकिन मैं उस पर बात नहीं कर सकता।

विकल्प 4: एक घटक लेकिन प्रॉप्स बदलें। या शायद कोई घटक नहीं है और HTML को कैश करें।

यह हर एप्लिकेशन के लिए काम नहीं करेगा और यह विषय से बाहर है क्योंकि यह घटकों को छिपाने के बारे में नहीं है, लेकिन यह छिपाने के लिए कुछ उपयोग मामलों के लिए एक बेहतर समाधान हो सकता है। मान लीजिए कि आपके पास टैब हैं। हो सकता है कि एक रिएक्ट कंपोनेंट लिखना संभव हो और टैब में जो प्रदर्शित हो उसे बदलने के लिए प्रॉप्स का इस्तेमाल करें। आप जेएसएक्स को स्टेट वेरिएबल्स में भी सेव कर सकते हैं और यह तय करने के लिए एक प्रोप का इस्तेमाल कर सकते हैं कि जेएसएक्स रेंडर फंक्शन में कैसे लौटेगा। यदि JSX को जेनरेट करना है तो इसे करें और इसे पैरेंट में कैश करें और सही को प्रॉप के रूप में भेजें। या बच्चे में उत्पन्न करते हैं और इसे बच्चे की स्थिति में कैश करते हैं और सक्रिय एक का चयन करने के लिए प्रॉप्स का उपयोग करते हैं।


9

वर्चुअल DOM का उपयोग करने का यह एक अच्छा तरीका है :

class Toggle extends React.Component {
  state = {
    show: true,
  }

  toggle = () => this.setState((currentState) => ({show: !currentState.show}));

  render() {
    return (
      <div>
        <button onClick={this.toggle}>
          toggle: {this.state.show ? 'show' : 'hide'}
        </button>    
        {this.state.show && <div>Hi there</div>}
      </div>
     );
  }
}

यहाँ उदाहरण है

रिएक्ट हुक का उपयोग करना:

const Toggle = () => {
  const [show, toggleShow] = React.useState(true);

  return (
    <div>
      <button
        onClick={() => toggleShow(!show)}
      >
        toggle: {show ? 'show' : 'hide'}
      </button>    
      {show && <div>Hi there</div>}
    </div>
  )
}

यहाँ उदाहरण है


मुझे यह दुबला जवाब पसंद है। अफ़सोस की बात है कि बेला नहीं चलेगा।
जुआन लानुस

जैसा कि पहले उत्तर में बताया गया है, आपको राज्य पर निर्भर नहींthis.setState() होना चाहिए ।
डैन डसेलस्कु

8

आप राज्य में एक बूलियन मान सेट करते हैं (जैसे 'शो)', और फिर करें:

var style = {};
if (!this.state.show) {
  style.display = 'none'
}

return <div style={style}>...</div>

मैंने यह कोशिश की, लेकिन क्लिक इवेंट ने सीएसएस को ब्लॉक प्रदर्शित करने के लिए स्विच नहीं किया। मैं इसे पूरा करने के लिए बिल्कुल खो गया हूं। कोई अतिरिक्त सुझाव?
user1725382

1
इसमें शैली नियम तालिका में सक्रिय परिवर्तन करना शामिल है। एक एकल मौजूदा नियम रखना बहुत बेहतर है जिसे आप चालू और बंद कर सकते हैं, जो डोम नोड के गतिशील गुणों का हिस्सा नहीं है।
जॉन ह्युगलैंड

1
यह वास्तव में कोई फर्क नहीं पड़ता कि आप यहाँ एक वर्ग या शैली का उपयोग करते हैं ... आप इस बारे में बहुत काम कर रहे हैं।
ब्रिगैंड

2
परिमाण के एक जोड़े के आदेश से एक वर्ग का उपयोग तेजी से होता है। यह जानना अच्छा है।
जेसन राइस

1
बस के साथ सशर्त वर्ग के नाम का उपयोग कर सकते हैं: github.com/JedWatson/classnames
बैकडेस्क

7

सर्वश्रेष्ठ अभ्यास प्रलेखन के अनुसार नीचे है:

{this.state.showFooter && <Footer />}

तत्व को तभी प्रस्तुत करें जब राज्य मान्य हो।


यह उत्तर एक साल पहले ही दिया गया था, इसलिए इसे अभी हटाना ठीक है।
डैन डेस्केल्सस्कु

5
class Toggle extends React.Component {
  state = {
    show: true,
  }

  render() {
    const {show} = this.state;
    return (
      <div>
        <button onClick={()=> this.setState({show: !show })}>
          toggle: {show ? 'show' : 'hide'}
        </button>    
        {show && <div>Hi there</div>}
      </div>
     );
  }
}

4
   class FormPage extends React.Component{
      constructor(props){
           super(props);
           this.state = {
             hidediv: false
           }
      }

     handleClick = (){
       this.setState({
          hidediv: true
        });
      }

      render(){
        return(
        <div>
          <div className="date-range" hidden = {this.state.hidediv}>
               <input type="submit" value="Search" onClick={this.handleClick} />
          </div>
          <div id="results" className="search-results" hidden = {!this.state.hidediv}>
                        Some Results
           </div>
        </div>
        );
      }
  }

4

मैं रिएक्ट टीम के इस कथन से शुरू करता हूं:

प्रतिक्रिया में, आप अलग-अलग घटक बना सकते हैं जो आपके लिए आवश्यक व्यवहार को संक्षिप्त करते हैं। फिर, आप अपने आवेदन की स्थिति के आधार पर उनमें से कुछ को ही प्रस्तुत कर सकते हैं।

रिएक्ट में कंडिशनल रेंडरिंग उसी तरह काम करती है जैसे जावास्क्रिप्ट में काम करती है। यदि वर्तमान स्थिति का प्रतिनिधित्व करने वाले तत्व बनाने के लिए या सशर्त ऑपरेटर जैसे जावास्क्रिप्ट ऑपरेटरों का उपयोग करें, और उन्हें मिलान करने के लिए UI को प्रतिक्रिया दें।

आपको मूल रूप से घटक को दिखाना होगा जब बटन पर क्लिक किया जाता है, तो आप इसे दो तरीके से कर सकते हैं, शुद्ध प्रतिक्रिया का उपयोग कर या CSS का उपयोग करके, शुद्ध प्रतिक्रिया तरीका का उपयोग करके, आप अपने मामले में नीचे दिए गए कोड जैसा कुछ कर सकते हैं, इसलिए पहले रन में, परिणाम के रूप में नहीं दिखा रहा hideResultsहै true, लेकिन बटन पर क्लिक करके, राज्य बदलने वाला hideResultsहै falseऔर इस घटक को नए मूल्य की शर्तों के साथ फिर से प्रदान किया जाता है, यह रिएक्ट में घटक दृश्य को बदलने का बहुत सामान्य उपयोग है ...

var Search = React.createClass({
  getInitialState: function() {
    return { hideResults: true };
  },

  handleClick: function() {
    this.setState({ hideResults: false });
  },

  render: function() {
    return (
      <div>
        <input type="submit" value="Search" onClick={this.handleClick} />
        { !this.state.hideResults && <Results /> }
      </div> );
  }

});

var Results = React.createClass({
  render: function() {
    return (
    <div id="results" className="search-results">
      Some Results
    </div>);
   }
});

ReactDOM.render(<Search />, document.body);

यदि आप प्रतिक्रिया में सशर्त प्रतिपादन में आगे का अध्ययन करना चाहते हैं, तो यहां एक नज़र डालें ।


1
यह सबसे सुंदर तरीका होना चाहिए!
पांचवीं

4

रिएक्ट हुक के साथ सरल छिपाने / दिखाने का उदाहरण:

const Example = () => {

  const [show, setShow] = useState(false);

  return (
    <div>
      <p>Show state: {show}</p>
      {show ? (
        <p>You can see me!</p>
      ) : null}
      <button onClick={() => setShow(!show)}>
    </div>
  );

};

export default Example;

2
यह सिर्फ {शो के लिए सरल हो सकता है? 1: 2}
पिओत्र

3

यदि आप यह देखना चाहते हैं कि घटक का प्रदर्शन कैसे देखें तो इस फिडेल को चेकआउट करें।

http://jsfiddle.net/mnoster/kb3gN/16387/

var Search = React.createClass({
    getInitialState: function() {
        return { 
            shouldHide:false
        };
    },
    onClick: function() {
        console.log("onclick");
        if(!this.state.shouldHide){
            this.setState({
                shouldHide: true 
            })
        }else{
                    this.setState({
                shouldHide: false 
            })
        }
    },
render: function() {
    return (
      <div>
        <button onClick={this.onClick}>click me</button>
        <p className={this.state.shouldHide ? 'hidden' : ''} >yoyoyoyoyo</p>
      </div>
    );
}
});

ReactDOM.render( <Search /> , document.getElementById('container'));

3

हुक का उपयोग करके रिएक्ट में तत्वों को दिखाने / छिपाने की एक सरल विधि

const [showText, setShowText] = useState(false);

अब, हमारे रेंडर मेथड में कुछ तर्क जोड़ते हैं:

{showText && <div>This text will show!</div>}

तथा

onClick={() => setShowText(!showText)}

बहुत बढ़िया।


2

कुछ मामलों में उच्चतर आदेश घटक उपयोगी हो सकता है:

उच्च क्रम घटक बनाएँ:

export var HidableComponent = (ComposedComponent) => class extends React.Component {
    render() {
        if ((this.props.shouldHide!=null && this.props.shouldHide()) || this.props.hidden)
            return null;
        return <ComposedComponent {...this.props}  />;
    }
};

अपने खुद के घटक बढ़ाएँ:

export const MyComp= HidableComponent(MyCompBasic);

तो आप इसे इस तरह से उपयोग कर सकते हैं:

<MyComp hidden={true} ... />
<MyComp shouldHide={this.props.useSomeFunctionHere} ... />

यह थोड़ा बॉयलरप्लेट को कम करता है और नामकरण सम्मेलनों से चिपके रहने को लागू करता है, हालांकि कृपया इस बात से अवगत रहें कि MyComp अभी भी त्वरित होगा - पहले छोड़ने का तरीका पहले उल्लेख किया गया था:

{ !hidden && <MyComp ... /> }


1

आरसी-अगर-और मॉड्यूल का उपयोग करें

npm install --save rc-if-else
import React from 'react';
import { If } from 'rc-if-else';

class App extends React.Component {
    render() {
        return (
            <If condition={this.props.showResult}>
                Some Results
            </If>
        );
    }
}

1

का प्रयोग करें रेफरी और सीएसएस हेरफेर

एक तरीका यह हो सकता है refकि ब्राउजर के एपीआई का उपयोग करके रीएक्ट का उपयोग करें और सीएसएस वर्ग में हेरफेर करें। इसका लाभ रिएक्ट में रेंडरिंग से बचने के लिए है यदि एकमात्र उद्देश्य एक बटन के क्लिक पर कुछ DOM तत्व को छिपाना / दिखाना है।

// Parent.jsx
import React, { Component } from 'react'

export default class Parent extends Component {
    constructor () {    
        this.childContainer = React.createRef()
    }

    toggleChild = () => {
        this.childContainer.current.classList.toggle('hidden')
    }

    render () {
        return (
            ...

            <button onClick={this.toggleChild}>Toggle Child</button>
            <div ref={this.childContainer}>
                <SomeChildComponent/>
            </div>

            ...
        );
    }
}


// styles.css
.hidden {
    display: none;
}

PS गलत होने पर मुझे सुधारें। :)


यहां कोडेंडबॉक्सबॉक्स बनाया गया है। उदाहरण के लिए, utgzx.csb.app , कोड codeandbox.io/embed/react-show-hide-with-css-utgzx
PatS

0

यदि आप बूटस्ट्रैप 4 का उपयोग करते हैं, तो आप उस तरह से तत्व छिपा सकते हैं

className={this.state.hideElement ? "invisible" : "visible"}

0

यह भी इस तरह से प्राप्त किया जा सकता है (बहुत आसान तरीका)

 class app extends Component {
   state = {
     show: false
   };
 toggle= () => {
   var res = this.state.show;
   this.setState({ show: !res });
 };
render() {
  return(
   <button onClick={ this.toggle }> Toggle </button>
  {
    this.state.show ? (<div> HELLO </div>) : null
  }
   );
     }

कृपया “पिछले राज्य के आधार पर राज्य” पर प्रतिक्रिया करने के बारे में कृपया “ Reajs.org.org/docs/react-component.html#setstate ” पर पढ़ें । इसके अलावा, अंत में इंडेंटेशन को ठीक करना अच्छा होगा।
डेन डैस्कलेस्कु

0

यह उदाहरण दिखाता है कि आप प्रत्येक 1sec के बाद स्विच करने वाले टॉगल का उपयोग करके घटकों के बीच कैसे स्विच कर सकते हैं

import React ,{Fragment,Component} from "react";
import ReactDOM from "react-dom";

import "./styles.css";

const Component1 = () =>(
  <div>
    <img 
src="https://i.pinimg.com/originals/58/df/1d/58df1d8bf372ade04781b8d4b2549ee6.jpg" />
   </div>
)

const Component2 = () => {
  return (
    <div>
       <img 
src="http://www.chinabuddhismencyclopedia.com/en/images/thumb/2/2e/12ccse.jpg/250px- 
12ccse.jpg" />
  </div>
   )

 }

 class App extends Component {
   constructor(props) {
     super(props);
    this.state = { 
      toggleFlag:false
     }
   }
   timer=()=> {
    this.setState({toggleFlag:!this.state.toggleFlag})
  }
  componentDidMount() {
    setInterval(this.timer, 1000);
   }
  render(){
     let { toggleFlag} = this.state
    return (
      <Fragment>
        {toggleFlag ? <Component1 /> : <Component2 />}
       </Fragment>
    )
  }
}


const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

अजीब छवि URL के साथ क्या है? आप placeimg.com
Dan Dascalescu

0

इस दुबले और छोटे वाक्यविन्यास का उपयोग करें:

{ this.state.show && <MyCustomComponent /> }

हो सकता है कि आप अपने दुबले और छोटे सिंटैक्स पर विस्तार से बता सकें कि यह कैसे काम करता है। ओह रुको, जो 3 साल पहले एक जवाब में किया गया था । आपका जवाब फिर से टेबल पर क्या लाता है?
डेन डैस्कलेस्कु

0

यहां तत्वों को दिखाने / छिपाने के लिए क्लासलेस रिएक्ट घटक के साथ सरल, प्रभावी और सबसे अच्छा समाधान आता है। React-Hooks का उपयोग जो नवीनतम create-react-app प्रोजेक्ट में उपलब्ध है जो React 16 का उपयोग करता है

import React, {useState} from 'react';
function RenderPara(){
const [showDetail,setShowDetail] = useState(false);

const handleToggle = () => setShowDetail(!showDetail);

return (
<React.Fragment>
    <h3>
        Hiding some stuffs 
    </h3>
    <button onClick={handleToggle}>Toggle View</button>
   {showDetail && <p>
        There are lot of other stuffs too
    </p>}
</React.Fragment>)

}  
export default RenderPara;

हैप्पी कोडिंग :)


0
//use ternary condition

{ this.state.yourState ? <MyComponent /> : null } 

{ this.state.yourState && <MyComponent /> }

{ this.state.yourState == 'string' ? <MyComponent /> : ''}

{ this.state.yourState == 'string' && <MyComponent /> }

//Normal condition

if(this.state.yourState){
 return <MyComponent />
}else{
  return null;
}

-1

आप सीएसएस फ़ाइल का उपयोग कर सकते हैं

    var Results = React.createClass({
    render: function() {
        return (
            <div id="results" className={`search-results ${this.state.showResults ? 'show' : ''}`}>
                Some Results
            </div>
        );
    }
})

और सीएसएस फ़ाइल में

    .search-results {
     ...
     display: none
     &.show {
      display: block
   }
}

-1
var Search= React.createClass({
 getInitialState: () => { showResults: false },
 onClick: () => this.setState({ showResults: true }),
 render: function () {
   const { showResults } = this.state;
   return (
     <div className="date-range">
       <input type="submit" value="Search" onClick={this.handleClick} />
       {showResults && <Results />}
     </div>
   );
 }
});

var Results = React.createClass({
    render: function () {
        return (
            <div id="results" className="search-results">
                Some Results
            </div>
        );
    }
});

React.renderComponent(<Search /> , document.body);

1
क्या आप बता सकते हैं कि आपने क्या किया, और यह स्वीकृत उत्तर से बेहतर क्यों है?
सेबोर

-1
class App extends React.Component {
  state = {
    show: true
  };

  showhide = () => {
    this.setState({ show: !this.state.show });
  };

  render() {
    return (
      <div className="App">
        {this.state.show && 
          <img src={logo} className="App-logo" alt="logo" />
        }
        <a onClick={this.showhide}>Show Hide</a>
      </div>
    );
  }
}

क्या आप बेहतर समझ के लिए स्पष्टीकरण जोड़ सकते हैं? धन्यवाद!
शांतेश्वर इंडी

@ शांतेश्वरइंडे: यह पिछले विचार से एक ही विचार को दोहराता है, जिसमें वर्तमान स्थिति के आधार पर सेटस्टेट का गलत उपयोग शामिल है। Reactjs.org/docs/react-component.html#setstate देखें : "यदि आपको पिछली स्थिति के आधार पर राज्य को सेट करने की आवश्यकता है, तो अपडेटर तर्क के बारे में पढ़ें"।
Dan Dascalescu

-1

var Search = React.createClass({
    getInitialState: function() {
        return { showResults: false };
    },
    onClick: function() {
        this.setState({ showResults: true });
    },
    render: function() {
        return (
            <div>
                <input type="checkbox" value="Search" onClick={this.onClick} />
                { this.state.showResults ? <Results /> : null }
            </div>
        );
    }
});

var Results = React.createClass({
    render: function() {
        return (
            <div id="results" className="search-results">
                <input type="text" />
            </div>
        );
    }
});

ReactDOM.render( <Search /> , document.getElementById('container'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.6.2/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/15.6.2/react-dom.min.js"></script>

<div id="container">
  <!-- This element's contents will be replaced with your component. -->
</div>


4
हालांकि यह कोड इस प्रश्न का उत्तर दे सकता है, कि यह कोड क्यों और / या इस बारे में अतिरिक्त संदर्भ प्रदान करता है कि यह प्रश्न इसके दीर्घकालिक मूल्य में सुधार करता है।
xiawi

@Xiawi ने क्या कहा। जब आप स्थिरांक घोषित करते हैं , तो इसके constबजाय कृपया उपयोग करें var
डेन डैस्कलेस्कु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.