【问题标题】:Why detail View is not showing?为什么没有显示详细视图?
【发布时间】:2018-09-18 17:26:25
【问题描述】:

我的Index.tsx 文件中有这段代码,当前显示Actors 的列表。我想通过点击Detail 按钮来显示演员的详细信息,但我的问题是没有显示详细信息视图。有人可以帮忙吗?:

<td>
   <button className="action" onClick={(id) => this.handleDetails(item.Id)}>Detail</button>
</td>

调用这个方法:

handleDetails(id: number) {
    this.renderPopUp();
}

调用这个方法:

private renderPopUp() {
    return <Details id={this.state.activeId} />;
}

并且已经导入了这个:

import * as React from 'react'
import {RouteComponentProps} from 'react-router'
import * as models from "../../models"
import * as Modal from 'react-modal'
import { Details } from './Details'

最后这是我的Details.tsx 文件:

import * as React from 'react'
import { RouteComponentProps } from 'react-router'
import * as models from "../../models"

interface IDetailsState {
    actor: models.Actor;
    loading: boolean,
}

interface IDetailsProps {
    id: number
}

export class Details extends React.Component<IDetailsProps, IDetailsState> {
    constructor(props) {
        super(props);
        this.state = {
            actor: null,
            loading: true
        };
         alert('Hi');//This is not showing
        fetch('api/actors/get/' + this.props.id)
            .then(response => response.json() as Promise<models.Actor>)
            .then(data => {
                this.setState({
                    actor: data,
                    loading: false
                });
            });
    }

    public render() {
        alert('HelloAgain');
        let contents = this.state.loading
            ? <p><em>Loading...</em>
              </p>
            : this.renderDetails(this.state.actor);
        return <div>
                   <h1>Actor Details</h1>
                   {contents}
               </div>;
    }

    private renderDetails(item: models.Actor) {
        return <div className='details'>
                   <label>Id</label>
                   <div>item.Id</div>
                   <label>Name</label>
                   <div>item.Name</div>
                   <label>Gender</label>
                   <div>item.Gender</div>
                   <label>Age</label>
                   <div>item.Age</div>
                   <label>Picture</label>
                   <div>item.Picture</div>
               </div>;
    }
}

主要问题是return &lt;Details id={this.state.activeId} /&gt;; 没有调用Details.tsx,我想知道为什么?我在fetch 上方添加了一个警报alert('Hi');,但它也没有显示。

【问题讨论】:

  • 尝试在 componentDidMount 中进行 fetch 调用
  • 理想情况下,您不应该在constructor() 中调用setState(),因为组件尚未渲染。但这不应该是这里的主要问题。您是否在 API 调用后获取数据?如果没有尝试将其更改为response =&gt; return response.json() as Promise&lt;models.Actor&gt;。否则,您可以在 componentDidMount() 中获取数据,以使代码更好一点。
  • @Gautam 我的问题是Details.tsx 没有打电话。忘记API调用,我在fetch上方添加了一个警报alert('Hi');,它也没有显示。
  • @AbhayShiro 你能告诉我怎么做吗?
  • @Gautam Index 不能调用 Details。不知道为什么?

标签: javascript c# reactjs typescript asp.net-core


【解决方案1】:

终于找到问题了。您实际上并没有渲染Details 组件。它只是被返回。这就是为什么它没有被渲染。应更改按钮单击状态并使用Details 重新呈现组件。然后,它应该工作。 在index.tsx中试试下面的代码

import * as React from 'react';
import * as ReactDOM from 'react-dom';
import { Details }  from './details';

interface State {
   id: number;
   renderDetails: boolean;
}

export class Index extends React.Component<any, State> {

constructor(props: any, state: State){
    super(props, state);
    this.state ={
        id: 0,
        renderDetails: false
    }
}
public render() {
    let details = this.state.renderDetails ? <Details id={this.state.id}/> : null;
    return (
        <div>
            <td>
                <button className="action" onClick={this.handleDetails.bind(this, 1)}>Detail</button>
            </td>
            {details}
        </div>
    );
}

private handleDetails(id: number){
    this.setState({
        id: id,
        renderDetails: true
    })

}
}

【讨论】:

    【解决方案2】:
    public componentDidMount() {
      fetch('api/actors/get/' + this.props.id)
                .then(response => response.json() as Promise<models.Actor>)
                .then(data => {
                    this.setState({
                        actor: data,
                        loading: false
                    });
                });
    }
    

    也许您可以尝试在 componentDidMount 中调用 API 调用。 请告诉我。开放讨论。

    【讨论】:

    • 谢谢,但没用。它甚至不适用于简单的警报,public componentDidMount() { alert('Hi'); } Details tsx 文件中没有任何效果。
    猜你喜欢
    • 2015-02-22
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    相关资源
    最近更新 更多