Вы должны предоставить ссылку на эту функцию через реквизиты для детей или через контекст.
class Parent extends React.Component {
constructor(props: any) {
super(props);
this.changeDataSource = this.changeDataSource.bind(this);
}
state = { value: 'old' }
forceUpdate() {
console.log('forceUpdate');
}
changeDataSource() {
this.setState({ value: 'updated' });
this.forceUpdate();
}
render() {
return (
<div>
<h1>Parent</h1>
<p>{this.state.value}</p>
<Child func={this.changeDataSource} />
</div>
)
}
}
в Child.tsx:
type Function = (source: any) => void;
type ChildProps = {
func: Function
}
const Child = ({ func }: ChildProps) => {
return (
<div>
<h2>Child</h2>
<button onClick={func}>Child Button</button>
</div>
)
}
с контекстом это будет выглядеть так:
const Context = React.createContext<(() => void) | undefined>(undefined);
const Child = () => {
const func = React.useContext(Context);
return (
<div>
<h2>Child</h2>
<button onClick={func}>Child Button</button>
</div>
)
}
class Parent extends React.Component {
constructor(props: any) {
super(props);
this.changeDataSource = this.changeDataSource.bind(this);
}
state = { value: 'old' }
forceUpdate() {
console.log('forceUpdate');
}
changeDataSource() {
this.setState({ value: 'updated' });
this.forceUpdate();
}
render() {
return (
<Context.Provider value={this.changeDataSource}>
<div>
<h1>Parent</h1>
<p>{this.state.value}</p>
{/* deeep in tree */}
<Child />
</div>
</Context.Provider>
)
}
}