【发布时间】:2020-01-10 13:50:33
【问题描述】:
当焦点在输入框中时,按回车键提交表单。在提交时,错误会导致将错误插入到状态中,从而导致重新渲染并创建一个新元素来显示错误。
{error && <div>{error}</div>}
这会重新渲染整个不必要的组件。
肯定 (p)react 应该能够检测到只有新的错误元素被插入,而 DOM 的其余部分可以保持不变?
这样做的结果是我失去了输入的焦点,而且条纹 iframe 被重新安装。我怎样才能防止这种情况发生
DEMO
export default class App extends Component {
state = { val: "Sample input", error: null };
onSubmit = e => {
e.preventDefault();
this.setState({ error: "Some error" });
};
render(props, { val, error }) {
return (
<div>
<h1>Example</h1>
<form onSubmit={this.onSubmit}>
{error && <div>{error}</div>}
<div class="list">
<input
value={val}
onChange={e => this.setState({ val: e.target.value })}
/>
<button type="submit">Submit</button>
</div>
</form>
</div>
);
}
}
⭐️更新
问题是how react reconciles children。
解决方案 1 我可以通过向条件组件添加 key 属性来避免重新渲染整个组件并保持焦点。
{error && <div key='formError'>{error}</div>}
解决方案 2 或者,我可以将条件错误移到输入下方
<div class="list">
<input
value={val}
onChange={e => this.setState({ val: e.target.value })}
/>
<button type="submit">Submit</button>
</div>
{error && <div>{error}</div>}
解决方案3或者使用一个类来隐藏错误
<div className={error ? 'error' : 'hide'}>{error}</div>
【问题讨论】:
-
你也没有从一开始就专注。你需要使用 refs 来做到这一点。