如果我创建这样的组件:
const MyInput = ({username})=>{
return (
<div>
<input type="text" value={username}/>
</div>
);
};
输入输入时不会发生任何事情,因为react需要调用setState()
来更新它。
所以我要做的是添加一个onChange方法来处理它:
handleOnchange(e){
e.preventDefault();
let name=e.target.value;
this.setState({username:name});
}
但是我认为必须手动处理每个onChange
太多样板了,这是保存价值的更好方法吗?可以使用ref
完成吗?
答案 0 :(得分:2)
是,您需要调用setState以便在输入上更新值。
请参阅此处以获取一个好例子:https://facebook.github.io/react/docs/forms.html
在这里复制:
getInitialState: function() {
return {value: 'Hello!'};
},
handleChange: function(event) {
this.setState({value: event.target.value});
},
render: function() {
return (
<input
type="text"
value={this.state.value}
onChange={this.handleChange}
/>
);
}
答案 1 :(得分:0)
此问题的解决方案在javascript和implemented by lodash中很常见。在尝试更新之前,请先看看使用debouncing等待用户停止输入文本。 Here is an analogy of how it works from someone more eloquent than me:
将其视为“将多个事件组合在一起”。想象一下,你走了 回家,进入电梯,门正在关闭......突然间你的 邻居出现在大厅里,试图跳上电梯。是 有礼貌!为他打开门:你正在为电梯辩护 出发。考虑到同样的情况可以再次发生 第三个人,等等......可能会推迟几个人的离职 分钟。
要做反应,你会导入lodash并将onChange
设置为_.debounce(function(), delay)
,其中function()在给定的延迟后将设置为State。
This demo很好地演示了debounce如何反应(只需打开控制台并在键入时观察)。
如果您想了解去抖功能的最佳做法,请阅读this SO post中的答案。
Ps:你也可以尝试限制,但我认为对你的特定用例更有利于去抖动。这个关于去抖的类比的帖子也有一个关于限制的帖子。要使用它,您可以在示例
中将_.debounce(function, int)
替换为_.throttle(function, int)
答案 2 :(得分:0)
您可以重视反应链接以实现双向数据绑定
class Something extends React.Component {
state = {
email: ''
}
emailValueLink = (value) => {
return {
value: this.state.email,
requestChange: this.handleEmailChange
};
}
handleEmailChange(newEmail) {
this.setState({email: newEmail});
}
render() {
<input type="email" valueLink={this.emailValueLink()} />
}
}
您可以将emailValuelink传递给要绑定的状态键
答案 3 :(得分:-1)
React就是将代码拆分为组件。因此,为了防止重新输入此样板代码,您可以创建一个组件并将其重用于所有表单元素。 或者,就像其他人所说的那样,你可以采取别人的形式或数据绑定组件并重用它们。