रिएक्ट जेएस बच्चे के घटक की स्थिति को मूल घटक से बदलते हैं


99

मेरे पास दो घटक हैं: मूल घटक जिसमें से मैं बच्चे के घटक की स्थिति बदलना चाहता हूं:

class ParentComponent extends Component {
  toggleChildMenu() {
    ?????????
  }
  render() {
    return (
      <div>
        <button onClick={toggleChildMenu.bind(this)}>
          Toggle Menu from Parent
        </button>
        <ChildComponent />
      </div>
    );
  }
}

और बाल घटक :

class ChildComponent extends Component {
  constructor(props) {
    super(props);
    this.state = {
      open: false;
    }
  }

  toggleMenu() {
    this.setState({
      open: !this.state.open
    });
  }

  render() {
    return (
      <Drawer open={this.state.open}/>
    );
  }
}

मुझे पेरेंट कंपोनेंट से चाइल्ड कंपोनेंट के ओपन स्टेट को बदलने की जरूरत है , या पेरेंट कंपोनेंट के बटन पर क्लिक करने पर पेरेंट कंपोनेंट से चाइल्ड कंपोनेंट का टॉगलमेनू () कॉल करना होगा ?


हो सकता है कि आप माता-पिता में एक बच्चे का संदर्भ रख सकें, और बच्चे की स्थिति को स्पष्ट रूप से बदल सकें, यह डॉक
चाजुन झोंग

जवाबों:


124

राज्य को मूल घटक में प्रबंधित किया जाना चाहिए। आप openएक संपत्ति जोड़कर मूल्य को बाल घटक में स्थानांतरित कर सकते हैं।

class ParentComponent extends Component {
   constructor(props) {
      super(props);
      this.state = {
        open: false
      };

      this.toggleChildMenu = this.toggleChildMenu.bind(this);
   }

   toggleChildMenu() {
      this.setState(state => ({
        open: !state.open
      }));
   }

   render() {
      return (
         <div>
           <button onClick={this.toggleChildMenu}>
              Toggle Menu from Parent
           </button>
           <ChildComponent open={this.state.open} />
         </div>
       );
    }
}

class ChildComponent extends Component {
    render() {
      return (
         <Drawer open={this.props.open}/>
      );
    }
}

क्या इसे 'प्रदर्शन' जैसी सीएसएस संपत्ति को नियंत्रित करने के लिए इस्तेमाल किया जा सकता है? जैसे कि, अगर मेरे प्रोप 'ओपन' में 'कोई नहीं' या 'इनलाइन-ब्लॉक' शामिल है, तो क्या सीएसएस डिस्प्ले प्रोप अपडेट हो जाएगा?
ड्यूसोफ्नुल

3
हाँ, यह अनिवार्य रूप से प्रतिक्रिया-क्लासनाम पैकेज क्या करता है, लेकिन यह आपको हमेशा क्लासनाम का एक सेट लागू करने की अनुमति देता है, और सशर्त रूप से दूसरों को लागू करता है। इस तरह: classNames({ foo: true, bar: this.props.open });// => 'foo' जब यह। props.open = false और 'foo bar' जब यह ।props.open = true।
ड्यूसोफ़नॉल

1
हम बच्चे के घटक में खुले राज्य को कैसे बदल सकते हैं?
प्रियब्रत अथ

1
आप toggleचाइल्डकंपोनेंट के लिए एक संपत्ति जोड़ सकते हैं <ChildComponent open={this.state.open} toggle={this.toggleChildMenu.bind(this)} />और this.props.toggle()बच्चे के घटक में कॉल कर सकते हैं
ओलिवियर बोइस

1
मुझे समझ में नहीं आता, जब भी आप इस संपत्ति को निर्दिष्ट करते हैं, तो आप इसे कॉल कर सकते हैं, जैसे ही ChildComponent-> घोषित करते समय -><ChildComponent toggle={this.toggleChildMenu.bind(this)} />
ओलिवियर बोइस

25

मूल घटक बच्चे के लिए एक प्रॉप पास करने वाले बच्चे की स्थिति का प्रबंधन कर सकता है और बच्चा इस प्रोप को कंपोनेंट रीसिविवप्रॉप्स का उपयोग करके राज्य में परिवर्तित कर सकता है।

class ParentComponent extends Component {
  state = { drawerOpen: false }
  toggleChildMenu = () => {
    this.setState({ drawerOpen: !this.state.drawerOpen })
  }
  render() {
    return (
      <div>
        <button onClick={this.toggleChildMenu}>Toggle Menu from Parent</button>
        <ChildComponent drawerOpen={this.state.drawerOpen} />
      </div>
    )
  }
}

