You can use something like the Fluent UI Panel to build your own reusable configuration component for your other components, then in the root web part file you create a parameters to pass the values back to the web part configuration.
Short example:
Create an interface:
export interface IComponentConfiguration {
somevalue: number;
othervalue: number;
}
Update your root component render function:
const element: React.ReactElement<IMyWebPartProps> = React.createElement(
MyWebPart,
{
updateProperty: (value: IComponentConfiguration) => {
this.properties.componentconfig = value;
}
}
);
Add the same to your components property interface:
import { IComponentConfiguration} from '../IComponentConfiguration';
export interface IComponentUpdaterProps {
updateProperty: (value: IComponentConfiguration);
}
And then finally you update the configuration from your component like so:
this.props.updateProperty({ somevalue: 2, othervalue: 3 });
In your components you can set it to open this configuration panel if the web parts DisplayMode === DisplayMode.Edit
A more detailed example on how to pass configuration values back to the root web part can be found here, in @pnp/spfx-controls-react.