使用字符串引用 ReactJS 对象 属性
Referencing a ReactJS object property using a string
我正在尝试在 React 组件上使用字符串引用 JS 对象 属性,以便我可以删除重复的条件语句。
这是我当前的渲染函数:
render() {
const { USD, GBP, EUR } = this.props.bpi;
const { currency } = this.state;
console.log(currency);
let list = '';
if (this.state.currency === currency) {
list = (
<li className='list-group-item'>
Bitcoin rate for {USD.description}:{' '}
<span className='badge badge-primary'>{USD.code}</span>{' '}
<strong>{USD.rate}</strong>
</li>
);
} else if (this.state.currency === 'GBP') {
list = (
<li className='list-group-item'>
Bitcoin rate for {GBP.description}:{' '}
<span className='badge badge-primary'>{GBP.code}</span>{' '}
<strong>{GBP.rate}</strong>
</li>
);
} else if (this.state.currency === 'EUR') {
list = (
<li className='list-group-item'>
Bitcoin rate for {EUR.description}:{' '}
<span className='badge badge-primary'>{EUR.code}</span>{' '}
<strong>{EUR.rate}</strong>
</li>
);
}
return (
<div>
<select
onChange={(e) => this.setState({ currency: e.target.value })}
className='form-control'
>
<option value='USD'>USD</option>
<option value='GBP'>GBP</option>
<option value='EUR'>EUR</option>
</select>
<br />
<ul className='list-group'>{list}</ul>
</div>
);
}
请注意,在我上面的代码中,我重复列表 3 次以找到设置正确的对象 属性。
假设我有这个“货币”对象:
const currency = {
USD: {
description: "This is USD",
code: "USD",
rate: "5.6",
},
GBP: {
description: "This is GBP",
code: "GBP",
rate: "6",
},
EUR: {
description: "This is EUR",
code: "EUR",
rate: "8",
}
}
如何将我的货币状态中的字符串设置为对象的 属性 值,以便我可以只声明一个列表而无需重复条件?我要实现的是这部分代码:
if (this.state.currency === currency) {
list = (
<li className='list-group-item'>
Bitcoin rate for {USD.description}:{' '}
<span className='badge badge-primary'>{USD.code}</span>{' '}
<strong>{USD.rate}</strong>
</li>
);
} else if (this.state.currency === 'GBP') {
list = (
<li className='list-group-item'>
Bitcoin rate for {GBP.description}:{' '}
<span className='badge badge-primary'>{GBP.code}</span>{' '}
<strong>{GBP.rate}</strong>
</li>
);
} else if (this.state.currency === 'EUR') {
list = (
<li className='list-group-item'>
Bitcoin rate for {EUR.description}:{' '}
<span className='badge badge-primary'>{EUR.code}</span>{' '}
<strong>{EUR.rate}</strong>
</li>
);
}
然后把它转换成这样(也许我真的不知道):
list = (
<li className='list-group-item'>
Bitcoin rate for {currency.description}:{' '}
<span className='badge badge-primary'>{currency.code}</span>{' '}
<strong>{currency.rate}</strong>
</li>
);
感谢@David784 实现了单对象调用。这是我最终的渲染方法:
render() {
const CUR = this.props.bpi[this.state.currency];
let list = (
<li className='list-group-item'>
Bitcoin rate for {CUR.description}:{' '}
<span className='badge badge-primary'>{CUR.code}</span>{' '}
<strong>{CUR.rate}</strong>
</li>
);
return (
<div>
<select
onChange={(e) => this.setState({ currency: e.target.value })}
className='form-control'
>
<option value='USD'>USD</option>
<option value='GBP'>GBP</option>
<option value='EUR'>EUR</option>
</select>
<br />
<ul className='list-group'>{list}</ul>
</div>
);
}
以此为重点
const CUR = this.props.bpi[this.state.currency];
let list = (
<li className='list-group-item'>
Bitcoin rate for {CUR.description}:{' '}
<span className='badge badge-primary'>{CUR.code}</span>{' '}
<strong>{CUR.rate}</strong>
</li>
);
我正在尝试在 React 组件上使用字符串引用 JS 对象 属性,以便我可以删除重复的条件语句。 这是我当前的渲染函数:
render() {
const { USD, GBP, EUR } = this.props.bpi;
const { currency } = this.state;
console.log(currency);
let list = '';
if (this.state.currency === currency) {
list = (
<li className='list-group-item'>
Bitcoin rate for {USD.description}:{' '}
<span className='badge badge-primary'>{USD.code}</span>{' '}
<strong>{USD.rate}</strong>
</li>
);
} else if (this.state.currency === 'GBP') {
list = (
<li className='list-group-item'>
Bitcoin rate for {GBP.description}:{' '}
<span className='badge badge-primary'>{GBP.code}</span>{' '}
<strong>{GBP.rate}</strong>
</li>
);
} else if (this.state.currency === 'EUR') {
list = (
<li className='list-group-item'>
Bitcoin rate for {EUR.description}:{' '}
<span className='badge badge-primary'>{EUR.code}</span>{' '}
<strong>{EUR.rate}</strong>
</li>
);
}
return (
<div>
<select
onChange={(e) => this.setState({ currency: e.target.value })}
className='form-control'
>
<option value='USD'>USD</option>
<option value='GBP'>GBP</option>
<option value='EUR'>EUR</option>
</select>
<br />
<ul className='list-group'>{list}</ul>
</div>
);
}
请注意,在我上面的代码中,我重复列表 3 次以找到设置正确的对象 属性。 假设我有这个“货币”对象:
const currency = {
USD: {
description: "This is USD",
code: "USD",
rate: "5.6",
},
GBP: {
description: "This is GBP",
code: "GBP",
rate: "6",
},
EUR: {
description: "This is EUR",
code: "EUR",
rate: "8",
}
}
如何将我的货币状态中的字符串设置为对象的 属性 值,以便我可以只声明一个列表而无需重复条件?我要实现的是这部分代码:
if (this.state.currency === currency) {
list = (
<li className='list-group-item'>
Bitcoin rate for {USD.description}:{' '}
<span className='badge badge-primary'>{USD.code}</span>{' '}
<strong>{USD.rate}</strong>
</li>
);
} else if (this.state.currency === 'GBP') {
list = (
<li className='list-group-item'>
Bitcoin rate for {GBP.description}:{' '}
<span className='badge badge-primary'>{GBP.code}</span>{' '}
<strong>{GBP.rate}</strong>
</li>
);
} else if (this.state.currency === 'EUR') {
list = (
<li className='list-group-item'>
Bitcoin rate for {EUR.description}:{' '}
<span className='badge badge-primary'>{EUR.code}</span>{' '}
<strong>{EUR.rate}</strong>
</li>
);
}
然后把它转换成这样(也许我真的不知道):
list = (
<li className='list-group-item'>
Bitcoin rate for {currency.description}:{' '}
<span className='badge badge-primary'>{currency.code}</span>{' '}
<strong>{currency.rate}</strong>
</li>
);
感谢@David784 实现了单对象调用。这是我最终的渲染方法:
render() {
const CUR = this.props.bpi[this.state.currency];
let list = (
<li className='list-group-item'>
Bitcoin rate for {CUR.description}:{' '}
<span className='badge badge-primary'>{CUR.code}</span>{' '}
<strong>{CUR.rate}</strong>
</li>
);
return (
<div>
<select
onChange={(e) => this.setState({ currency: e.target.value })}
className='form-control'
>
<option value='USD'>USD</option>
<option value='GBP'>GBP</option>
<option value='EUR'>EUR</option>
</select>
<br />
<ul className='list-group'>{list}</ul>
</div>
);
}
以此为重点
const CUR = this.props.bpi[this.state.currency];
let list = (
<li className='list-group-item'>
Bitcoin rate for {CUR.description}:{' '}
<span className='badge badge-primary'>{CUR.code}</span>{' '}
<strong>{CUR.rate}</strong>
</li>
);