0

我有一系列交易所,一旦用户选择了一个交易所,我想同时使用交易所的名称和基本报价。

例如,如果用户选择下面的第一个选项,我想捕获"poloniex"以及 base key "USDC"

在此处输入图像描述

首先我尝试使用这个:

{exchanges.map((exchange, i) =>
  (<option key={i} value={exchange.exchange} base={exchange.quote}>
    {capFirst(exchange.exchange)} ({exchange.quote}) ${exchange.price_quote}
  </option>))}

但是我得到了base不存在的错误,但是我不应该能够向选项添加任何属性吗?如果它在 JSX 中,也许不是?也data没有工作。

输入'{孩子:字符串[]; 键:数字;值:字符串;基数:字符串;}' 不可分配给类型 'DetailedHTMLProps, HTMLOptionElement>'。'DetailedHTMLProps, HTMLOptionElement>'.ts(2322) 类型上不存在属性'base'

我尝试的另一种方法是获取所选选项的索引键,但是下面的代码会生成key = null.

下面target.value会给我它的价值,但我也需要基本报价。

@bind
handleExchangeSelect(event: React.FormEvent<HTMLSelectElement>) {
  const { exchanges } = this.props;
  const target = event.target as HTMLSelectElement;
  console.log('target', target);
  const exchange = target.value;
  const key = target.getAttribute('key');
  console.log('exchange', exchange);
  console.log('key', key);
  // if (key) {
  //   console.log(exchanges[Number(key)]);
  // }
  this.setState({
    exchange,
    // exchange_base: base ? base : ''
  });
}
4

2 回答 2

2

我希望有一种更明显,更清洁的方式,但我发现了这个并且它有效:

https://reactjs.org/docs/forms.html

笔记

您可以将数组传递给 value 属性,从而允许您在 select 标记中选择多个选项:

<select multiple={true} value={['B', 'C']}>

我的应用程序中的解决方案

选择选项

{exchanges.map((exchange, i) =>
  (<option key={i} value={[exchange.exchange, exchange.quote]}>
    {capFirst(exchange.exchange)} ({exchange.quote}) ${exchange.price_quote}
  </option>))}

选择处理程序

@bind
handleExchangeSelect(event: React.FormEvent<HTMLSelectElement>) {
  const target = event.target as HTMLSelectElement;
  const exchangeValues = target.value.split(',');
  const exchange = exchangeValues[0];
  const exchange_base = exchangeValues[1];
  console.log('exchange', exchange);
  console.log('exchange_base', exchange_base);
  this.setState({
    exchange,
    exchange_base
  });
}

这让我得到了我想要的:

{ 
  exchange: 'gdax',
  exchange_base: 'USD'
}
于 2019-02-28T19:19:22.887 回答
1

解决这个问题的反应方法是创建一个自己的选择组件,如下所示:

class ExchangeSelect extends Component {
    handleSelect = event => {
        const {exchanges, onSelect} = this.props;
        const selected = exchanges.find(exchange => exchange.exchange === event.target.value);
        onSelect(selected);
    };

    render() {
        const {exchanges} = this.props;

        return (
            <select onChange={this.handleSelect}>
                {exchanges.map(exchange => (
                    <option key={exchange.exchange} value={exchange.exchange}>
                        {exchange.exchange} ({exchange.quote}) ${exchange.price_quote}
                    </option>
                ))}
            </select>
        );
    }
}

作为exchanges交换对象的列表,您可以像这样使用它:

const exchanges = [
    {exchange: 'poloniex', quote: 'USDC', price_quote: '0.42'},
    {exchange: 'bitibu', quote: 'USDT', price_quote: '0.666'},
    {exchange: 'bittrex', quote: 'USDT', price_quote: '0.21'},
];

在渲染()中:

<ExchangeSelect 
    exchanges={exchanges} 
    onSelect={exchange => console.log(exchange.quote)} 
/>

现场示例:

编辑 2z23n1n26n

于 2019-02-28T19:50:56.460 回答