Reflux — несколько действий в одном представлении.

Я новичок в использовании reactjs и reflux и понятия не имею, как реализовать следующую ситуацию:

У меня есть представление с некоторыми вкладками, на каждой вкладке будут разные данные, поступающие из API. Пока что я сделал код ниже:

Мой компонент:

import React from 'react';
import Reflux from 'reflux';
import SocialStore from '../stores/socialStore';
import Card from './shared/card.js'


var Social = React.createClass({
  mixins: [Reflux.connect(SocialStore, 'socialstore')],

  render: function() {
    if(this.state.socialstore){
      var tempSocialStore = this.state.socialstore
    }else{
      var tempSocialStore = [];
    }

    return <div className="android-be-together-section">
        <div className="mdl-layout mdl-js-layout mdl-layout--fixed-header">
          <header className="mdl-layout__header">
            <div className="mdl-layout__header-row">
              <span className="mdl-layout-title">Portfolio</span>
            </div>
            <div className="mdl-layout__tab-bar mdl-js-ripple-effect">
              <a href="#scroll-tab-1" className="mdl-layout__tab is-active">Stackoverflow</a>
              <a href="#scroll-tab-2" className="mdl-layout__tab">GitHub</a>
              <a href="#scroll-tab-3" className="mdl-layout__tab">Twitter</a>
              <a href="#scroll-tab-4" className="mdl-layout__tab">Instagram</a>
            </div>
          </header>
          <main className="mdl-layout__content">
            <section className="mdl-layout__tab-panel is-active" id="scroll-tab-1">
              <div className="page-content">
                <div className="content">
                  {
                    tempSocialStore.map(function (item){
                      return  <Card title={item.title_description} description={item.summary_description} btnTitle="View" link={item.id_description} />
                    })
                  }
                </div>
              </div>
            </section>
            <section className="mdl-layout__tab-panel" id="scroll-tab-2">
              <div className="page-content">content 2</div>
            </section>
            <section className="mdl-layout__tab-panel" id="scroll-tab-3">
              <div className="page-content">content 3</div>
            </section>
            <section className="mdl-layout__tab-panel" id="scroll-tab-4">
              <div className="page-content">content 4</div>
            </section>
          </main>
        </div>
    </div>
  }
});

export default Social;

Действия:

import Reflux from 'reflux';

let SocialActions = Reflux.createActions([
  'getStackoverflowFeed',
  'getTwitter',
  'getGithub',
  'getInstagram'
]);

export default SocialActions;

Хранить:

import Reflux from 'reflux';
import $ from 'jquery';
import SocialActions from '../actions/SocialActions';

var SocialStore = Reflux.createStore({
  listenables: [SocialActions],
  stackoverflowList: [],
  twitterList: [],
  instagramList: [],
  githubList: [],
  sourceUrlStackoverflow: 'url-1',
  sourceUrlTwitter: 'url-2',
  sourceUrlInstagram: 'url-3',
  sourceUrlGithub: 'url-4',

  init: function(){
      this.getStackoverflowFeed(); //First Tab
  },

  getTwitter: function(){
    $.ajax({
          url: this.sourceUrlTwitter,
          type: 'GET',
          cache: false,
          context: this,
          success: function(data) {
            this.twitterList = data.results;
            this.trigger(this.twitterList);
          },
          error: function(){
            console.log('There was an error while your request');
          }
      });
  },

  getInstagram: function(){
    $.ajax({
          url: this.sourceUrlInstagram,
          type: 'GET',
          cache: false,
          context: this,
          success: function(data) {
            this.instagramList = data.results;
            this.trigger(this.instagramList);
          },
          error: function(){
            console.log('There was an error while your request');
          }
      });
  },

  getGithub: function(){
    $.ajax({
          url: this.sourceUrlGithub,
          type: 'GET',
          cache: false,
          context: this,
          success: function(data) {
            this.githubList = data.results;
            this.trigger(this.githubList);
          },
          error: function(){
            console.log('There was an error while your request');
          }
      });
  },

  getStackoverflowFeed: function(){
    $.ajax({
          url: this.sourceUrlStackoverflow,
          type: 'GET',
          cache: false,
          context: this,
          success: function(data) {
            this.stackoverflowList = data.results; //TODO: Remove comments from the list.
            this.trigger(this.stackoverflowList);
          },
          error: function(){
            console.log('There was an error while your request');
          }
      });
  }
});

export default SocialStore;

Итак, при первом входе работает первая вкладка, потому что я создал ее в init, но я не знаю, как установить state на каждой вкладке, когда пользователь нажимает на них и заполняет содержимое.

Любая идея, как это сделать?

Спасибо!!


person gon250    schedule 18.10.2015    source источник
comment
Есть ли у вас дальнейшие проблемы двигаться дальше? Если ваша проблема решена, вы должны отметить ответ, который помог решить проблему, как принятый. Это помогает другим людям, у которых есть тот же вопрос. Удачного кодирования :)   -  person Ling Zhong    schedule 09.11.2015


Ответы (1)


Несколько вещей, которые вы можете сделать здесь, чтобы лучше использовать шаблон рефлюкса:

  • SocialStore должен отвечать за хранение state той вкладки, которая выбрана в данный момент, а компонент Social должен отображать относительно этой state.
  • У вас должен быть прослушиватель событий для каждого выбора вкладки или изменения выбора, то есть onSelectionChange. onSelectionChange должен сработать и вызвать соответствующий Action, который будет прослушиваться SocialStore и изменять state той вкладки, которая выбрана в данный момент.
  • Затем ваш компонент Social прослушивает SocialStore изменение и обновляет состояние своего компонента, которое render() запускается снова, и ваше представление правильно отражает то, что выбрано.
  • Глядя на то, насколько похожи все социальные Action и Store и как они реализованы. Я настоятельно рекомендую вам объединить все ваши Actions в один, но принять параметр, указывающий, какая вкладка выбрана. То же самое касается обработки функции get{Social} в файле Store. (Этот шаг необязателен, но приводит к более чистому и удобному в сопровождении коду)
person Ling Zhong    schedule 18.10.2015