2017-05-29 64 views
0

只是提及,我没有找到我在类似帖子上的特定情况的答案。this.props.myActionCreator抛出'TypeError:无法读取属性'null'的道具'

我的应用程序允许用户获取城市的天气以及该天气的相关装箱单。

我想让每个城市的卡片可删除并放置一个应该调用updateTerms动作创建器的'X',然后将其从用户列表中移除并更新dom。

回调似乎火,但this.props.updateTerms抛出**类型错误:在handleDeleteCard无法读取空 的特性 '道具' **

a_result_card.js

import React, { Component } from 'react'; 
import { connect } from 'react-redux'; 
import ATodoList from './a_Todo_List'; 
import CSSTransitionGroup from 'react-transition-group/CSSTransitionGroup'; 
import { bindActionCreators} from 'redux'; 
import { updateTerms } from '../actions'; 

class AResultCard extends Component { 
    constructor(props) { 
     super(props); 
     this.state = { cityName : '' }; 
     this.handleDeleteCard = this.handleDeleteCard.bind(this); 
    } 

    handleDeleteCard(event) { // I NEED TO CALL THIS WITH THE KEY 
     //So THAT I CAN REMOVE IT FROM THE USERS TERM LIST 
     event.preventDefault(); 
     debugger; 
     this.props.updateTerms(cityName, "delete"); 
    } 

    renderWeather(cityData) { 
     function calcAverageTemp(days) { 
      let reduced = days.reduce((sum,day) => { 
       return sum + day.main.temp_max; 
      }, 0); 
      return Math.floor(reduced/cityData.list.length); 
     }; 
     function calcAverageHumidity(days) { 
      let reduced = days.reduce((sum,day) => { 
       return sum + day.main.humidity; 
      }, 0); 
      return Math.floor(reduced/cityData.list.length); 
     }; 
     const avgTempK = calcAverageTemp(cityData.list); 
     const cityName = cityData.city.name; 
     const avgTempF = Math.floor((avgTempK * 1.8) - 459.67); 
     const avgHumidity = calcAverageHumidity(cityData.list); 

     return (
      <li key={cityName} className="result-card"> 
       <div className="card"> 
        <div className=""> 
         <div className="weather-details"> 
          <div className="card-heading"> 
           <span className="weather-detail detail-title">{cityName}</span> 
           <span className="weather-detail">{avgTempF} &#176;F</span> 
           <span className="weather-detail">H: {avgHumidity}%</span> 
           <span className="weather-detail delete-card-icon" onClick={handleDeleteCard}>X</span> 
          </div> 
         </div> 
         <ATodoList avgTempF={avgTempF} /> 
        </div> 
       </div> 
      </li> 
     ); 
    } 


    render() { 
     return (
      <ul className="results"> 
       <CSSTransitionGroup 
        transitionName="example" 
        transitionEnterTimeout={150} 
        transitionLeaveTimeout={150}> 

       {this.props.weather.map(this.renderWeather)} 
       </CSSTransitionGroup> 
      </ul> 
     ); 
    } 
} 

function mapStateToProps({weather, userTerms}) { 
    return ({ 
      weather, 
      userTerms 
     }); 
} 
function mapDispatchToProps(dispatch) { 
    return bindActionCreators({ updateTerms }, dispatch); 
} 

export default connect(mapStateToProps, mapDispatchToProps)(AResultCard); 
+0

你可以尝试调用函数的onClick这样的 - '的onClick = {this.handleDeleteCard}' – nrgwsth

+0

这部分的解决方案,谢谢。 :) – Zach

回答

0

你需要拨打你的handleDeleteCard功能,如

<span className="weather-detail delete-card-icon" onClick={this.handleDeleteCard}>X</span> 

因为它b elongs到React Component的背景下,而不是renderWeather功能

也结合了renderWeather功能

renderWeather = (cityData) => { 
    function calcAverageTemp(days) { 
     let reduced = days.reduce((sum,day) => { 
      return sum + day.main.temp_max; 
     }, 0); 
     return Math.floor(reduced/cityData.list.length); 
    }; 
    function calcAverageHumidity(days) { 
     let reduced = days.reduce((sum,day) => { 
      return sum + day.main.humidity; 
     }, 0); 
     return Math.floor(reduced/cityData.list.length); 
    }; 
    const avgTempK = calcAverageTemp(cityData.list); 
    const cityName = cityData.city.name; 
    const avgTempF = Math.floor((avgTempK * 1.8) - 459.67); 
    const avgHumidity = calcAverageHumidity(cityData.list); 

    return (
     <li key={cityName} className="result-card"> 
      <div className="card"> 
       <div className=""> 
        <div className="weather-details"> 
         <div className="card-heading"> 
          <span className="weather-detail detail-title">{cityName}</span> 
          <span className="weather-detail">{avgTempF} &#176;F</span> 
          <span className="weather-detail">H: {avgHumidity}%</span> 
          <span className="weather-detail delete-card-icon" onClick={this.handleDeleteCard}>X</span> 
         </div> 
        </div> 
        <ATodoList avgTempF={avgTempF} /> 
       </div> 
      </div> 
     </li> 
    ); 
} 
+0

您的解决方案工作。我忘记了使用箭头运算符处理作用域的方式不同。谢谢! – Zach

+0

顺便说一下,我想将城市名称传递给动作创建者,但它当前是在renderweather内部生成的。如果您对于更好地组织数据有任何想法,我会接受建议。 :) – Zach

相关问题