2016-11-09 5 views
0

Ich dachte an eine Fabrik-Funktion zu schaffen createScreen zur Reduzierung des vorformulierten von react-redux erforderlich genannt.Wie reduzieren reagieren-redux vorformulierten - ich versuche, eine Component zu schaffen, aber ich bin immer reagieren-redux Fehler

Es sieht wie folgt aus:

ParentScreenFactory.js

export default function createScreen(stateActions = []) { 
    class ParentScreen extends React.Component { 

    } 

    function mapStateToProps(state) { 
    return { 
     ...state, 
    }; 
    } 

    function mapDispatchToProps(dispatch) { 
    const creators = Map() 
      .merge(...stateActions) 
      .filter(value => typeof value === 'function') 
      .toObject(); 

    return { 
     actions: bindActionCreators(creators, dispatch), 
     dispatch, 
    }; 
    } 

    return connect(mapStateToProps, mapDispatchToProps)(ParentScreen); 
} 

Child.js

const ParentScreen = createScreen([ 
    routingActions, 
    authActions, 
]); 

class Child extends ParentScreen { 

    constructor(props) { // <-- error on this line 
    super(props); 
    } 

    render() { 
    return (
     <View/> 
    ); 
    } 
} 
export default Child; 

aus irgendeinem Grund aber ich undefined is not an object (evaluating 'context.store') bekommen. Stacktrace:

Connect(ParentScreen) 
connect.js:129 

, die diese Codezeile ist _this.store = props.store || context.store;. Irgendwelche offensichtlichen Fehler, die Sie hier sehen? Anders als das Haben Sie eine bessere Vorstellung davon, wie all diese vorformulierten Code zu reduzieren?

Vielen Dank.

+0

Ihr Titel ist für Ihre Frage völlig irrelevant. Sie stellen eine Frage, wie Sie einen Fehler beheben können und werfen am Ende "Wie kann ich den Textbaustein reduzieren" ein. –

Antwort

2

Alles wird einfacher, wenn Sie mit der eigentlichen Komponentenklasse arbeiten, anstatt zu versuchen, den leeren verbunden, um eine (this is the class you're actually extending) zu verlängern.

Wenn Sie Ihre Komponente wollen vorhersagbar arbeiten, dann müssen Sie Ihre Komponente direkt verbinden. Versuchen Sie stattdessen, eine Funktion von Ihrer Fabrik zurückzugeben.

export default function createScreen(stateActions = []) { 
    return (Component) => { 
    // ... 
    return connect(mapStateToProps, mapDispatchToProps)(Component); 
    }; 
} 

Dann beginnt Ihre Instanziierung in etwa so auszusehen.

Wenn Sie etwas Verhalten zwischen allen Komponenten teilen möchten, dann verwenden Sie besser eine Komponente höherer Ordnung.

function withCommonBehaviour(Component) { 
    return (props) => { 
    let newProps = doSomething(props); 
    return <Component {...newProps} />; 
    }; 
} 

Dann nur, dass Haken in Ihrer createScreen Funktion.

// ... 
let CommonComponent = withCommonBehaviour(Component); 
return connect(mapStateToProps, mapDispatchToProps)(CommonComponent); 
+0

die tatsächlich sieht gut aus, aber ist es eine Möglichkeit, Dinge auf den Konstruktor der übergeordneten Komponente als auch zu laufen? Das ist etwas, was ich vergaß zu erwähnen, aber ich brauche es. – SudoPlz

+0

Ich glaube nicht, ich verstehe, was die "Elternkomponente" ist. –

+0

Ok können sagen, dass ich mein Kind Komponente wie so er innerhalb der Konstruktor ausgeführt wird einige Standardcode immer haben wollen: Klasse Child erstreckt React.Component { Konstruktor (Requisiten) {/ * etwas tun, hier * /}} kann Ich überspringe das immer wieder für jedes Kind, das ich mit deinem Vorschlag erstelle? Vielleicht indem Sie diesen Standardcode in die createScreen-Methode einfügen? – SudoPlz

Verwandte Themen