【问题标题】:Update application state from child in React + Flux在 React + Flux 中从子级更新应用程序状态
【发布时间】:2015-03-01 21:40:48
【问题描述】:

更新 原来我的整个方法都是错误的。正如公认的答案所暗示的,一个很好的起点是使用 React + Flux 构建并托管在 GitHub 上的 TodoMVC 应用程序。


我正在构建一个非常小的 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 here,我的目标是用警报字符串替换 [username]。

【问题讨论】:

  • Flux 在这里绝对可以为您提供帮助。不过,看着@您的代码,您似乎没有尝试过。您是否尝试过为用户对象实现存储?

标签: javascript reactjs reactjs-flux


【解决方案1】:

很抱歉,我还没有在您的代码中看到任何 Flux 的架构 :) 对于高级实现解释,假设您拥有 Flux 的所有 3 个基本结构,即 actiondispatcherstore .

LoginForm组件中的_onSubmit中,应该触发action进行登录,然后事件会经过dispatcher传递给store

store开始,它会执行登录(这里你保存[username]的信息),然后触发一个事件(例如change)。此事件将被componentDidMount 中的Content 组件注册和监听。聆听change 事件后,您应该可以从商店中获取username 信息。这是通量的good example

【讨论】:

  • 所以我总是应该通过操作 -> 调度程序 -> 存储流程,即使我只需要保存数据而不用它做任何事情(还)?也许我混淆了 React 和 Flux 的概念,在 Flux 中,拥有一个(或几个)有状态组件仍然是一个好习惯,或者我应该将所有东西都保存在 store 中,然后传递 props?
  • 这是值得商榷的,flux 只是一个架构/概念,它声称当网页有很多事件在这里和那里触发并且很多组件共享相同的时候很有帮助数据,store 将是保存这些数据的最佳位置。就像你说的,你可以冒泡层次结构来获取用户名,但这会很丑:)
  • 我复制了 TodoMVC 示例的结构和架构(如果你愿意,可以看到结果here),但我觉得我必须编写大量代码才能完成这样一个简单的行为。可能很多代码只是为以后更简单的工作做准备,但仍然如此。也许 Flux 不适合真正简单的应用程序,它的用处随着应用程序的大小而增长......
  • 是的,当我开始使用助焊剂时,我也有同样的感觉。但是当应用程序变大时,你会有不同的感觉,尤其是当不同的组件想要在一个事件中获取相同的数据时:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多