【发布时间】:2021-06-11 14:30:38
【问题描述】:
我有功能组件、表父级和行子级。 子控件由父控件传递的数据启动。控件使用 useState 挂钩来更新各个项目。所以他们的初始 dataRows 数组在父级中,当前状态在各个行中。现在我想在父表下方添加一个保存按钮,以保留更改。我知道我可以将回调传递给子级,但是该操作是在父级上执行并需要来自多个子级的数据这一事实呢?我可能会为初始行执行保存,但我想为所有存在的行批量运行它,所以它需要在父级上完成,并从父级启动。
家长:
export default function RozliczeniaFaktur ({web, context, formType}: IRozliczeniaFakturProps) {
const [dataRows, setDataRows] = React.useState(emptyRowArr);
const [isError, setIsError] = React.useState(false);
const [errorMessage, setErrorMessage] = React.useState(null);
[...]
return (
<div className={styles.rozliczeniaFaktur}>
<Stack tokens={stackTokens}>
{isError && <MessageBar messageBarType={MessageBarType.error} isMultiline={false} >
{errorMessage}
</MessageBar>}
<div className={styles.dataTable}>
<div className={styles.scrollContainer}>
<table id='rozliczenia' className={styles.table}>
<thead>
<tr>
[...]
</tr>
</thead>
<tbody>
{dataRows &&
dataRows.map((dataRow, i) => {
return <TableRowControl web={web} key={i} Context={context} RowId={i} FormType={formType}
onAddRowCallback={addRow} onDeleteRowCallback={delRow} />
})
}
</tbody>
</table>
</div>
<div>
</div>
</div>
</Stack>
</div>
);
}
孩子:
const TableRowControl = ({RowId, Context, PozFaktury, FormType, onAddRowCallback, onDeleteRowCallback, web,
onErrorCallback, OrganizacjaDictionary, VatDictionary, MpkDictionary, KontoDictionary, ZastepstwaDictionary,
ZaliczkaDictionary} : ITableRowControlProps) => {
const [oddzialRozliczenia, setOddzialRozliczenia] = React.useState<number | string>(PozFaktury.OddzialRozliczenia);
const [dataSprzedazy, setDataSprzedazy] = React.useState<Date>(PozFaktury.DataSprzedazy);
const [dataOtrzymania, setDataOtrzymania] = React.useState<Date>(PozFaktury.DataOtrzymania);
const [vat, setVat] = React.useState<string | number>(PozFaktury.StawkaVAT);
const [nip, setNip] = React.useState<string>(PozFaktury.NIPDostawcy);
const [waluta, setWaluta] = React.useState<string | number>(PozFaktury.Waluta);
const [nrDok, setNrDok] = React.useState<string>(PozFaktury.NRDokumentu);
const [kwota, setKwota] = React.useState<string>(PozFaktury.KwotaBrutto.toString())
const [mpk, setMpk] = React.useState<string | number>(PozFaktury.MPK);
const [konto, setKonto] = React.useState<string | number>(PozFaktury.KontoGL);
const [magazyn, setMagazyn] = React.useState(PozFaktury.Magazyn);
const [nrPz, setNrPz] = React.useState(PozFaktury.NrPZ);
const [opis, setOpis] = React.useState(PozFaktury.Opis);
const [zaliczka, setZaliczka] = React.useState<string | number>(PozFaktury.Zaliczka);
const [aprobata1status, setAprobata1status] = React.useState(PozFaktury.Aprobata1Status);
const [aprobata2status, setAprobata2status] = React.useState(PozFaktury.Aprobata2Status);
const [komentarz, setKomentarz]
return(
<tr>
[...]
</tr>
);
}
export default TableRowControl;
【问题讨论】:
-
如果没记错的话,保存按钮需要保存来自每个子组件(行)的值。但是,子组件包含状态,对吗?如果是这样,不能将状态提升到父级(存在保存按钮)吗?
-
@NathanHall 是的,通常我可以通过回调来解除它,但是如何从按钮所在的父级启动它?
-
您无法使用按钮单击事件从子级访问状态。反应中有规则,“道具下降,事件上升”。看看这个jasonformat.com/props-down-events-up
-
@NathanHall 好的,所以也许我需要重新设计它,改变方法 - 但是到什么?我将不得不使用 useState 而不是子中的本地常量,而是父级上的某个对象(以保持父级上所有行的当前状态,并能够在按下提交时访问它)。这甚至可能吗?
-
绝对有可能。而且,使用 Formik 等库时会更容易。
标签: reactjs react-functional-component