class ChildComponent extends Component {
  constructor(props) {
    super(props)
    this.state = {
      open: false
    }
  }

  componentWillReceiveProps(props) {
    this.setState({ open: props.drawerOpen })
  }

  toggleMenu() {
    this.setState({
      open: !this.state.open
    })
  }

  render() {
    return <Drawer open={this.state.open} />
  }
}

1
प्रतिक्रिया में 16 का उपयोग करें getDerivedStateFromProps
Fadi Abo Msalam

1
@FadiAboMsalam मैं @ 16 प्रकार के साथ प्रतिक्रिया संस्करण 16.7.0 का उपयोग कर रहा हूं। कम से कम टाइपस्क्रिप्ट साइड पर तो नहीं लगता है getDerivedStateFromProps()। हालाँकि, मिगुएल का उपयोग करने का सुझाव componentWillReceiveProps(props)उपलब्ध है और मेरे एनवी में एक आकर्षण की तरह काम करता है।
मैनफ्रेड

इस स्थिति में, टॉगलमेनू () बच्चे के घटक के अंदर राज्य परिवर्तन माता-पिता तक कैसे पहुंचेगा? कल्पना कीजिए कि मैं दराज को बंद करता हूं, माता-पिता के घटक को कैसे पता चलेगा कि यह बंद हो गया है?
norman123123

20

उपरोक्त उत्तर मेरे लिए आंशिक रूप से सही है, लेकिन मेरे परिदृश्य में, मैं एक राज्य के लिए मूल्य निर्धारित करना चाहता हूं, क्योंकि मैंने एक मोडल दिखाने / टॉगल करने के लिए मूल्य का उपयोग किया है। इसलिए मैंने नीचे की तरह उपयोग किया है। आशा है कि यह किसी की मदद करेगा।

class Child extends React.Component {
  state = {
    visible:false
  };

  handleCancel = (e) => {
      e.preventDefault();
      this.setState({ visible: false });
  };

  componentDidMount() {
    this.props.onRef(this)
  }

  componentWillUnmount() {
    this.props.onRef(undefined)
  }

  method() {
    this.setState({ visible: true });
  }

  render() {
    return (<Modal title="My title?" visible={this.state.visible} onCancel={this.handleCancel}>
      {"Content"}
    </Modal>)
  }
}

class Parent extends React.Component {
  onClick = () => {
    this.child.method() // do stuff
  }
  render() {
    return (
      <div>
        <Child onRef={ref => (this.child = ref)} />
        <button onClick={this.onClick}>Child.method()</button>
      </div>
    );
  }
}

संदर्भ - https://github.com/kriasoft/react-starter-kit/issues/909#issuecomment-252969542


2
यह वही है जो मैं चाहता हूं, लेकिन मैं सोच रहा हूं कि क्यों न केवल प्रतिक्रिया रेफ का उपयोग करें? डॉक
चाजुन झोंग

OnRef प्रोप क्या करता है?
norman123123 17

2

आप मूल घटक से चाइल्ड घटक की स्थिति को बदलने के लिए createRef का उपयोग कर सकते हैं। यहाँ सभी चरण हैं।

  1. बच्चे के घटक में राज्य को बदलने के लिए एक विधि बनाएं।

    2 - React.createRef () का उपयोग करके मूल घटक में बच्चे के घटक के लिए एक संदर्भ बनाएँ।

    3 - Ref = {} का उपयोग करके बच्चे के घटक के साथ संदर्भ संलग्न करें।

    4 - चाइल्ड कम्पोनेंट मेथड को इस का उपयोग करके कॉल करें।

जनक घटक


class ParentComponent extends Component {
constructor()
{
this.changeChild=React.createRef()
}
  render() {
    return (
      <div>
        <button onClick={this.changeChild.current.toggleMenu()}>
          Toggle Menu from Parent
        </button>
        <ChildComponent ref={this.changeChild} />
      </div>
    );
  }
}

बाल घटक


class ChildComponent extends Component {
  constructor(props) {
    super(props);
    this.state = {
      open: false;
    }
  }

  toggleMenu=() => {
    this.setState({
      open: !this.state.open
    });
  }

  render() {
    return (
      <Drawer open={this.state.open}/>
    );
  }
}




1

आप माता-पिता से एक प्रस्ताव भेज सकते हैं और इसे बच्चे के घटक में उपयोग कर सकते हैं ताकि आप भेजे गए प्रोप परिवर्तनों पर बच्चे के राज्य परिवर्तनों को आधार बनाएंगे और आप बच्चे के घटक में getDerivedStateFromProps का उपयोग करके इसे संभाल सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.