React js는 부모 구성 요소에서 자식 구성 요소의 상태를 변경합니다.


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

부모 구성 요소에서 자식 구성 요소의 열린 상태를 변경 하거나 부모 구성 요소의 버튼을 클릭하면 부모 구성 요소에서 자식 구성 요소의 toggleMenu () 를 호출 해야합니까?


어쩌면 당신은 부모에서 자식 참조를 보유 할 수 있으며, 변경 아이의 상태는 명시 적으로이 참조 문서
Chaojun 종

답변:


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

'디스플레이'와 같은 CSS 속성을 제어하는 ​​데 사용할 수 있습니까? 내 prop 'open'에 'none'또는 'inline-block'이 포함되어 있으면 CSS 디스플레이 소품이 업데이트됩니까?
deusofnull

3
예, 그것은 본질적으로 react-classnames 패키지가하는 일이지만 항상 클래스 이름 집합을 적용하고 조건부로 다른 항목을 적용 할 수도 있습니다. 다음과 같이 : classNames({ foo: true, bar: this.props.open });// => this.props.open = false이면 'foo', this.props.open = true이면 'foo bar'.
deusofnull

1
자식 구성 요소에서 열린 상태를 어떻게 변경할 수 있습니까?
Priyabrata Atha

1
당신은 속성 추가 할 수 있습니다 toggleChildComponent에 <ChildComponent open={this.state.open} toggle={this.toggleChildMenu.bind(this)} />와 전화 this.props.toggle()하위 구성 요소
올리비에 Boissé

1
를 선언 할 때이 속성을 지정되는대로 자식 요소에서 원하는 목적지 당신이 그것을 호출 할 수 있습니다, 이해가 안 ChildComponent> -<ChildComponent toggle={this.toggleChildMenu.bind(this)} />
올리비에 Boissé

25

부모 구성 요소는 자식에게 소품을 전달하는 자식 상태를 관리 할 수 ​​있으며 자식은 componentWillReceiveProps를 사용하여이 소품을 상태로 변환합니다.

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 @ Types / react 버전 16.7.18과 함께 반응 버전 16.7.0을 사용하고 있습니다. 적어도 TypeScript 측에는 getDerivedStateFromProps(). 그러나 사용을 제안하는 Miguel의 대답 componentWillReceiveProps(props)은 사용할 수 있으며 내 환경에서 매력처럼 작동했습니다.
Manfred

이 경우 자식 구성 요소 내에서 toggleMenu () 상태가 어떻게 변경되어 부모에 도달합니까? 서랍을 닫았다 고 가정하면 부모 구성 요소가 서랍이 닫 혔음을 어떻게 알 수 있습니까?
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
이것이 내가 원하는 것이지만 왜 반응 심판을 사용하지 않는지 궁금합니다. 참조 문서
Chaojun 종

onRef 소품은 무엇을합니까?
norman123123

2

createRef를 사용하여 부모 구성 요소에서 자식 구성 요소의 상태를 변경할 수 있습니다. 다음은 모든 단계입니다.

  1. 하위 구성 요소의 상태를 변경하는 메서드를 만듭니다.

    2-React.createRef ()를 사용하여 부모 구성 요소의 자식 구성 요소에 대한 참조를 만듭니다.

    3-ref = {}를 사용하여 하위 구성 요소에 참조를 첨부합니다.

    4-this.yor-reference.current.method를 사용하여 하위 구성 요소 메서드를 호출합니다.

부모 구성 요소


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 를 사용하여이를 처리 할 수 ​​있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.