Mostrarei dois estilos abaixo e você vai querer escolher dependendo de quanto a lógica dos componentes se relaciona entre si.
Estilo 1 - Os componentes relacionados podem ser criados com referências de retorno de chamada, como este, em ./components/App.js
...
<SomeItem
ref={(instance) => {this.childA = instance}}
/>
<SomeOtherItem
ref={(instance) => {this.childB = instance}}
/>
E então você pode usar funções compartilhadas entre eles assim ...
this.childA.investigateComponent(this.childB);
this.childB.makeNotesOnComponent(this.childA);
Estilo 2 - os componentes do tipo utilitário podem ser criados assim, em ./utils/time.js
...
export const getTimeDifference = function (start, end) {
}
E então eles podem ser usados assim, em ./components/App.js
...
import React from 'react';
import {getTimeDifference} from './utils/time.js';
export default class App extends React.Component {
someFunction() {
console.log(getTimeDifference("19:00:00", "20:00:00"));
}
}
Qual usar?
Se a lógica for relativamente relacionada (eles só são usados juntos no mesmo aplicativo), você deve compartilhar estados entre os componentes. Mas se a sua lógica for remotamente relacionada (ou seja, utilitário matemático, utilitário de formatação de texto), então você deve criar e importar funções de classe util.