Calling Remote Methods in Functional Components
To do this with functional components, you must do this:
Parent
- Give the child component a reference in the parent using
useRef():
const childRef = useRef()
// ...
return (
<ChildComponent ref={childRef} />
)
...
Child
- Pass
ref into the constructor:
const ChildComponent = (props, ref) => {
// ...
}
- Import
useImperativeHandle and forwardRef from 'react':
import React, { useImperativeHandle, forwardRef } from 'react'
- Use
useImperativeHandle to connect methods to the ref object.
These methods won't be internally available, so you may want to use them to call internal methods.
const ChildComponent = (props, ref) => {
//...
useImperativeHandle(ref, () => ({
// each key is connected to `ref` as a method name
// they can execute code directly, or call a local method
method1: () => { localMethod1() },
method2: () => { console.log("Remote method 2 executed") }
}))
//...
// These are local methods, they are not seen by `ref`,
const localMethod1 = () => {
console.log("Method 1 executed")
}
// ..
}
- Export the child component using
forwardRef:
const ChildComponent = (props, ref) => {
// ...
}
export default forwardRef(ChildComponent)
Putting it all together
Child Component
import React, { useImperativeHandle, forwardRef } from 'react';
import { View } from 'react-native'
const ChildComponent = (props, ref) => {
useImperativeHandle(ref, () => ({
// methods connected to `ref`
sayHi: () => { sayHi() }
}))
// internal method
const sayHi = () => {
console.log("Hello")
}
return (
<View />
);
}
export default forwardRef(ChildComponent)
Parent Component
import React, { useRef } from 'react';
import { Button, View } from 'react-native';
import ChildComponent from './components/ChildComponent';
const App = () => {
const childRef = useRef()
return (
<View>
<ChildComponent ref={childRef} />
<Button
onPress={() => {
childRef.current.sayHi()
}}
title="Execute Child Method"
/>
</View>
)
}
export default App
There is an interactive demo of this on Expo Snacks:
https://snack.expo.dev/@backupbrain/calling-functions-from-other-components
This explanation is modified from this TutorialsPoint article