2017-01-13 3 views
0

Так что я собирался обсудить Наследование и Композицию повсюду. Я расскажу о своем прецеденте.Реагирующая композиция против наследования

Я создаю иерархию компонентов, использующих реакцию. Например, кнопка кнопки -> buttonBar. Поэтому для таких вещей любые функциональные возможности, которые я определил в компоненте кнопки, должны присутствовать, как и в компонентах buttonBar.

class Button extends React.Component { 
    shouldComponentUpdate() { 
     //do some prevalidation 
     return result; 
    } 

    myButtonfn =() => { 
     //do Something here 
    } 

    myButtonfn2 =() => { 
     //doSomething else 
    } 
} 

class ButtonBar extends Button { 
    shouldComponentUpdate() { 
     return myLogic && super.shouldComponentUpdate.call(this); 
    } 

    myButtonBarfn =() => { 
     //I should be able to do this 
     this.myButtonfn(); 
     this.myButtonfn2(); 
    } 
} 

В настоящее время я реализовал наследование для достижения этого. Каков правильный способ этого? Я не хочу возвращаться к использованию es5. React.createClass.

Мое использование функций в компоненте.

class Button extends React.Component { 
    shouldComponentUpdate() { 
     //do some prevalidation 
     return result; 
    } 

    myButtonfn =() => { 
     //do Something here 
    } 

    myButtonfn2 =() => { 
     //doSomething else 
    } 
} 

class ButtonBar extends React.Component { 
    doSomething =() => { 
     this.refs.abcd.myButtonfn();//To be able to do this, HOC doesn't work 
    } 
    render =() => { 
     return (<Button ref="abcd"/>); 
    } 
} 
+0

Посмотрите на более высоких компонентов порядка - https://facebook.github.io/react/docs/higher-order-components.html и передавая свои функции вниз как реквизит –

+0

@TMitchell Просто мысль, вам не кажется, что HOC слишком много для чего он хочет? –

+0

@TahnikMustasin слишком много в каком смысле? –

ответ

0

EDIT: Итак, вы только что отредактировали ваш ответ, который выглядит точно так же, как мой ответ. Это должно использовать текущий способ его использования.


Если вы можете использовать ES6, то вы можете создать кнопку класс называется и ваш ButtonBar может продлить кнопку, чтобы все функции кнопки.

Как это:

class Button { 
    constructor(){ 
    //initialise stuff 
    } 

    doFoo(){ 
    //do foo stuff 
    } 
} 

class ButtonBar extends Button{ 
    constructor(){ 
    //initialise stuff 
    } 

    doBar(){ 
    //do bar stuff 
    } 
} 

let myButtonBar = new ButtonBar(); 
myButtonBar.doFoo(); 
+0

Этот тип примеров работает, поскольку они являются только классами ES6, но как насчет того, когда речь заходит о компонентах React, как описывает автор. Вы не можете наследовать компонент React, как это (без сторонней библиотеки, такой как ReactOO). Возможные варианты: состав/компоненты более высокого порядка –

+0

Да, я упомянул «Если вы можете использовать es6». Кроме того, из его более позднего редактирования выглядит, что он действительно использует ES6. –

+0

Что я подразумеваю под «просто ES6 классами», так это то, что они не являются компонентами React. Я не верю, что вы можете расширить компонент React таким образом, чтобы он мог себя вести так, как вы ожидали бы этого. –

0
class Button extends React.Component { 
    constructor(props, context){ 
     super(props, context); 
     //set local state 
    } 
    shouldComponentUpdate() { 
     //do some prevalidation 
     return result; 
    } 

    const myButtonfn =() => { 
     //do Something here 
    } 

    const myButtonfn2 =() => { 
     //doSomething else 
    } 
} 

class ButtonBar extends Button { 

    constructor(props, context){ 
     super(props, context); 
     //set local state 
    } 
    shouldComponentUpdate() { 
     // No need to bind if you are call super method in ES6 
     return myLogic && super.shouldComponentUpdate(); 
    } 

    myButtonBarfn =() => { 
     //I should be able to do this 
     super.myButtonfn(); 
     super.myButtonfn2(); 
    } 
} 
Смежные вопросы