2015-11-30 64 views
0

創建鹼反應組件繼承:可重複使用的鹼反應成分結合的問題與ES6

import { Component } from 'react'; 

class BaseComponent extends Component { 
    constructor(props) { 
     super(props); 
    } 

    _bindProps(...methods) { 
     return methods.map(method => this[method].bind(this)) 
    } 
} 

export default BaseComponent; 

而且我的孩子組成:

class SomeChild extends BaseComponent { 

    constructor(props) { 
     super(props); 
    } 

    foo() { 

    } 

    render() { 
     const props = this._bindProps('foo'); 
     <Child {...props} /> 
    } 
} 

但是,我上線return methods.map(method => this[method].bind(this))收到Cannot read property 'bind' of undefined 。我怎樣才能做到這一點,即。將方法從父組件傳遞給子組件,並且當從子組件調用子組件時,請將值引用父組件。

回答

0

class SomeChild extends BaseComponent { 
 

 
    constructor(props) { 
 
     super(props); 
 
    } 
 

 
    foo =() => { 
 

 
    } 
 

 
    render() { 
 
     <Child foo={this.foo} /> 
 
    } 
 
}

如果你只是做了BaseComponent來(這個)綁定的方法和使用ES6會比較簡單,只是用箭頭功能爲你的方法。

+0

是的,我看到了。我將如何去利用箭頭功能來達到這個目的?即。將方法傳遞給組件 – benhowdle89

+0

請記住,箭頭函數不會綁定在原型上。 –

0

Janaka是正確的使用箭頭功能,但也有你的_bindProps執行問題。它返回一個綁定函數的數組,但你需要返回一個屬性的key/val對象。更新您的_bindProps定義:

_bindProps(obj) { 
    Object.keys(obj).forEach(k => obj[k] = obj[k].bind(this)); 
    return obj; 
} 

而且與對象調用它的伎倆:

class BaseComponent extends React.Component { 
    constructor(props) { 
    super(props); 
    } 

    _bindProps(obj) { 
    Object.keys(obj).forEach(k => obj[k] = obj[k].bind(this)); 
    return obj; 
    } 
} 

class SomeChild extends BaseComponent { 

    constructor(props) { 
    super(props); 
    this.name = 'Jack' 
    } 

    foo() { 
    return this.name; 
    } 

    render() { 
    const props = this._bindProps({ 
     foo: this.foo, 
    }); 
    console.log('props', props); 
    return <Child {...props} /> 
    } 
} 

你可以整理上面了一點點,但,它現在做正確的事情,如果你打電話this.props.foo()在子組件中,您將返回Jack

我很想知道爲什麼你這樣做,但呢?這不是我通常不得不在任何時候做的事情。

+0

對於基本相同的組件,我基本上有兩種不同的「視圖」(忘記MVC視圖,我的意思是字面意見)。所以我創建了兩個子組件(針對每個「視圖」),然後將所有回調方法從1父項傳遞給2個子項。事件處理程序添加到子項中,但實際上它們調用父項中的方法 – benhowdle89