2016-11-07 12 views
0

私はコンポーネントを実行する必要がある関数を渡すためにpropsを使用しています。コンポーネントをできるだけダムにしておきます。反応クラスに関数を入れる代わりに。アクセスコンポーネント `this` from container

コンポーネントの状態を更新する必要がありますが、私のprop機能内からsetStateにアクセスする際に問題があります。私の関数がそれにアクセスすることができますので、私は、何かのようにやってみましたが、私はエラーになっておく:

コンポーネント

componentDidMount(){ 
    this.props.loadImage(this.props.src).bind(this); 
    } 

コンテナロードイメージ関数

let loadImage = (src)=>{ 
    console.log('loading Image');  
    fetch(src).then(function(data) { 
     console.log('success'); 
     that.setState({'imgUrl':src}); 
    }).catch(function(error) { 
     console.log('fail'); 
     setTimeout(loadImage(src), 1000); 
    }); 

}; 

エラー:

component.js:67 Uncaught TypeError: Cannot read property 'bind' of undefined(…) 
  1. なぜこのバインドが未定義であるかop関数?
  2. 私はこれに間違った方法で近づいていますか?

ありがとう!

+0

'loadImage'とそれが返す見ずに伝えるのは難しいです。それを共有する心ですか? – ZekeDroid

+0

@ZekeDroidそれは多くの支えがあったとは思っていませんでしたが、それを追加しました。 – Justin

+0

今はあなたがその小道具の戻り値をバインドしているからです。つまり、その小道具のように見えるreturn文がない場合、あなたは 'undefined'にバインドしようとしています。 – ZekeDroid

答えて

1

loadImageが関数を返さない場合は、おそらくbindを未定義に呼び出している可能性があります。あなたは代わりにthis.props.loadImage.bind(this, this.props.src);をしたいかもしれません。

+0

は、明示的に設定されたパラメータをバインドして別々に呼び出すこともできます: 'this.props.loadImage.bind(this).call(未定義、this.props.src)' – bryce

+0

'bind'は関数を返すだけです?これは 'loadImage'が' call'edされないことを意味します –

+0

何かの理由で私はバインドを呼び出したと思っていました。コールとバインドを使用することで大きな効果がありました。それを知ってよかった。ありがとう@guavacatと@@ mr-meeseeks – Justin

1

なぜ最初にthisをバインドするのですか?

class Example extends React.Component { 
 
    constructor() { 
 
    super(); 
 
    this.state = { 
 
     data: '' 
 
    } 
 
    } 
 
    componentDidMount() { 
 
    this.doSomething('hello'); 
 
    } 
 
    doSomething(data) { 
 
    this.setState({ 
 
     data 
 
    },() => console.log(this.state)); 
 
    } 
 
    render() { 
 
    return(
 
     <div>{this.state.data}</div> 
 
    ); 
 
    } 
 

 
} 
 

 
ReactDOM.render(<Example/>, document.getElementById('View'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
<div id="View"></div>

+0

少なくとも私が理解しているように、ディスプレイに焦点を当て、可能な限りシンプルなコンポーネントを保つことがベストプラクティスです。機能をコンテナファイルに入れて、機能とデータの取得を処理する。この練習では、いくつかの定型コードをいくつか追加していますが、全体的に価値があると思います。 – Justin