Tout d'abord, laissez-moi exprimer que c'est généralement no la façon de faire les choses à React land. En général, ce que vous voulez faire, c'est transmettre des fonctionnalités aux enfants dans des props, et transmettre des notifications des enfants dans des événements (ou mieux encore : dispatch
).
Mais si vous debe exposer une méthode impérative sur un composant enfant, vous pouvez utiliser la fonction refs . N'oubliez pas qu'il s'agit d'une trappe d'évacuation et que cela indique généralement qu'une meilleure conception est disponible.
Auparavant, les références n'étaient prises en charge que pour les composants basés sur des classes. Avec l'arrivée de Crochets React ce n'est plus le cas
React moderne avec Hooks ( v16.8+
)
const { forwardRef, useRef, useImperativeHandle } = React;
// We need to wrap component in `forwardRef` in order to gain
// access to the ref object that is assigned using the `ref` prop.
// This ref is passed as the second parameter to the function component.
const Child = forwardRef((props, ref) => {
// The component instance will be extended
// with whatever you return from the callback passed
// as the second argument
useImperativeHandle(ref, () => ({
getAlert() {
alert("getAlert from Child");
}
}));
return <h1>Hi</h1>;
});
const Parent = () => {
// In order to gain access to the child component instance,
// you need to assign it to a `ref`, so we call `useRef()` to get one
const childRef = useRef();
return (
<div>
<Child ref={childRef} />
<button onClick={() => childRef.current.getAlert()}>Click</button>
</div>
);
};
ReactDOM.render(
<Parent />,
document.getElementById('root')
);
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
<div id="root"></div>
Documentation pour useImperativeHandle()
es aquí :
useImperativeHandle
personnalise la valeur d'instance qui est exposée aux composants parents lors de l'utilisation de l'option ref
.
Legacy API utilisant des composants de classe ( >= react@16.4
)
const { Component } = React;
class Parent extends Component {
constructor(props) {
super(props);
this.child = React.createRef();
}
onClick = () => {
this.child.current.getAlert();
};
render() {
return (
<div>
<Child ref={this.child} />
<button onClick={this.onClick}>Click</button>
</div>
);
}
}
class Child extends Component {
getAlert() {
alert('getAlert from Child');
}
render() {
return <h1>Hello</h1>;
}
}
ReactDOM.render(<Parent />, document.getElementById('root'));
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
<div id="root"></div>
API Callback Ref
Les références de type callback sont une autre approche pour y parvenir, bien qu'elles ne soient pas aussi courantes dans le React moderne :
const { Component } = React;
const { render } = ReactDOM;
class Parent extends Component {
render() {
return (
<div>
<Child ref={instance => { this.child = instance; }} />
<button onClick={() => { this.child.getAlert(); }}>Click</button>
</div>
);
}
}
class Child extends Component {
getAlert() {
alert('clicked');
}
render() {
return (
<h1>Hello</h1>
);
}
}
render(
<Parent />,
document.getElementById('app')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>
1 votes
stackoverflow.com/a/65917432/8079868 pouvez-vous accepter ma réponse ?
0 votes
Vous pouvez faire de l'inversion d'héritage (voir ici) : medium.com/@franleplant/ ). De cette façon, vous avez accès à l'instance du composant que vous allez envelopper (vous pourrez donc accéder à ses fonctions).