Controlled form components with async data
还没有人认领这个 Issue。
- 主要语言
- JavaScript
- 星标
- 11.8k
- 派生
- 7.9k
- 平均合并
- 1 天 11 小时
- 30 天内合并 PR
- 11
描述
This seems like a pretty common scenario when implementing forms with React+Redux but neither documentation nor any of the articles/answers online seem to provide full implementation/recommendation.
Here's the scenario
- Data is loaded initially and passed to my
<Form />component.
class Form extends React.Component {
constructor(props) {
this.state = { nameField: props.name };
}
...
}
- Initial data is rendered on the screen and state is used to track user input, making this a fully controlled component.
render() {
return(
<form>
<input value={this.state.nameField} onChange={e => this.setState({ nameField: e.target.value })} />
</form>
);
}
- Data is then saved to the server asynchronously (here I'm using Redux but the same thing can be achieved with
fetch, etc.):
handleSubmit(e) {
e.preventDefault();
const { dispatch } = this.props;
dispatch(actions.saveData(...this.state);
}
- Reducers handle successful data save and the new state is saved. This data is then once again passed to my
<Form />component as props because the redux state is my single source of truth.
I now should update my component's state to match the application state (in case there were some external changes done on the server or parent component). Since in this case "fresh" props should always overwrite the state, one would normally use componentWillReceiveProps to simply set the new state but that method is now deprecated. The other two methods available - componentDidUpdate and getDerivedStateFromProps - could work BUT there needs to be a deep comparison of new props vs old props done in order to determine if the change is due to "fresh" props or just the internal state update. This can get very expensive if my form has 30 fields because both of these methods fire on each re-render.
I am trying to figure out the best practice in this scenario - should I delegate user input changes to Redux and avoid using component's state altogether? Or the only way now to make sure that the state stays in sync with props is to do a deep comparison of new pros vs old props on each re-render? Or is there another approach I'm not thinking of that works better?
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
该 issue 未指定任何 repository 文件、测试或入口点。首先明确 react.dev 是否应记录使用异步加载数据的受控表单,并定义预期的指导内容;完成标准是提供能够回答所述 React 和 Redux 场景的文档。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- javascript, react
- 领域
- documentation
- Issue 类型
- 文档
- 难度
- 5/5
- 预计耗时
- 一周以上
- 活跃度
- 停滞
- 描述清晰度
- 需要澄清
- 新手友好度
- 25/100