У меня есть два компонента: Родительский компонент, из которого я хочу изменить состояние дочернего компонента:
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 () дочернего компонента из родительского компонента при нажатии кнопки в родительском компоненте?
javascript
reactjs
Torayeff
источник
источник
Ответы:
Состояние должно управляться в родительском компоненте. Вы можете передать
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}/> ); } }
источник
classNames({ foo: true, bar: this.props.open });
// => 'foo', когда this.props.open = false и 'foo bar', когда this.props.open = true.toggle
в ChildComponent<ChildComponent open={this.state.open} toggle={this.toggleChildMenu.bind(this)} />
и вызватьthis.props.toggle()
дочерний компонентChildComponent
-><ChildComponent toggle={this.toggleChildMenu.bind(this)} />
Родительский компонент может управлять дочерним состоянием, передавая опору дочернему элементу, а потомок конвертирует эту опору в состояние с помощью 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} /> } }
источник
getDerivedStateFromProps()
. Тем не менее, ответ Мигеля, предлагающий использоватьcomponentWillReceiveProps(props)
, доступен и работал как шарм в моем окружении.Приведенный выше ответ частично верен для меня, но в моем сценарии я хочу установить значение в состояние, потому что я использовал значение для отображения / переключения модального окна. Поэтому я использовал как показано ниже. Надеюсь, это кому-то поможет.
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
источник
Вы можете использовать createRef для изменения состояния дочернего компонента от родительского компонента. Вот все шаги.
Создайте метод для изменения состояния в дочернем компоненте.
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}/> ); } }
источник
Вы можете отправить опору от родителя и использовать ее в дочернем компоненте, чтобы вы основывали изменения состояния дочернего элемента на отправленных изменениях опоры, и вы можете справиться с этим, используя getDerivedStateFromProps в дочернем компоненте.
источник