在React docs页面Forms的示例中,ES6计算属性语法在一种用于设置name
属性状态的方法中使用。
handleInputChange(event) {
const target = event.target;
const value = target.type === 'checkbox' ? target.checked : target.value;
const name = target.name;
this.setState({
[name]: value
});
}
根据我对计算属性的工作方式的了解,似乎使用它的原因是可以更改target.name
-是这样吗?如果是这种情况,似乎在setState
中进行更改比更改name
变量的值更容易。
我是React的新手,正在努力了解如何在此示例中应用计算属性语法。任何帮助将不胜感激。
答案 0 :(得分:5)
为什么将ES6计算属性语法用于对象setState?
计算出的属性语法使您可以动态设置对象的键。
对于setState
,它允许您使用单个setState
处理状态的不同属性,因此可以在不同的输入上重用相同的事件处理函数。
所以代替:
class Reservation extends React.Component {
constructor(props) {
super(props);
this.state = {
isGoing: true,
numberOfGuests: 2
};
this.handleIsGoingChange = this.handleIsGoingChange.bind(this);
this.handleNumberOfGuestsChange = this.handleNumberOfGuestsChange.bind(this);
}
// a first handler, for isGoing
handleIsGoingChange(event) {
const target = event.target;
const value = target.checked;
this.setState({
isGoing: value
});
}
// a second handler, for numberOfGuests
handleNumberOfGuestsChange(event) {
const target = event.target;
const value = target.value;
this.setState({
numberOfGuests: value
});
}
render() {
return (
<form>
<label>
Is going:
<input
name="isGoing"
type="checkbox"
checked={this.state.isGoing}
onChange={this.handleIsGoingChange} />
</label>
<br />
<label>
Number of guests:
<input
name="numberOfGuests"
type="number"
value={this.state.numberOfGuests}
onChange={this.handleNumberOfGuestsChange} />
</label>
</form>
);
}
}
您可以这样缩短它:
class Reservation extends React.Component {
constructor(props) {
super(props);
this.state = {
isGoing: true,
numberOfGuests: 2
};
this.handleInputChange = this.handleInputChange.bind(this);
}
// a single handler, for isGoing and numberOfGuests
handleInputChange(event) {
const target = event.target;
const value = target.type === 'checkbox' ? target.checked : target.value;
const name = target.name;
this.setState({
[name]: value
});
}
render() {
return (
<form>
<label>
Is going:
<input
name="isGoing"
type="checkbox"
checked={this.state.isGoing}
onChange={this.handleInputChange} />
</label>
<br />
<label>
Number of guests:
<input
name="numberOfGuests"
type="number"
value={this.state.numberOfGuests}
onChange={this.handleInputChange} />
</label>
</form>
);
}
}
答案 1 :(得分:3)
当您将密钥用方括号括起来时,它将获得变量名作为密钥。
如果没有,则密钥为字符串。所以...
let name = 'id';
let obj = { //let obj = {
[name]:1 // id: 1
}; //};
答案 2 :(得分:1)
因为您不想设置“名称”属性,而是将名称存储在名称中的属性。
var a = db.A.FirstOrDefault(a => a.stampleProperty== stampleProperty);
var obj= new CustomObjectA
{
Id = a.AId,
sampleProperty= a.sampleProperty,
sampleProp= a.sampleProp,
B = a.B.Select(b => new CustomObjectB
{
BId = b.BId,
sampleProperty3 = b.sampleProperty3
//etc...
}).ToArray()
};
答案 3 :(得分:1)
如果您不使用计算属性语法,则函数将始终设置name
属性,而不是您想要的event.target.name
中的计算值。您的状态始终如下所示:
console.log(this.state);
// -> { name: 'some value' }
答案 4 :(得分:0)
也许通过编写不使用ES6语法的书,您将了解更多情况。
相同的代码如下(您可以在代码段中运行它并查看它)
我要说的一件事是使用let
而不是const
,这仅仅是因为用const
创建的变量只要它们“有效”就一直指向或绑定到相同的值。
因此,在此处使用const
可能不会使您选中和/或取消选中该框,或者使您增大/减小该数字。
我希望它可以帮助您了解更多信息。
谢谢
class Reservation extends React.Component {
constructor(props) {
super(props);
this.state = {
isGoing: true,
numberOfGuests: 2
};
this.handleInputChange = this.handleInputChange.bind(this);
}
handleInputChange(event) {
let value;
if(event.target.type==='checkbox'){
value = event.target.checked
}
else {
value = event.target.value
}
this.setState({
[event.target.name]: value
});
}
render() {
return (
<form>
<label>
Is going:
<input
name="isGoing"
type="checkbox"
checked={this.state.isGoing}
onChange={this.handleInputChange} />
</label>
<br />
<label>
Number of guests:
<input
name="numberOfGuests"
type="number"
value={this.state.numberOfGuests}
onChange={this.handleInputChange} />
</label>
</form>
);
}
}
ReactDOM.render(
<Reservation />,
document.getElementById('root')
);
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="root"></div>