为什么这里的状态没有传递给 child (TypeScript/React/SPFX)

Why isn't the state being passed down to child here (TypeScript/React/SPFX)

在这个例子中,我有一个 Parent class 组件:Dibf。 我有一个 Child class 组件:Header.

我可以设法将道具从 Parent 传递到 child。但是我试图通过这样做来传递状态(下面代码块的底线):

export interface IDibfState {

    CurrentUserTitle: string;
    CurrentUser: string[];
    CurrentUserGroups: string;
    CurrentUserID: string[];
    CurrentUserEmail: string;
    FullName: string;
    UniId: string;
    FilteredItems: IDibfItems[];
    Author: string;
    CurrentUserRole: string;
    Items: IDibfItems[];
    DepartmentsList: IDropdownOption[];
    SelectedDept: string;
    Id: number;
    JobRef: string;
    FormStatus: string;
    Title: string;
    JobTitle: string;
    Date: Date;
    DateOfDiscovery: Date;
    IncidentDetails: string;
    PersonalData: string;
    PhoneNo: string;
    Department: string;
    SubDepartment: string;
    LoggedInUser: string;
    LoggedInUserPPDefaultItems: string[];
}


export interface IDibfProps {
  description: string;
  context: WebPartContext;

}

export default class Dibf extends React.Component<any, any> {
  constructor(props) {
    super(props);
    this.state = {
      CurrentUserTitle: null,
      CurrentUser: null,
      CurrentUserGroups: null,
      CurrentUserID: null,
      CurrentUserEmail: null,
      FullName: null,
      UniId: null,
      FilteredItems: [],
      Author: null,
      CurrentUserRole: null,
      Items: [],
      DepartmentsList: [],
      SelectedDept: undefined,
      Id: null,
      JobRef: null,
      Title: null,
      JobTitle: null,
      Date: null,
      DateOfDiscovery: null,
      IncidentDetails: null,
      PersonalData: null,
      FormStatus: null,     
      PhoneNo: null,
      Department: null,
      SubDepartment: null,
      LoggedInUser: null,
      LoggedInUserPPDefaultItems: [],

    };

    // this.handler = this.handler.bind(this);
    this._getDepartments = this._getDepartments.bind(this);
    this._getUser = this._getUser.bind(this);
  }

  // public handler(event) {
  //   this.setState({
  //     value: event.target.value
  //   });
  // }

  public render(): React.ReactElement<IDibfProps> {
    return (
      <Router>

        <div className={ styles.dataForm }>
        <div className={ styles.container }>  
          <Label style={{fontSize: '50px'} }> Data Form</Label>    
          <Header usertitle={this.state.CurrentUserTitle}/>

如您所见,我已经提供了 TypeScript 所需的两个接口。状态和道具。您还可以看到我正在尝试将 CurrentUserTitle 状态传递给 child 组件。这是在这里:

export class Header extends React.Component<any, {}> {

  public render(): React.ReactElement<{}> {
    return (


          <div>
              <Label>Hello {this.props.usertitle}</Label>

          <div className={styles.row}>   
              <DefaultButton className={styles.clearButton}
                disabled={false}
                checked={true}
                text="Clear Form"
                onClick={this.props.handler}
              />

如您所见,道具的 React.Component<any, {}> 设置为 any,如果我将其设置为最初的 {},这使我可以避免出现错误消息。 不幸的是组件中没有任何显示。

如果有帮助,如果我为组件输入 React.Component<{}, {}>,则显示的错误是:

'Property usertitle does not exist on type ReadOnly{ children?: ReactNode; }> & ReadOnly<{}>'

谁能告诉我如何将此状态传递给 Header 组件以便对其进行更新然后发送回去?如果这是正确的做事方式。

T

如果您需要将状态从子组件更新到父组件。然后你需要将一个函数作为 prop 从父组件传递给子组件,并在子组件中调用它。

如果您删除 'any',您会看到错误的原因是,Header 组件正在接收一个 prop,而 typescript 无法识别。在接口中提供 State 和 Props 将帮助您进行严格的类型检查,我们明确告诉组件应该只有这些 props 和 state。

interface HeaderProps
{
 usertitle:string
}

export class Header extends React.Component<HeaderProps>

子组件递增父组件状态的示例。 https://codesandbox.io/s/serverless-pine-w63m0

在您的 Dibf class 中,您需要将 handler 方法作为 属性 传递给 Header 组件:

<Header usertitle={this.state.CurrentUserTitle} handler={this.handler.bind(this)}/>