Skip to content

multiple instances of the same (component, store, actions)? #237

Description

@freder

hi,

I am trying to find out what the best way is to have multiple instances of the same react component in the same app with flummox.

Library is a component that loads data from the specified url and displays it as a filterable list. let's say, I wanted to have two of those lists, but with different data sources. — how would I do that?

what seems to work is to simply create multiple Flux instances, one for each list:

// [...]

var Library = require('./components/Library/Library.js');
var LibraryActions = require('./components/Library/LibraryActions.js');
var LibraryStore = require('./components/Library/LibraryStore.js');

class AppFlux extends Flux {
    constructor() {
        super();

        this.createActions('library', LibraryActions);
        this.createStore('library', LibraryStore, this);
    }
}

const flux = new AppFlux();
const flux2 = new AppFlux();

React.render(
    <FluxComponent flux={flux} connectToStores={['library']}>
        <Library url='data/lib.json' />
    </FluxComponent>,
    $('#test-library')[0]
);

React.render(
    <FluxComponent flux={flux2} connectToStores={['library']}>
        <Library url='data/models.json' />
    </FluxComponent>,
    $('#model-library')[0]
);

however, being new to (flux /) flummox, I'm not sure if it is supposed to be used like this.

also, what if a third component needed to react to actions from the two list components?


so I tried s.th. like this: only a single Flux instance, but instead creating multiple actions / store instances with different "names".

class AppFlux extends Flux {
    constructor() {
        super();

        this.createActions('library', LibraryActions);
        this.createStore('library', LibraryStore, this, 'library'); // tell store which name to use

        this.createActions('model-library', LibraryActions);
        this.createStore('model-library', LibraryStore, this, 'model-library');
    }
}

const flux = new AppFlux();

React.render(
    <FluxComponent flux={flux} connectToStores={['library']}>
        <Library url='data/lib.json' libName='library' />
    </FluxComponent>,
    $('#test-library')[0]
);

React.render(
    <FluxComponent flux={flux} connectToStores={['model-library']}>
        <Library url='data/models.json' libName='model-library' /> // tell component which name to use
    </FluxComponent>,
    $('#model-library')[0]
);

LibraryStore.js:

class LibraryStore extends flummox.Store {
    constructor(flux, name) {
        super();
        const libraryActionIds = flux.getActionIds(name);

// [...]

Library.js:

class Library extends React.Component {
    constructor(props) {
        super(props);
        utils.autoBind(this);

        var flux = this.props.flux;
        var libraryActions = flux.getActions(this.props.libName);
        libraryActions.loadData(this.props.url);
    }

// [...]

this feels a bit cumbersome, but works...


any suggestions, how to properly do this?

thanks a lot in advance.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions