Mam dwa komponenty: Komponent nadrzędny, z którego chcę zmienić stan komponentu podrzędnego:
class ParentComponent extends Component {
toggleChildMenu() {
?????????
}
render() {
return (
<div>
<button onClick={toggleChildMenu.bind(this)}>
Toggle Menu from Parent
</button>
<ChildComponent />
</div>
);
}
}
I składnik podrzędny :
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}/>
);
}
}
Muszę albo zmienić stan otwarcia składnika podrzędnego ze składnika nadrzędnego, albo wywołać toggleMenu () składnika podrzędnego w składniku nadrzędnym po kliknięciu przycisku w składniku nadrzędnym?
javascript
reactjs
torayeff
źródło
źródło
Odpowiedzi:
Stan powinien być zarządzany w komponencie nadrzędnym. Możesz przenieść
open
wartość do komponentu podrzędnego, dodając właściwość.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}/> ); } }
źródło
classNames({ foo: true, bar: this.props.open });
// => 'foo', gdy this.props.open = false i 'foo bar', gdy this.props.open = true.toggle
do ChildComponent<ChildComponent open={this.state.open} toggle={this.toggleChildMenu.bind(this)} />
i wywołaćthis.props.toggle()
komponent podrzędnyChildComponent
-><ChildComponent toggle={this.toggleChildMenu.bind(this)} />
Komponent nadrzędny może zarządzać stanem potomnym, przekazując właściwość dziecku, a dziecko konwertuje tę właściwość w stanie za pomocą 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} /> } }
źródło
getDerivedStateFromProps()
. Jednak odpowiedź Miguela sugerująca użyciecomponentWillReceiveProps(props)
jest dostępna i zadziałała jak urok w moim środowisku.Powyższa odpowiedź jest dla mnie częściowo poprawna, ale w moim scenariuszu chcę ustawić wartość na stan, ponieważ użyłem wartości do wyświetlenia / przełączenia modalu. Więc użyłem jak poniżej. Mam nadzieję, że to komuś pomoże.
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> ); } }
Źródła - https://github.com/kriasoft/react-starter-kit/issues/909#issuecomment-252969542
źródło
Możesz użyć createRef, aby zmienić stan komponentu podrzędnego z komponentu nadrzędnego. Oto wszystkie kroki.
Utwórz metodę zmiany stanu w komponencie podrzędnym.
2 - Utwórz odwołanie do komponentu podrzędnego w komponencie nadrzędnym za pomocą React.createRef ().
3 - Dołącz odwołanie do komponentu podrzędnego za pomocą ref = {}.
4 - Wywołaj metodę komponentu potomnego za pomocą this.yor-reference.current.method.
Komponent nadrzędny
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> ); } }
Komponent podrzędny
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}/> ); } }
źródło
Możesz wysłać właściwość od rodzica i użyć jej w komponencie potomnym, aby oprzeć zmiany stanu dziecka na przesłanych zmianach właściwości i możesz sobie z tym poradzić, używając getDerivedStateFromProps w komponencie potomnym.
źródło