2016-07-05 137 views
7

我有一個地圖應用程序,我建立了一個按鈕按下後需要一些地圖圖標出現/消失,但我無法弄清楚如何設置它來重新渲染組件,當我從它傳入一個新的運動屬性父母組件:爲什麼我的反應組件不更新狀態更新?

家長負載組件:

<SimpleMap sports=[default value and future values go here] /> 

簡單的地圖組件(簡體):

constructor(props) { 
    (props); 
    this.state = { 
    events: [{venue: {lat: 2, lon: 1}}], 
    sports: ["baseball", "football", "paddle", "soccer", "boxing", "dart", "biking", "golf", "hockey", "inline-skating", "tennis", "volleyball", "skateboard", "kickball", "bowling", "pool", "ride", "hike", "ice-skating"] 
    }; 
}; 

componentWillReceiveProps (nextProps) { 
    this.setState({events: [{venue: {lat: 2, lon: 1}}], 
        sports: nextProps.sports}); 
    console.log(nextProps.sports); 
} 

static defaultProps = { 
    center: {lat: 36.160338, lng: -86.778780}, 
    zoom: 12, 
    sports: ["baseball", "football", "paddle", "soccer", "boxing", "dart", "biking", "golf", "hockey", "inline-skating", "tennis", "volleyball", "skateboard", "kickball", "bowling", "pool", "ride", "hike", "ice-skating"], 
}; 

makeMapEvents (insertProps) { 
    fetch("./json/meetup.json").then((response) => { 
    return response.json() 
    }).then((response) => { 
    /* eventually returns new events object based on insertProps */ 
    this.setState({events: response}); 
    } 
}; 

componentDidMount() { 
    this.makeMapEvents(this.state.sports); 
    console.log("mounted", this.state.sports); 
} 

最終結束了在這裏的狀態映射事件:

<GoogleMap> 
    {this.state.events.map((result) => { 
    return (<Marker key={counter++} lat={result.venue.lat} lng={result.venue.lon} 
       sport={this.props.sport} data={result}/>); 
    })} 
</GoogleMap> 
+0

如果定義了'counter'變量?另外,你幾乎從不使用索引值作爲React中的'key'屬性。始終爲每個循環渲染的組件使用唯一的標識符,否則,當項目被刪除或重新排序時,您可能會遇到奇怪的行爲。 –

+0

它在其他地方定義。我簡化了它。這只是一個數字。謝謝你的提示。 – deek

回答

3

陣營ES6類不通過默認autobind this非反應基構件的方法。因此,函數makeMapEventsthis的上下文未正確綁定。有兩種方法來解決這個問題:

通過ES7屬性初始化:

makeMapEvents = (insertProps) => { 
    fetch("./json/meetup.json").then((response) => { 
    return response.json() 
    }).then((response) => { 
    /* eventually returns new events object based on insertProps */ 
    this.setState({events: response}); 
    }) 
}; 

通過在構造函數結合:

constructor(props) { 
    (props); 
    this.state = { 
    events: [{venue: {lat: 2, lon: 1}}], 
    sports: ["baseball", "football", "paddle", "soccer", "boxing", "dart", "biking", "golf", "hockey", "inline-skating", "tennis", "volleyball", "skateboard", "kickball", "bowling", "pool", "ride", "hike", "ice-skating"] 
    }; 

    this.makeMapEvents = this.makeMapEvents.bind(this) // << important line 


} 
2
.then((response) => { 
    this.setState({events: resp}); 
} 

你把參數response然後嘗試使用resp其心不是你想要的變量。

+0

對不起,他們是我錯過了一個錯字,並刪除了不必要的代碼。它原來是正確的,而不是問題(取Ajax代碼工作正常)。 – deek

1

可能的原因是您撥打this.setState()makeMapEvents()函數未提供this的正確詞彙值,導致您的代碼無法正常工作。改變makeMapEvents()功能定義中使用Arrow功能() => {}),並提供正確的詞彙結合的這個作爲值:

makeMapEvents = (insertProps) => { 
    fetch("./json/meetup.json").then((response) => { 
    return response.json() 
    }).then((response) => { 
    this.setState({events: response}); 
    }); // <-- Typo here. The closing parenthesis is missing 
}; 

也有是在代碼中一個錯字,其中如圖上述評論右括號丟失

+0

這是以es6類作爲組件的Reactjs。 makeMapEvents =(insertProps)=> {引發語法錯誤 – deek

1

您正在混合組件中的道具和狀態。運動應該只是道具,它不應該處於狀態,因爲它是從父組件傳入的。

constructor(props) { 
    (props); 
    this.state = { 
    events: [{venue: {lat: 2, lon: 1}}] <== removed sports here, it didn't belong 
}; 

componentWillReceiveProps (nextProps) { 
    this.setState({events: [{venue: {lat: 2, lon: 1}}], 
        sports: nextProps.sports}); 
    console.log(nextProps.sports); 
} 

static defaultProps = { 
    center: {lat: 36.160338, lng: -86.778780}, 
    zoom: 12, 
    sports: ["baseball", "football", "paddle", "soccer", "boxing", "dart", "biking", "golf", "hockey", "inline-skating", "tennis", "volleyball", "skateboard", "kickball", "bowling", "pool", "ride", "hike", "ice-skating"], 
}; 

makeMapEvents (insertProps) { 
    fetch("./json/meetup.json").then((response) => { 
    return response.json() 
    }).then((response) => { 
    /* eventually returns new events object based on insertProps */ 
    this.setState({events: response}); 
    } 
}; 

componentDidMount() { 
    this.makeMapEvents(this.props.sports); <== changed to props.sports 
    console.log("mounted", this.props.sports); <== changed to props.sports 
}