Javascript 在React中实现双向数据绑定的性能影响
新来者的一个常见问题是,为什么双向数据绑定不是内置功能,通常的回答包括对单向数据流的解释,以及出于性能原因,双向数据绑定并不总是可取的想法。这是我想更详细地理解的第二点 我目前正在为(来自Apollo的新客户端状态管理工具)开发表单库。除了使用apollo链接状态而不是redux作为状态管理器之外,该概念与redux表单非常相似。(请注意,表单状态与域实体的状态分开存储,尽管可以选择使用实体来填充表单的初始状态。) 当用户对表单进行更改时,库会立即通过Javascript 在React中实现双向数据绑定的性能影响,javascript,performance,reactjs,flux,Javascript,Performance,Reactjs,Flux,新来者的一个常见问题是,为什么双向数据绑定不是内置功能,通常的回答包括对单向数据流的解释,以及出于性能原因,双向数据绑定并不总是可取的想法。这是我想更详细地理解的第二点 我目前正在为(来自Apollo的新客户端状态管理工具)开发表单库。除了使用apollo链接状态而不是redux作为状态管理器之外,该概念与redux表单非常相似。(请注意,表单状态与域实体的状态分开存储,尽管可以选择使用实体来填充表单的初始状态。) 当用户对表单进行更改时,库会立即通过onChange处理程序更新存储。我曾考虑允
onChange
处理程序更新存储。我曾考虑允许单个字段选择退出该行为,以防程序员担心性能,但后来我开始怀疑这何时会成为真正的性能问题。无论发生什么情况,浏览器都将触发oninput
事件,因此我能想到的唯一性能考虑因素是存储是否随用户类型而更新。当然,执行一个变异比仅仅调用setState()
会有额外的开销,但这实际上只相当于两个额外的函数调用。假设我没有使用apollo,只是调用了一个直接更新全局存储的函数——那么性能考虑是什么呢
我的想法是,如果一个表单要支持在用户在一个字段中键入时立即更新表单状态,那么它也可以对所有字段进行更新。用户一次只能键入一个字段,我不认为某些字段有时会使页面更快(可能可以忽略不计),而其他字段有时会使页面更慢。此外,我的库允许用户使用他们想要的任何输入组件,因此,如果程序员只需要较少的状态更新,他们可以编写一个组件来消除React的onChange
事件或使用浏览器自己的change
或blur
事件的影响
我是不是遗漏了什么?我的库的用户在提交表单之前是否还有其他原因希望忽略特定字段的更改?或者更有用的选择是忽略对整个表单的更改(直到提交)
以下是我当前方法背后的基本概念的基本(大大简化)说明:
// defined in a globally-accessible module
const formState = {
// This somehow causes any dependent form components to re-render
// when state changes
update(formName, updatedState) {
...
}
}
export default formState
...
// UserForm.js:
export default class UserForm extends PureComponent {
componentDidMount() {
formState.userForm = {
firstName: '',
lastName: '',
}
}
handleChange(e) {
const { target } = e
formState.update('userForm', { [target.name]: target.value })
}
//...
render() {
const { userForm } = formState
return (
<form onSubmit={this.handleSubmit}>
<label for="name">Name</label>
<input id="name" type="text" onChange={this.handleChange} value={userForm.name} />
<label for="email">Email</label>
<input id="email" type="email" onChange={this.handleChange} value={userForm.email} />
</form>
)
}
}
//在全局可访问模块中定义
常量formState={
//这会以某种方式导致任何相关表单组件重新渲染
//当状态改变时
更新(formName,updatedState){
...
}
}
导出默认formState
...
//UserForm.js:
导出默认类UserForm扩展PureComponent{
componentDidMount(){
formState.userForm={
名字:'',
姓氏:“”,
}
}
手变(e){
常数{target}=e
update('userForm',{[target.name]:target.value})
}
//...
render(){
const{userForm}=formState
返回(
名称
电子邮件
)
}
}
最后,为了完整性,我应该提到,这其中还涉及一些API设计考虑因素。如果我没有提供选择退出自动双向绑定的选项,那么单个输入组件的设计可能会稍微简单一些。如果有人感兴趣,我可以发布详细信息。2路数据绑定含义 从问题的第一部分开始,react不使用双向数据绑定有两个主要原因: