代码之家  ›  专栏  ›  技术社区  ›  Connell.O'Donnell

属性在React组件中始终未定义

  •  0
  • Connell.O'Donnell  · 技术社区  · 6 年前

    public class Property
    {
        public int PropertyID { get; set; }
        public string Name { get; set; }
    }
    

    export interface IPropertySearchResult {
        PropertyID: number,
        Name: string
    }
    
    export interface IPropertySearchResults {
        Results: IPropertySearchResult[]
    }
    
    export interface IPropertyWindowProps {
        Properties: IPropertySearchResults
    }
    
    export interface IPropertyWindowState {
    }
    
    export class PropertyWindow extends React.Component<IPropertyWindowProps, 
    IPropertyWindowState> {
        constructor(props: IPropertyWindowProps) {
        super(props);
        }
    
    render() {
        return (
            <div >
                <ul>
                    {
                        this.props.Properties && this.props.Properties.Results ?                        
                            this.props.Properties.Results.map((p: IPropertySearchResult, idx: number) =>
                                <li key={idx}> <PropertyEditor Property={p} /> </li>)                        
                            : 'properties null'
                    }
                </ul>
            </div>
        );
    }
    

    如下图所示,this.props.Properties 包含我需要的对象但出于某种原因this.props.Properties.Results 始终标记为未定义。

    screenshot .

    我认为问题与我读取数据的方式有关。我有我的控制器:

    [HttpGet("Search")]
    public IActionResult GetProperties()
    {
        var props = new Property[]
        {
            new Property(){PropertyID=1, Name="default1"},
            new Property(){PropertyID=2, Name="default2"},
            new Property(){PropertyID=3, Name="default3"},
            };
    
            return Ok(new { Properties = props });
        }
    }
    

    及其客户:

    export class PropertyReader {
        public static search(): Promise<IPropertySearchResults> {
            return new Promise<IPropertySearchResults>((resolve, reject) => {
                axios.get(`api/Settings/Search`)
                    .then(res => {
                        resolve(res.data);
                    });
            });
        }
    }
    

    然后组件的父级调用客户端:

        componentDidMount() {
            PropertyReader.search()
                .then(p => this.setState({ properties: p }));
        }
    

    出于某种原因,它正在创建IPropertySearchResults并将数据放入动态添加的数组中,而不是放入结果数组中。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Connell.O'Donnell    6 年前

    事实证明,这是一个非常愚蠢的解决方案。这些值将保存到具有小写名称的属性。我得换衣服

    export interface IPropertySearchResults {
        Results: IPropertySearchResult[]
    }
    

    export interface IPropertySearchResults {
        results: IPropertySearchResult[]
    }