2016-06-06 34 views
0

Ich versuche, eine dynamische NavBar mit reagieren und Rückfluss holen zu erstellen.Reflux.js + React.js Trigger-Ergebnis ist falsch

Dies ist meine Handlungen Datei:

var Reflux = require('reflux'); 

    var SubMenuActions = Reflux.createActions([ 
     'getSubItems' 
    ]); 

    module.exports = SubMenuActions; 

Meine Speicher-Datei:

var Reflux = require('reflux'); 
var SubMenuActions = require('../actions/SubMenuActions.jsx'); 
var HTTP = require('../services/httpService.js'); 

var SubMenuStore = Reflux.createStore({ 
listenables: [SubMenuActions], 
    getSubItems: function(urls){ 
    var promises = []; 
    var thys = this; 
    for(var i in urls){ 
    promises.push(HTTP.getSubItems(urls[i])); 
    } 
    Promise.all(promises).then(function(data){ 
    thys.trigger(data); 
    }); 
    } 
    }); 

    module.exports = SubMenuStore; 

Meine http-Methode:

getSubItems: function(url){ 
    return fetch(url) 
    .then(function(response){ 
    return response.json(); 
    }); 
    } 

Und die letzten, meine navitem Datei, in dem Trigger eingefangen:

var React = require('react'); 
var NavSubItem = require('./NavSubItem.jsx'); 
var SubMenuStore = require('../reflux/stores/SubMenuStore.jsx'); 
var Reflux = require('reflux'); 

var NavItem = React.createClass({ 
    mixins: [Reflux.listenTo(SubMenuStore, 'onChange')], 
    getInitialState: function(){ 
    return{ 
     urls: this.props.urls, 
     subItems: [] 
    }; 
    }, 
    componentWillMount: function(){ 
    SubMenuStore.getSubItems(this.state.urls); 
    }, 
    onChange: function(items){ 
    console.log(items); 
    }, 
    createNavSubItem: function(item, index){ 
    return <NavSubItem key={item + index} name={item.name}/>; 
    }, 
    render: function(){ 
    return(
     <li className="menuLists dropdown"> 
      <a href="#" 
       className="dropdown-toggle" 
       data-toggle="dropdown" 
       role="button" 
       aria-haspopup="true" 
       aria-expanded="false">{this.props.name} 
       <span className="caret"></span> 
      </a> 
      <ul className="dropdown-menu"> 
      {this.state.subItems.map(this.createNavSubItem)} 
      </ul> 
     </li> 
    ); 
    } 
}); 

module.exports = NavItem; 

Das Problem ist, dass, wenn ich das Ergebnis von "console.log (Elemente)" überprüfen, die bei onChange Methode ich jedes Ergebnis zweimal erhalten, als ob Trigger-Methode zweimal ausgelöst wurden.

Deshalb kann ich meine Navbar nicht vollständig korrigieren.

Weiß jemand über dieses Problem? Bitte helfen Sie mir!

+0

Ich bin nicht klar aus Ihrer Beschreibung - Ihr 'onChange' wird tatsächlich zweimal aufgerufen, oder es wird einmal aufgerufen, aber die Elemente werden dupliziert? –

+0

Sorry, ich glaube ich war nicht so klar. onChange wird zweimal aufgerufen –

+0

Haben Sie versucht, einen Debugger zu verwenden, um einen Haltepunkt in OnChange festzulegen und zu sehen, wie der Aufrufstapel ist? Es kann Ihnen sagen, warum/wie es zweimal aufgerufen wird. –

Antwort

0

In ComponentWillMount sollten Sie eine Aktion verwenden, nicht den Speicher direkt aufrufen.