簡體   English   中英

在ReactJS中傳遞參數

[英]Passing parameters in ReactJS

我正在嘗試在React中的主要細節數據格式之間導航。 源頁面執行此操作:

{myDataList.map(myData =>
    <tr key={myData.dataId}>
    <td>{myData.dataId}</td>
    <td>{myData.dataDescription}</td>
    <td>
        <NavLink to={'/details/' + myData.dataId}>
            Details
        </NavLink>
    </td>

單擊編輯鏈接確實會導航到具有正確URL的詳細信息頁面。 這樣做(主要取自VS中的示例模板):

interface DetailsState {
    details?: DataDetails;
    loading: boolean;
}

export class Details extends React.Component<RouteComponentProps<number>, DetailsState> {
constructor() {
    super();
    this.state = { details: undefined, loading: true };

    console.log("match params: " + this.props.match.params);

    fetch('api/Data/Details/' + this.props.match.params)
        .then(response => response.json() as Promise<DataDetails>)
        .then(data => {
            this.setState({ details: data, loading: false });
        });
}

我的問題是上述console.log顯示:

TypeError: _this.props is undefined

因此,我無法訪問正在傳遞的dataId

顯然,我錯誤地傳遞(或接收)了該參數; 所以我的問題是:傳遞參數的正確方法是什么? 值得注意的是,我的項目基於VS模板,並且我使用的是tsx,而不是jsx文件。

您無法在組件的構造函數中訪問this.props 但是,它可用作第一個參數。 你可以這樣做:

export class Details extends React.Component<RouteComponentProps<number>, DetailsState> {
  constructor(props) {
    super(props);
    this.state = { details: undefined, loading: true };

    console.log("match params: " + props.match.params);

    fetch('api/Data/Details/' + props.match.params)
      .then(response => response.json() as Promise<DataDetails>)
      .then(data => {
        this.setState({ details: data, loading: false });
      });
  }
}

確保在構造函數中首先調用super(props) ,否則React會大吼大叫。

編輯:

正如@Dan指出的那樣,通常不建議在構造函數中執行異步操作。 最好在componentDidMount()這樣做:

export class Details extends React.Component<RouteComponentProps<number>, DetailsState> {
  constructor(props) {
    super(props);
    this.state = { details: undefined, loading: true };

    console.log("match params: " + props.match.params);
  }

  componentDidMount() {
    fetch('api/Data/Details/' + this.props.match.params)
      .then(response => response.json() as Promise<DataDetails>)
      .then(data => {
        this.setState({ details: data, loading: false });
      });
  }
}

如果要在構造函數中訪問props ,則需要將它們傳遞給:

constructor(props) {
    super(props);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM