2017-02-20 2 views
1

왜 소품 필드 Locationnull인지 고려하면 페이지가로드 될 때 내 양식 구성 요소 끝에있는이 소품 this.props.event.Who.Name이 오류를 반환하는지 잘 모르겠습니다. REST API에서 데이터를 가져오고 일부 레코드 필드는 null입니다. 이 문제를 해결할 방법이 있습니까?소품이 null을 반환합니다

오류 전에 소품의 오류

Uncaught (in promise) TypeError: Cannot read property 'Name' of null at Update.render (webpack:///./src/components/Event/Update.js?:349:116)

콘솔. enter image description here

import React from 'react'; 

class Update extends React.Component { 

    constructor(props) { 
    super(props); 
    this.onChange = this.onChange.bind(this); 
    this.onSubmit = this.onSubmit.bind(this); 
    } 

    onChange(e) { 
    this.setState({ 
     [e.target.name]: e.target.value, 
    }); 
    } 

    onSubmit(e) { 
    e.preventDefault(); 
    console.log('event is being submitted for update.'); 
    console.log(this.props.event); 
    } 
    render() { 
    console.log(this.props.event); 
    return (
     <form ref={(input) => this.eventForm = input} onSubmit={(e) => this.createEvent(e)} className="slds-form"> 
     <div className="slds-form-element"> 
      <label className="slds-form-element__label">Assigned To</label> 
      <div className="slds-form-element__control"> 
      <input ref={(input) => this.assignedName = input} type="text" className="slds-input" value={this.props.event.Owner.Name} disabled/> 
      <input ref={(input) => this.assignedId = input} type="hidden" className="slds-input" value={this.props.event.Owner.Id} disabled/> 
      </div> 
     </div> 
     <div className="slds-form-element"> 
      <label className="slds-form-element__label">Related To</label> 
      <div className="slds-form-element__control"> 
      <input ref={(input) => this.relatedName = input} type="text" className="slds-input" value={this.props.event.What.Name} disabled/> 
      <input ref={(input) => this.relatedId = input} type="hidden" className="slds-input" value={this.props.event.What.Id} disabled/> 
      </div> 
     </div> 
     <div className="slds-form-element"> 
      <label className="slds-form-element__label">Subject</label> 
      <div className="slds-form-element__control"> 
      <input ref={(input) => this.subject = input} type="text" className="slds-input" value={this.props.event.Subject}/> 
      </div> 
     </div> 
     <div className="slds-form-element"> 
      <label className="slds-form-element__label">Location</label> 
      <div className="slds-form-element__control"> 
      <input ref={(input) => this.location = input} type="text" className="slds-input" value={this.props.event.Location}/> 
      </div> 
     </div> 
     <div className="slds-form-element"> 
      <label className="slds-form-element__label">Event Start</label> 
      <div className="slds-form-element__control"> 
      <input ref={(input) => this.start = input} type="text" onChange={(e) => this.onChange(e)} className="slds-input" value={ this.props.event.StartDateTime }/> 
      </div> 
     </div> 
     <div className="slds-form-element"> 
      <label className="slds-form-element__label">Event End</label> 
      <div className="slds-form-element__control"> 
      <input ref={(input) => this.end = input} type="text" onChange={(e) => this.onChange(e)} className="slds-input" value={ this.props.event.EndDateTime } /> 
      </div> 
     </div> 
     <div className="slds-form-element"> 
      <label className="slds-form-element__label" htmlFor="input4">Contact</label> 
      <div className="slds-form-element__control"> 
      <section className="slds-clearfix"> 
       <input ref={(input) => this.contactName = input} className="slds-input" style={{maxWidth: '92%'}} disabled value={ this.props.event.Who.Name } /> 
       <input ref={(input) => this.contactId = input} type="hidden" value={ this.props.event.Who.Id }/> 
       <button type="button" onClick={this.toggleModal} className="slds-button slds-button--icon-border slds-float--right" aria-live="assertive" style={{display: 'inline'}}> 
       <svg className="slds-button__icon" aria-hidden="true"> 
        <use xlinkHref={searchIcon}></use> 
       </svg> 
       </button> 
      </section> 
      </div> 
     </div> 

     <button type="button" className="slds-button slds-button--neutral">Cancel</button> 
     <button type="submit" className="slds-button slds-button--brand">Update</button> 
     </form> 
    ); 
    } 
} 

export default Update; 
+0

console.log에서 오류가 표시됩니다. this.contactName = input} className = "slds-input"style = {{maxWidth : '92 % '}}에 {this.props.event.Who.Name} 비활성화 된 값 = {this.props.event.Who.Name} /> 및 누가 null인지. Who.name을 수행하기 전에 Who 값을 확인할 수 있습니다. – noveyak

+0

예, 위치가 null이고 오류가 발생하지 않습니다. –

+0

null을 렌더링하는 ok, null을 역 참조 할 수 없습니다. 대신 this.props.event.Who && this.props.event.Who.Name을 수행 할 수 있습니다. 이 방법은 누가 정의되지 않았을 때 아무 일도하지 않지만 정의 된 경우 이름을 렌더링합니다. – noveyak

답변

2

이유는 당신이 api에서 데이터를 가져 오는된다, 그래서 당신이 데이터를하지 않았다까지, this.props.event.any_keyundefined되기 때문에 당신이 필요로하는, 그래서 당신은, 당신은 데이터를 얻을 때까지 rendering을 보유 할 필요가 그것이 작동하는 체크 Object.keys(this.props.event) > 0 ?를 넣어,이 옵션을 사용합니다 :

render() { 
    Object.keys(this.props.event) > 0? 
     return (
     <form ref={(input) => this.eventForm = input} onSubmit={(e) => this.createEvent(e)} className="slds-form"> 
     <div className="slds-form-element"> 
      <label className="slds-form-element__label">Assigned To</label> 
      <div className="slds-form-element__control"> 
      <input ref={(input) => this.assignedName = input} type="text" className="slds-input" value={this.props.event.Owner.Name} disabled/> 
      <input ref={(input) => this.assignedId = input} type="hidden" className="slds-input" value={this.props.event.Owner.Id} disabled/> 
      </div> 
     </div> 
     <div className="slds-form-element"> 
      <label className="slds-form-element__label">Related To</label> 
      <div className="slds-form-element__control"> 
      <input ref={(input) => this.relatedName = input} type="text" className="slds-input" value={this.props.event.What.Name} disabled/> 
      <input ref={(input) => this.relatedId = input} type="hidden" className="slds-input" value={this.props.event.What.Id} disabled/> 
      </div> 
     </div> 
     <div className="slds-form-element"> 
      <label className="slds-form-element__label">Subject</label> 
      <div className="slds-form-element__control"> 
      <input ref={(input) => this.subject = input} type="text" className="slds-input" value={this.props.event.Subject}/> 
      </div> 
     </div> 
     <div className="slds-form-element"> 
      <label className="slds-form-element__label">Location</label> 
      <div className="slds-form-element__control"> 
      <input ref={(input) => this.location = input} type="text" className="slds-input" value={this.props.event.Location}/> 
      </div> 
     </div> 
     <div className="slds-form-element"> 
      <label className="slds-form-element__label">Event Start</label> 
      <div className="slds-form-element__control"> 
      <input ref={(input) => this.start = input} type="text" onChange={(e) => this.onChange(e)} className="slds-input" value={ this.props.event.StartDateTime }/> 
      </div> 
     </div> 
     <div className="slds-form-element"> 
      <label className="slds-form-element__label">Event End</label> 
      <div className="slds-form-element__control"> 
      <input ref={(input) => this.end = input} type="text" onChange={(e) => this.onChange(e)} className="slds-input" value={ this.props.event.EndDateTime } /> 
      </div> 
     </div> 
     <div className="slds-form-element"> 
      <label className="slds-form-element__label" htmlFor="input4">Contact</label> 
      <div className="slds-form-element__control"> 
      <section className="slds-clearfix"> 
       <input ref={(input) => this.contactName = input} className="slds-input" style={{maxWidth: '92%'}} disabled value={ this.props.event.Who.Name } /> 
       <input ref={(input) => this.contactId = input} type="hidden" value={ this.props.event.Who.Id }/> 
       <button type="button" onClick={this.toggleModal} className="slds-button slds-button--icon-border slds-float--right" aria-live="assertive" style={{display: 'inline'}}> 
       <svg className="slds-button__icon" aria-hidden="true"> 
        <use xlinkHref={searchIcon}></use> 
       </svg> 
       </button> 
      </section> 
      </div> 
     </div> 

     <button type="button" className="slds-button slds-button--neutral">Cancel</button> 
     <button type="submit" className="slds-button slds-button--brand">Update</button> 
     </form> 
    : 
    return <div>fetching data...</div> 

제안을 : 당신의 propsthis.props.event 모든 시간 Y를 사용하여 그렇게하는 대신 데이터의 큰 금액을 포함하기 때문에 별도의 변수에 this.props.event의 값을 저장할 수 있으므로 코드를 작고 읽기 쉽게 만듭니다. 이처럼 :

render(){ 
    let event = this.props.event; 

이제 대신 this.props.event의 직접 event를 사용합니다.

+0

필드 'Who.Name'이 null이지만 레코드에 필수 필드가 아닙니다. 어떤 레코드는'Who.Name'에 값을 가지고 있습니다. 어떤 경우에는 –

+1

을 쓰지 않습니다.이 경우에는 다음과 같이 별도의 체크를해야합니다 :'value = {this.props.event.Who? this.props.event.Who.Id : ''}'. –

관련 문제