我有一个React应用程序,它包括一个表单,它被呈现在服务器端,预先填充了用户正在进行的工作。问题是,如果用户在加载应用程序之前编辑表单中的值,那么应用程序就不知道这个更改。当用户保存时,服务器呈现的未更改的数据将被重新保存,用户的新数据将被删除,尽管它仍然显示在表单中。简而言之,在最初加载时,标记中的React值和输入值之间似乎存在着脱节。
我想我可以在每个输入上添加refs,并将它们的值复制到componentDidMount上的应用程序状态中,但是必须有一个更好的方法。还有人解决过这个问题吗?
更新
我现在认为,解决这个问题的最好方法是在创建校验和时考虑输入值。GH杂志:https://github.com/facebook/react/issues/4293
发布于 2015-07-05 20:49:57
我想我可以在每个输入上添加refs,并将它们的值复制到componentDidMount上的应用程序状态中,但是必须有一个更好的方法。还有人解决过这个问题吗?
浏览器自动填充字段或通过刷新记住以前的值也会导致同样的问题--您的应用程序对数据的看法与用户的不同。
我过去的蛮力解决方案是从输入onSubmit中提取完整的表单状态,并在允许提交之前重新运行验证。
正如您所建议的那样,使用componentDidMount听起来更优雅,因为它避免了用户输入无效数据,并允许用户在收到警告之前提交数据。不过,您不需要向每个输入添加一个ref;只需将一个添加到<form>中,并使用它的集合来提取所有数据。
建议的解决办法:
componentDidMount()中,从其.elements中提取表单的数据(为此目的,我从表单库中提取了获取表格数据 )然后从componentDidMount()开始,你的应用程序和用户将永远在同一个页面上(字面意思)。
发布于 2015-07-05 06:14:40
如果我正确地理解了你,这就是正在发生的事情:https://jsfiddle.net/9bnpL8db/1/
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);不应使用服务器端呈现来进行更新。相反,应该使用服务器端呈现来创建初始页面,在用户有机会进行更改之前填充输入。为了解决你的问题,我认为你有几个选择:
https://stackoverflow.com/questions/31227517
复制相似问题