javascript - 如何在 Reactjs 上调用可重用组件时更改属性的值?
问题描述
我有一个带有表单的模式,我正在尝试渲染一个可以在任何地方使用不同输出的组件。
例如:
这是组件:
import { Select, SelectItem } from 'carbon-components-react';
import React from 'react';
import { translate } from 'react-i18next';
import PropTypes from 'prop-types';
import { uniqBy } from 'lodash';
import GetShipmentsAddresses from './containers/GetShipmentsAddresses';
const AddressesSelect = ({ t, handleAddresses, value }) => (
<GetShipmentsAddresses>
{({ data }) => {
const unique = uniqBy(data, 'originationAddress.description');
const renderAddresses = unique.map(addresses => (
<SelectItem
value={addresses.originationAddress.description}
key={addresses.id}
text={addresses.originationAddress.description}
/>
));
return (
<Select
id="select-3"
defaultValue="Shipped From"
labelText={t('shipments.shippedFrom')}
onChange={handleAddresses}
>
<SelectItem
disabled
hidden
value=""
text={t('shipments.selectLocation')}
/>
<SelectItem value="" text={t('shipments.allLocations')} />
{renderAddresses}
</Select>
);
}}
</GetShipmentsAddresses>
);
AddressesSelect.propTypes = {
t: PropTypes.func.isRequired,
handleAddresses: PropTypes.func.isRequired,
};
export default translate()(AddressesSelect);
我需要在这样的父组件上调用它:
const ParentComp = ({ VALUE }) => (
<AddressesSelect
handleAddresses={this.handleChange('shippedFrom')}
VALUE="originationAddress" // this is would be VALUE
title={t('shipments.shippedFrom')}
/>
<br />
<AddressesSelect
handleAddresses={this.handleChange('shippedTo')}
VALUE="destinationAddress" // this is would be VALUE
title={t('shipments.shippedFrom')}
/>
)
所以,唯一会从 call 到 other 的变化是,与其说addresses.originationAddress.description
它必须说addresses.destinationAddress.description
唯一改变的词是originationAddress
to destinationAddress
。
所以假设我想做这样的事情:
const AddressesSelect = ({ t, handleAddresses, VALUE }) => (
<GetShipmentsAddresses>
{({ data }) => {
const unique = uniqBy(data, 'VALUE.description');
const renderAddresses = unique.map(addresses => (
<SelectItem
value={addresses.VALUE.description}
key={addresses.id}
text={addresses.VALUE.description}
/>
));
return (
<Select
id="select-3"
defaultValue="Shipped From"
labelText={t('shipments.shippedFrom')}
onChange={handleAddresses}
>
<SelectItem
disabled
hidden
value=""
text={t('shipments.selectLocation')}
/>
<SelectItem value="" text={t('shipments.allLocations')} />
{renderAddresses}
</Select>
);
}}
</GetShipmentsAddresses>
);
对组件的调用VALUE
可能会更改为destinationAddress
或originationAddress
。
我怎样才能做到这一点?
解决方案
使用模板字符串
const ParentComp = ({ value }) => (
<AddressesSelect
handleAddresses={this.handleChange('shippedFrom')}
VALUE={`${value}Address`} // this is would be VALUE
title={t('shipments.shippedFrom')}
/>)
并在您的组件中将其用作
<SelectItem
value={addresses[value].description}
key={addresses.id}
text={addresses[value].description}
/>
就像点符号一样,您可以使用address['originatingAddress']在这里您可以将其替换为您的值变量
推荐阅读
- postgresql - 在 postgresql 中的时区之间转换
- php - 在 Woocommerce 客户电子邮件通知中自定义总计行
- javascript - 在 JSON 操作中出现 JavaScript 错误
- java - 从 Java 调用 JasperReports
- java - 有没有更好的方法从多个字符串数组中找到任何字符串
- javascript - 未捕获的类型错误:无法读取 null 的属性“删除”
- node.js - 从集合中获取具有唯一值的条目
- java - Maven:编译项目时无法解析包不存在
- python - 可以优雅地从外部终止的 Python 脚本
- laravel - Laravel 5 将数据从视图发送到控制器的最佳实践