0

I am new to reflux and I'm trying to find out the best way of triggering my react-skylight dialog....

My react app has nested components, which is very top heavy at the moment. I would like to fire off the dialog when my tabLink component is clicked.

Where should I put the markup for my skylight?

Could my skylight have a store and an action? which I could broadcast into?

UPDATED: Can I fire off my skylight dialog by calling its action direct from my component?

If I pull in the action for the dialog:

DialogAction = require('../partials/actions/DialogAction');

Can I make a direct call to the action here in the tabLink component:

mixins: [Reflux.connect(TabLinkStore)],

onShowDialog:function(){
   DialogAction.onShowDialog();
},

Dialog action:

var Reflux = require('reflux');

var DialogAction = Reflux.createActions([
"showDialog"
]);


module.exports = DialogAction;

Otherwise, am I right in thinking the skylight component would need to be in each component its needs firing from?

I would like to keep the skylight decoupled, and the view clean.

Tablink component:

var TabLink = React.createClass({
contextTypes: {
    router: React.PropTypes.func
},

mixins: [Reflux.connect(TabLinkStore)],

getTabClass: function () {
    return this.props.isActive ? "active_on" : "";
},

getLinkNode: function() {
    if (this.props.link) return <a href={this.props.link} >{this.props.label}</a>;
    return <Link to={this.props.route} >{this.props.label}</Link>;
},

render: function () {
    if (this.props.clearBasket) return TabLinkAction.ShowDialog(id, function(isSelected) {
        checkbox.checked = isSelected;
    });
    return (
        <li className={this.getTabClass()}>
            {this.getLinkNode()}
        </li>
    );
}
});

module.exports = TabLink;

Store:

var React = require('react'),
Reflux = require('reflux'),
TabLinkAction = require('../actions/TabLinkAction'),
skylight  = require('react-skylight');

var TabLinkStore = Reflux.createStore({

listenables: TabLinkAction,
onShowDialog: function(){
        // show dialog here?
}

});

module.exports = TabLinkStore;

action:

var Reflux = require('reflux');

var TabLinkAction = Reflux.createActions([
"ShowDialog"
]);


module.exports = TabLinkAction;

Skylight that needs to fire:

<SkyLight ref="myModal" title="TITLE FOR MODAL" showOverlay={true}>Modal With Overlay</SkyLight>
Bomber
  • 10,195
  • 24
  • 90
  • 167

1 Answers1

0

In the store you want a set/get for hideSkyLight. In the component that listens to the store setState({hideSkyLight: store.getHideSkyLight()}).

    render: function() {
        var hideSkyLight = this.state.hideSkyLight;
        return (
            <ShowSkyLight hide={hideSkyLight}/>
        )
    }

In your component ShowSkyLight;

    render: function() {
        if (this.props.hide) return null;
        return (
            <SkyLight ref="myModal" title="TITLE FOR MODAL" showOverlay={true}>Modal With Overlay</SkyLight>
        )
    }

One advantage of this pattern is that the SkyLight component is not rendered until called. This can improve performance.

J. Mark Stevens
  • 4,911
  • 2
  • 13
  • 18
  • Thanks for the reply, would it be possible to call the dialog without including it in my component view where I would like the dialog to appear? So my view are clean and doesnt include any dialog markup? I've edited my original post – Bomber Aug 25 '15 at 07:53
  • You need to put it where you reference the store. If this is in the top level component then it doesn't have to be in each subsequent component. – J. Mark Stevens Aug 25 '15 at 14:56