Hello,
C'est quelques chose que je n'ai pas encore rencontré malgré beaucoup de lecture concernant le sujet React.
Je penses que ton approche peut fonctionner, meme si pour ma part je passerai tout en fonctionnel.
En revanche comme popotte pour moi ManagedSociete devrait être une page et c'est ici que la logique applicative ce fera.
par exemple si je reprend t'es lignes de codes.
Je transformerai les choses comme ceci. ( après faut voir comment est ta vue, cela ne conviendra peut être pas )
import React, {useCallback} from "react";
import {ISociete} from "./ISociete";
export const ManagedSociete = () => {
const [societes, setSocietes ] = useState<ISociete[]>([])
const saveSociete = useCallback((societe:ISociete) => {
setSocietes([...societes, societe])
},[])
return (
<>
<SocieteForm saveSociete={saveSociete}/>
<SocieteList societes={societes} />
</>
)
}
export default function SocieteForm({saveSociete}){
const {register, handleSubmit}=useForm<ISociete>();
return(
<div className="form_societe" onSubmit={handleSubmit(saveSociete)}>
<h1>Formulaire société
<Button className="menu-list" component={Link} to="/societe/list"
>Voir la liste</Button>
</h1>
<form className="fomulaire " >
<Grid container spacing={2} justifyContent="space-between">
<Grid item md={10} xs={10}>
<TextField label="Désignation" variant="filled" color="primary" focused
fullWidth {...register("name")}/>
</Grid>
<Grid item md={2} xs={2}>
<TextField label="Forme Juridique" variant="filled"
fullWidth {...register("formeJuridique")} />
</Grid>
<Grid item >
<Button variant={"contained"} type={"submit"}>Enregistrer</Button>
</Grid>
</Grid>
</form>
</div>
)
export default function SocieteList({societes}){
const columns:GridColDef[]=[
{field:"id", headerName:"Id", width:50},
{field:"name", headerName:"Raison social", width:150}
];
return(
<div className="form_societe">
<h1>Liste des sociétés <Button className="menu-list" component={Link} to="/societe/form">Revenir au formulaire</Button></h1>
<DataGrid
columns={columns}
rows={societes}
autoHeight={true}
/>
</div>
)
Au pire si ça te dérange d'avoir des composants dans ManagedSociete, tu fais un custom Hooks
import React, {useCallback} from "react";
import {ISociete} from "./ISociete";
export const useManagedSociete = () => {
const [societes, setSocietes ] = useState<ISociete[]>([])
const saveSociete = useCallback((societe:ISociete) => {
setSocietes([...societes, societe])
},[])
return {societes, setSocietes, saveSociete}
}
et apres tu l'invoque la ou tu en a besoin et ta logique applicative reste aussi au meme endroit.
exemple
import {useManagedSociete} from "../hooks"
export default function SocieteList(){
const {societes} = useManagedSociete()
const columns:GridColDef[]=[
{field:"id", headerName:"Id", width:50},
{field:"name", headerName:"Raison social", width:150}
];
return(
<div className="form_societe">
<h1>Liste des sociétés <Button className="menu-list" component={Link} to="/societe/form">Revenir au formulaire</Button></h1>
<DataGrid
columns={columns}
rows={societes}
autoHeight={true}
/>
</div>
)