【问题标题】:React - get data from child functional components in parentReact - 从父级中的子功能组件获取数据
【发布时间】: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


【解决方案1】:

尝试使用 useImperativeHandle 挂钩,它可能会对您有所帮助,它可以将方法和内容从您的孩子传递给您的父母,供您的父母使用。

【讨论】:

  • 我认为这不会让父级通过按钮单击事件访问子级状态。也许您可以提供示例代码?按钮存在于父项中,状态存在于子项中(根据我对问题的理解)
猜你喜欢
  • 1970-01-01
  • 2020-01-22
  • 2021-01-26
  • 2020-11-18
  • 2017-01-04
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 2022-01-07
相关资源
最近更新 更多