javascript - ترجمة - react js ماهو



React js يغير حالة المكون الفرعي من المكون الأصل (3)

الإجابة أعلاه صحيحة جزئياً بالنسبة لي ، لكن في السيناريو الخاص بي ، أريد تعيين القيمة على حالة ، لأنني استخدمت القيمة لإظهار / تبديل مشروط. لذلك لقد استخدمت مثل أدناه. آمل أن يساعد شخص ما.

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

لديّ مكونان: المكون الرئيسي الذي أريد تغيير حالة المكون الفرعي منه:

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

أحتاج إما إلى تغيير حالة فتح المكون الفرعي من المكون الرئيسي ، أو الاتصال بـ toggleMenu () المكون الفرعي للطفل من المكون الرئيسي عند النقر فوق الزر الموجود في المكون الرئيسي؟


Answer #1

يجب إدارة الحالة في المكون الأصل. يمكنك نقل القيمة 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}/>
      );
    }
}

Answer #2

يمكنك إرسال دعامة من الأصل واستخدامها في المكون الفرعي حتى تقوم بتأسيس تغييرات حالة الطفل على تغييرات الدعامة المرسلة ويمكنك التعامل مع هذا باستخدام getDerivedStateFromProps في المكون الفرعي .





reactjs