很好奇接近这个的正确方法是:
var Hello = React.createClass({
getInitialState: function() {
return {total: 0, input1:0, input2:0};
},
render: function() {
return (
<div>{this.state.total}<br/>
<input type="text" value={this.state.input1} onChange={this.handleChange} />
<input type="text" value={this.state.input2} onChange={this.handleChange} />
</div>
);
},
handleChange: function(e){
this.setState({ ??? : e.target.value});
t = this.state.input1 + this.state.input2;
this.setState({total: t});
}
});
React.renderComponent(<Hello />, document.getElementById('content'));
显然你可以创建单独的handleChange函数来处理每个不同的输入,但这不是很好。类似地,你可以为单个输入创建一个组件,但我想知道是否有办法像这样做。
答案 0 :(得分:146)
我建议坚持使用input
元素上的name
等标准HTML属性来识别您的输入。此外,您不需要将“total”保持为状态中的单独值,因为它可以通过在您的州中添加其他值来组合:
var Hello = React.createClass({
getInitialState: function() {
return {input1: 0, input2: 0};
},
render: function() {
const total = this.state.input1 + this.state.input2;
return (
<div>{total}<br/>
<input type="text" value={this.state.input1} name="input1" onChange={this.handleChange} />
<input type="text" value={this.state.input2} name="input2" onChange={this.handleChange} />
</div>
);
},
handleChange: function(e) {
this.setState({[e.target.name]: e.target.value});
}
});
React.renderComponent(<Hello />, document.getElementById('content'));
答案 1 :(得分:106)
您可以使用.bind
方法预先构建handleChange
方法的参数。
它会是这样的:
var Hello = React.createClass({
getInitialState: function() {
return {input1:0,
input2:0};
},
render: function() {
var total = this.state.input1 + this.state.input2;
return (
<div>{total}<br/>
<input type="text" value={this.state.input1}
onChange={this.handleChange.bind(this, 'input1')} />
<input type="text" value={this.state.input2}
onChange={this.handleChange.bind(this, 'input2')} />
</div>
);
},
handleChange: function (name, e) {
var change = {};
change[name] = e.target.value;
this.setState(change);
}
});
React.renderComponent(<Hello />, document.getElementById('content'));
(我还在渲染时计算total
,因为这是建议的事情。)
答案 2 :(得分:37)
onChange
事件冒泡......所以你可以这样做:
// A sample form
render () {
<form onChange={setField}>
<input name="input1" />
<input name="input2" />
</form>
}
您的setField方法可能如下所示(假设您使用的是ES2015或更高版本:
setField (e) {
this.setState({[e.target.name]: e.target.value})
}
我在几个应用程序中使用类似的东西,这非常方便。
答案 3 :(得分:11)
valueLink/checkedLink
来自核心React的deprecated,因为它让一些用户感到困惑。如果您使用最新版本的React,此答案将无效。但如果你喜欢它,你可以通过创建自己的Input
组件
使用React的双向数据绑定助手可以更轻松地实现您想要实现的目标。
var Hello = React.createClass({
mixins: [React.addons.LinkedStateMixin],
getInitialState: function() {
return {input1: 0, input2: 0};
},
render: function() {
var total = this.state.input1 + this.state.input2;
return (
<div>{total}<br/>
<input type="text" valueLink={this.linkState('input1')} />;
<input type="text" valueLink={this.linkState('input2')} />;
</div>
);
}
});
React.renderComponent(<Hello />, document.getElementById('content'));
容易吗?
http://facebook.github.io/react/docs/two-way-binding-helpers.html
答案 4 :(得分:5)
你也可以这样做:
...
constructor() {
super();
this.state = { input1: 0, input2: 0 };
this.handleChange = this.handleChange.bind(this);
}
handleChange(input, value) {
this.setState({
[input]: value
})
}
render() {
const total = this.state.input1 + this.state.input2;
return (
<div>
{total}<br />
<input type="text" onChange={e => this.handleChange('input1', e.target.value)} />
<input type="text" onChange={e => this.handleChange('input2', e.target.value)} />
</div>
)
}
答案 5 :(得分:4)
您可以使用名为React
的特殊ref
属性,然后使用onChange
的{{1}}函数匹配React
事件中的真实DOM节点:
getDOMNode()
答案 6 :(得分:1)
如果有人在寻找功能组件示例,
import React, { useState } from "react";
export default function Exapmle() {
const [userState, setUserState] = useState({
firstName: "",
lastName: ""
})
const handleChange = (e)=>{
const value = e.target.value;
setUserState({
...userState,
[e.target.name]: value
});
}
return (
<form>
<label>
First name
<input type="text" name="firstName" value={userState.firstName}
onChange={handleChange}
/>
</label>
<label>
Last name
<input type="text" name="lastName" value={userState.lastName}
onChange={handleChange}
/>
</label>
</form>
);
}
答案 7 :(得分:0)
@Vigril Disgr4ce
对于多字段表单,使用React的主要功能是有意义的:组件。
在我的项目中,我创建TextField组件,它至少采用一个值prop,并负责处理输入文本字段的常见行为。这样,您无需担心在更新值状态时跟踪字段名称。
[...]
handleChange: function(event) {
this.setState({value: event.target.value});
},
render: function() {
var value = this.state.value;
return <input type="text" value={value} onChange={this.handleChange} />;
}
[...]
答案 8 :(得分:0)
您可以通过创建管理单个input
值的单独InputField
组件来跟踪每个孩子input
的价值。例如,InputField
可以是:
var InputField = React.createClass({
getInitialState: function () {
return({text: this.props.text})
},
onChangeHandler: function (event) {
this.setState({text: event.target.value})
},
render: function () {
return (<input onChange={this.onChangeHandler} value={this.state.text} />)
}
})
现在,可以在此input
组件的单独实例中跟踪每个InputField
的值,而无需在父状态中创建单独的值来监控每个子组件。
答案 9 :(得分:0)
我将为问题提供非常简单的解决方案。
假设我们有两个输入username
和password
,但我们希望我们的句柄既简单又通用,那么我们可以重复使用它,而不必编写样板代码。
I。我们的表格:
<form>
<input type="text" name = "username" onChange={this.onChange} value={this.state.username}/>
<input type="text" name = "password" onChange={this.onChange} value={this.state.password}/>
<br></br>
<button type="submit">Submit</button>
</form>
II。我们要保存username
和password
的构造函数,以便我们可以轻松访问它们:
constructor(props) {
super(props);
this.state = {
username: '',
password: ''
};
this.onSubmit = this.onSubmit.bind(this);
this.onChange = this.onChange.bind(this);
}
III。仅具有一个onChange
事件的有趣且“通用”的句柄基于此:
onChange(event) {
let inputName = event.target.name;
let value = event.target.value;
this.setState({[inputName]:value});
event.preventDefault();
}
让我解释一下:
1。当检测到更改时,称为onChange(event)
2。然后我们得到字段的名称参数及其值:
let inputName = event.target.name; ex: username
let value = event.target.value; ex: itsgosho
3。基于name参数,我们从构造函数中的状态获取值,并使用以下值对其进行更新:
this.state['username'] = 'itsgosho'
4。这里要注意的关键是字段名称必须与我们在状态下的参数匹配
希望我能以某种方式帮助某人:)
答案 10 :(得分:0)
您的状态键应与输入字段的名称相同。然后,您可以在handleEvent方法中执行此操作;
this.setState({
[event.target.name]: event.target.value
});
答案 11 :(得分:0)
状态对象
const [values, setValues] = useState({
email: "",
password: "",
});
改变状态的函数
const handleChange = name => event => {
setValues({ ...values, [name]: event.target.value });
};
使用“名称”更改输入时调用上述函数
<input
onChange={handleChange("email")}
value={email}
className="form-control"
type="email"
/>
答案 12 :(得分:-1)
您已经改进了 ssorallen 的答案。您不需要绑定函数,因为您可以在没有它的情况下访问输入。
var Hello = React.createClass({
render: function() {
var total = this.state.input1 + this.state.input2;
return (
<div>{total}<br/>
<input type="text"
value={this.state.input1}
id="input1"
onChange={this.handleChange} />
<input type="text"
value={this.state.input2}
id="input2"
onChange={this.handleChange} />
</div>
);
},
handleChange: function (name, value) {
var change = {};
change[name] = value;
this.setState(change);
}
});
React.renderComponent(<Hello />, document.getElementById('content'));