Обновить состояние приложения от дочернего элемента в React + Flux

ОБНОВЛЕНИЕ Оказалось, что весь мой подход был неправильным. Как следует из принятого ответа, хорошей отправной точкой является TodoMVC. приложение, созданное с помощью React + Flux и размещенное на GitHub.


Я создаю очень маленькое приложение React + Flux для учебных целей. На данный момент он состоит только из формы входа и содержимого (которое на самом деле просто показывает имя пользователя). Я планирую, чтобы компонент приложения был единственным компонентом с состоянием в моем приложении, который будет отправлять свое состояние дочерним элементам в качестве реквизита. Но я не могу понять, как лучше всего обновлять состояние приложения от дочернего элемента (в моем случае форма ввода). Я думаю, что, возможно, смогу поднять его по иерархии, но это действительно кажется плохой практикой. Кроме того, должен ли я сохранять зарегистрированное имя пользователя в магазинах?

Вот основной пример того, что я имею в виду:

var LoginForm = React.createClass({
    _onSubmit : function(e) {
        e.preventDefault();

        var username = this.refs.username.getDOMNode().value.trim();

        if(!username) return;

        alert(username);

        this.refs.username.getDOMNode().value = "";

        return
    },

    render : function() {
        return (
            <div>
                <form onSubmit={this._onSubmit}>
                    <input
                        type="text"
                        placeholder="Insert username"
                        ref="username"
                    />
                    <button type="submit">Login</button>
                </form>
            </div>
        );
    }
});

var Header = React.createClass({
    render : function() {
        return (
            <div className="header">
                <LoginForm />
            </div>
        );
    }
});

var Content = React.createClass({
    render : function() {
        return (
            <div className="content">Welcome, [username]</div>
        );
    }
});

var MyApp = React.createClass({
    render : function() {
        return (
            <div>
                <Header />
                <Content />
            </div>
        );
    }
});

React.renderComponent(
    <MyApp />,
    document.body
);

Я настроил JSFiddle здесь с этим примером, моя цель — заменить [имя пользователя] на предупреждающая строка.


person goffreder    schedule 04.01.2015    source источник
comment
Flux определенно может помочь вам здесь. Однако, глядя на ваш код, не похоже, что вы сделали это. Вы пытались реализовать хранилище для пользовательского объекта?   -  person imjared    schedule 04.01.2015


Ответы (1)


извините, но я еще не видел никакой архитектуры потока в вашем коде :) для объяснения реализации высокого уровня, предполагая, что у вас есть все 3 основные структуры потока, а именно action, dispatcher и store.

в компоненте _onSubmit в LoginForm вы должны инициировать action для выполнения входа в систему, а затем событие пройдет через dispatcher и перейдет к store.

из store он выполнит вход (и здесь вы сохраните информацию [username]), а затем вызовет событие (например, change). Это событие будет зарегистрировано и прослушиваться компонентом Content в файле componentDidMount. После прослушивания события change вы сможете получить информацию username из магазина. Это хороший пример для потока

person ChinKang    schedule 04.01.2015
comment
Так что я ВСЕГДА должен пройти действие -> диспетчер -> поток хранения, даже если мне нужно только сохранить данные, ничего с ними не делая (пока)? Может быть, я смешиваю понятия React и Flux, во Flux по-прежнему рекомендуется иметь один (или несколько) компонентов с состоянием, или я должен просто хранить все в магазине, а затем передавать реквизиты? - person goffreder; 04.01.2015
comment
хорошо, это спорно, поток - это просто архитектура/концепция, он претендует на то, чтобы быть полезным, когда на веб-страницах происходит множество событий, запускаемых то тут, то там, и когда множество компонентов совместно используют одни и те же данные, store будет лучшим местом. чтобы сохранить эти данные. как вы сказали, вы можете поднять иерархию, чтобы получить имя пользователя, но это будет некрасиво :) - person ChinKang; 04.01.2015
comment
Я воспроизвел структуру и архитектуру примера TodoMVC (если хотите, можете посмотреть результат здесь), но я чувствую, что мне пришлось написать МНОГО кода, чтобы реализовать такое простое поведение. Вероятно, большая часть этого кода — просто подготовка к более простой работе позже, но все же. Возможно, Flux не подходит для действительно простых приложений, и его полезность растет вместе с размером приложения... - person goffreder; 05.01.2015
comment
Да, у меня такое же чувство, когда я начал использовать флюс. Но когда приложение становится большим, вы будете чувствовать себя по-другому, особенно когда разные компоненты хотят получать одни и те же данные по событию :) - person ChinKang; 05.01.2015