首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何处理对同构呈现形式的早期输入

如何处理对同构呈现形式的早期输入
EN

Stack Overflow用户
提问于 2015-07-05 05:49:33
回答 2查看 1.1K关注 0票数 9

我有一个React应用程序,它包括一个表单,它被呈现在服务器端,预先填充了用户正在进行的工作。问题是,如果用户在加载应用程序之前编辑表单中的值,那么应用程序就不知道这个更改。当用户保存时,服务器呈现的未更改的数据将被重新保存,用户的新数据将被删除,尽管它仍然显示在表单中。简而言之,在最初加载时,标记中的React值和输入值之间似乎存在着脱节。

我想我可以在每个输入上添加refs,并将它们的值复制到componentDidMount上的应用程序状态中,但是必须有一个更好的方法。还有人解决过这个问题吗?

更新

我现在认为,解决这个问题的最好方法是在创建校验和时考虑输入值。GH杂志:https://github.com/facebook/react/issues/4293

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-05 20:49:57

我想我可以在每个输入上添加refs,并将它们的值复制到componentDidMount上的应用程序状态中,但是必须有一个更好的方法。还有人解决过这个问题吗?

浏览器自动填充字段或通过刷新记住以前的值也会导致同样的问题--您的应用程序对数据的看法与用户的不同。

我过去的蛮力解决方案是从输入onSubmit中提取完整的表单状态,并在允许提交之前重新运行验证。

正如您所建议的那样,使用componentDidMount听起来更优雅,因为它避免了用户输入无效数据,并允许用户在收到警告之前提交数据。不过,您不需要向每个输入添加一个ref;只需将一个添加到<form>中,并使用它的集合来提取所有数据。

建议的解决办法:

  1. componentDidMount()中,从其.elements中提取表单的数据(为此目的,我从表单库中提取了获取表格数据 )
  2. 检查每个字段的当前值与您的应用程序的状态。
  3. 如果一个字段的当前值是不同的,那么将其视为通过事件到达的新用户输入--在状态中更新它并重新运行任何相关的验证例程。

然后从componentDidMount()开始,你的应用程序和用户将永远在同一个页面上(字面意思)。

票数 4
EN

Stack Overflow用户

发布于 2015-07-05 06:14:40

如果我正确地理解了你,这就是正在发生的事情:https://jsfiddle.net/9bnpL8db/1/

代码语言:javascript
运行
复制
var Form = React.createClass({
    render: function () {
        return <div>
            <input type="text" defaultValue={this.props.defaultValue}/>
        </div>;
    }
});

// Initial form render without server-side data
React.render(<Form/>, $('#container')[0]);

setTimeout(function () {
    // Simulate server-side render
    $('#container').html(
        // overwrites input
        React.renderToString(<Form defaultValue="server1"/>)
    );
}, 5000);

不应使用服务器端呈现来进行更新。相反,应该使用服务器端呈现来创建初始页面,在用户有机会进行更改之前填充输入。为了解决你的问题,我认为你有几个选择:

  1. 使用服务器端呈现来呈现初始页面,用保存的数据预先填充输入。使用此选项,用户将不会在没有保存数据的情况下查看该页。这消除了用户开始输入输入,然后由服务器覆盖该输入的问题。
  2. 使用客户端呈现来呈现页面,并使用GET请求获取预先填充的数据,如果用户尚未输入某些输入,则更新输入。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31227517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档