Ответы пользователя по тегу React
  • Почему createStore не видит редюсер?

    Ну во первых у вас не так написан импорт:
    import { calendarReducer } from "./calendarReducer/calendarReducer";

    В вашем случаи надо так:
    import calendarReducer from "./calendarReducer/calendarReducer";

    А во вторых надо не так:
    window.devToolsExtension ? window.devToolsExtension : f => f

    а так:
    const enhancers = window.devToolsExtension ? window.devToolsExtension() : f => f;

    Собственно там консоль все вам расскажет.
    Ответ написан
    Комментировать
  • Есть ли смысл использовать Immutable вместе с React?

    Так и не цепляйтесь именно за Immutable.js, суть то в том, что данные должны быть неизменяемыми, а уж при помощи какой либы вы этого добьетесь зависит от вас, можете вообще просто Object.assign юзать (собственно object spread plugin этим и занимается) и тоже будете правы. Если проект большой, то я бы вам рекомендовал придерживаться парадигмы с Immutable данными, головной боли точно станет меньше. Насчет рендеринга само по себе это не какого прироста не даст, но благодаря тому, что вы получаете полный контроль над изменениями ваших объектов, вы можете грамотно использовать shouldComponentUpdate и вот тогда это может дать вам не хилый буст.
    Ответ написан
    1 комментарий
  • Reactjs плавный Render?

    Ну тут у Reacta есть то что вам нужно, а именно ReactCSSTransitionGroup. При помощи этого аддончика можно анимировать смену контента, ну и если постараться немного, то и переходы по страницам.
    Вот мой рабочий примерчик с использованием react-router:
    import React from 'react/addons'
    import Router, {Route, DefaultRoute, RouteHandler, Link} from 'react-router';
    import RouterContainer from './services/RouterContainer';
    
    const { CSSTransitionGroup } = React.addons;
    
    class PageOne extends React.Component {
        render() {
            return (
                <div className="Image">
                    <h1>Page 1</h1>
                    <p>Тут контентик для первой страницы!</p>
                </div>
            )
        }
    }
    
    class PageTwo extends React.Component {
        render() {
            return (
                <div className="Image">
                    <h1>Page 2</h1>
                    <p>Тут контентик для второй страницы</p>
                </div>
            )
        }
    }
    
    class App extends React.Component {
        render() {
            var key = RouterContainer.getRoute();
            return (
                <div>
                    <ul>
                        <li>
                            <Link to="/page1">Page 1</Link>
                        </li>
                        <li>
                            <Link to="/page2">Page 2</Link>
                        </li>
                    </ul>
                    <CSSTransitionGroup component="div" transitionName="example">
                        <RouteHandler key={key}/>
                    </CSSTransitionGroup>
                </div>
            );
        }
    }
    //Create router config
    var routes = (
        <Route handler={App} >
            <Route name="page1" handler={PageOne} />
            <Route name="page2" handler={PageTwo} />
        </Route>
    );
    var router = Router.create({routes});
    RouterContainer.set(router);
    
    (function (w, d, R) {
        router.run(function (Handler) {
            React.render(<Handler />, d.querySelector('#example'));
        });
    }(window, document, React));

    Ну и стили для перехода:
    .Image {
      position: absolute;
      height: 400px;
      width: 400px;
    }
    
    .example-enter {
      opacity: 0.01;
      transition: opacity .5s ease-in;
    }
    
    .example-enter.example-enter-active {
      opacity: 1;
    }
    
    .example-leave {
      opacity: 1;
      transition: opacity .5s ease-in;
    }
    
    .example-leave.example-leave-active {
      opacity: 0;
    }
    
    .link-active {
      color: #bbbbbb;
      text-decoration: none;
    }

    Ну и соответственно использование без react-router будет еще проще. Анимацию для переходов вы можете в принципе прописать любую. Вот демочка для иллюстрации работы.
    Ответ написан
    Комментировать
  • Как получить state из другого компонента в React.js?

    Если не придерживаться flux архитектуры то так:
    var Comp1 = React.createClass({
    //code
    render: function() {
        return (
            <div>
             <Comp2 data={this.state.data} />
            </div>
        );
      }
    });
    var Comp2 = React.createClass({
      render: function() {
        return (
            var fromOne = this.props.data;
            <div>
              {fromOne}
            </div>
        );
      }
    });

    А если придерживаться flux-са то вам нужен Dispatcher и Store. При получение данных с сервера вы передаете данные в хранилище при помощи Dispatcher, после этого хранилище говорит что данные изменились, а в компонентах вы ставите прослушку на изменение данных. И как только произошло изменение, вы берете свежие данные из хранилища и уже делаете с ними что хотите.
    Ответ написан
    4 комментария
  • Что такое "data rehydration"?

    Ну если вкратце, то dehydrating это всего лишь навсего сохранение состояния вашего приложения в какой-либо объект. Соответственно rehydration это перезапись состояния вашего приложения или восстановление состояния приложения по входным данным. Применительно ко Flux архитектуре этим занимаются Stor-ы и Dispatcher. Первые хранят состояния ваших компонентов, второй отслеживает изменения.
    Ответ написан
    1 комментарий
  • Почему не рендерится компонент внутри другого компонента React?

    Ну что же вы используете ES6, а названия классов с маленькой буквы пишите. Назовите свой второй класс BtnOrderAction и будет вам счастье.
    Ответ написан
    3 комментария
  • Reflux: как правильно использовать store?

    Можно и без stora, но это уже не flux. А в чем у вас проблем при использовании одного хранилища?. Помечайте каждый компонент при его инициализации, каким-нибудь идентификатором. Запоминайте его в самом компоненте и помечайте компонент в Store с тем же ключом, но да при каждом изменении вам придется передавать и этот ключ, чтобы идентифицировать в каком именно компоненте произошло изменение. На самом деле если у компонента узкая специализация и само приложение небольшое, то я бы забил на хранилище и обрабатывал все его изменения внутри компонента. Но тут как говорится выбирайте, к чему у вас душа больше лежит, если будете делать через Store, то у вас будет и flux - архитектура и доступ к состояниям всех компонентов postsBoard, но надо будет по боле написать. Если без Store, то писать меньше и проще.
    Ответ написан
    Комментировать
  • Как побороть синхронные запросы в диспетчере Flux?

    Вообще странно как они у вас могут пересекаться. Ну да ладно берете документацию, там довольно хорошо все написано, смысл такой, есть у вас Dispatcher.
    Создаете класс App.Dispatcher.js (все будет на ES6):
    import {Dispatcher} from 'flux';
    export default new Dispatcher();

    Есть у вас action-ны AppActions, в нем что-то вроде этого:
    import AppDispatcher from './AppDispatcher.js';
    export default {
        firstAction(){
            AppDispatcher.dispatch({
                actionType: 'FIRST__ACTION'
            });
        },
        secondAction(){
            AppDispatcher.dispatch({
                actionType: 'SECOND__ACTION'
            });
        }
    }

    Ну и хранилище конечно AppStore:
    import AppDispatcher from './AppDispatcher.js';
    export default class AppStore {
        constructor() {
             AppDispatcher.register(function (action) {
                 switch (action.actionType) {
                     case 'FIRST__ACTION':
                         //Первое действие
                         break;
                     case 'SECOND__ACTION':
                         //Второе действие
                         break;
                 }
             });
        }
    }

    Да вот собственно и все, не чего у вас тут пересекаться не будет. Ну и норм туториал тут.
    Ответ написан
    3 комментария
  • Как менять disabled у элемента в react.js?

    Ну собственно говоря вы делаете все нормально, вот убогий рабочий пример:
    HTML:
    <div class="container">
    </div>

    JS:
    var Test = React.createClass({
      getInitialState: function() {
        return {disabled: true};
      },
      clickHandlers: function() {
        this.setState({disabled: false});
      },
      render: function() {
        return (
          <div>
              <button disabled={this.state.disabled}>Тест</button>
              <button onClick={this.clickHandlers}>Сменить</button>
          </div>
        );
      }
    });
    React.renderComponent(Test({}), document.querySelector(".container"));

    А у вас у меня вызывают сомнения во эти строки:
    beforeSend: function() {
                    this.setState({
                        disabled: "disabled"
                    });
                },
                ....
                complete: function (){
                    this.setState({
                        disabled: "enable"
                    });
                }

    Сдается мне что this то у вас там представляет собой объект запроса и не имеет не чего общего с вашим контекстом исполнения. Надо как-то так:
    submitLogin: function() {
            var that = this;
            ....
            $.ajax({
                ....
                beforeSend: function() {
                    that.setState({
                        disabled: "disabled"
                    });
                },
                ....
                complete: function (){
                    that.setState({
                        disabled: "enable"
                    });
                },
                ....
            })
            ....
        }
    Ответ написан
    Комментировать
  • Что делаешь merge в react.js?

    Я думаю из примера вы все поймете:
    var obj = {a: 5, b: 3};
    var newObj = update(obj, {$merge: {b: 6, c: 7}}); // => {a: 5, b: 6, c: 7}

    Пример вырван из контекста, вот источник. То же в принципе делает merge и в underscore.js. Смысл в расширении одного объекта другим.
    Ответ написан
    1 комментарий