简体   繁体   English

React 基于条件数组渲染多个数据

[英]React render multiple data based on conditional array

Array大批

let shippingList = [
{ 'courierName': 'a', 'minWeight': 0.1, 'maxWeight': 5, 'shippingRate': 5.5 },
{ 'courierName': 'b', 'minWeight': 0.1, 'maxWeight': 5, 'shippingRate': 5.0 },
{ 'courierName': 'c', 'minWeight': 0.1, 'maxWeight': 5, 'shippingRate': 4.9 },
{ 'courierName': 'd', 'minWeight': 0.1, 'maxWeight': 5, 'shippingRate': 6.0 },
{ 'courierName': 'a', 'minWeight': 5.0, 'maxWeight': 10.0, 'shippingRate': 7.5 },
{ 'courierName': 'b', 'minWeight': 5.0, 'maxWeight': 10.0, 'shippingRate': 8.5 },
{ 'courierName': 'c', 'minWeight': 5.0, 'maxWeight': 10.0, 'shippingRate': 9.5 },
{ 'courierName': 'd', 'minWeight': 5.0, 'maxWeight': 10.0, 'shippingRate': 10.5 },
]

If input number of weight based on max weight then output shipping rate.如果根据最大重量输入重量数量,则 output 运费。 Example:例子:

  ...constructor(props) {
    super(props);
    this.state = { weight: '' };
  }

  myChangeHandler = (event) => {
    this.setState({weight: event.target.value});
  }

      <form>
      <h1>courierA {this._renderShippingFees}</h1>
      <h1>courierB {this._renderShippingFees}</h1>
      <h1>courierC {this._renderShippingFees}</h1>
      <h1>courierD {this._renderShippingFees}</h1>

      <p>Weight:</p>
      <input
        type='text'
        onChange={this.myChangeHandler}
      />
      </form>

How to output multiple shipping rates in real time based on input weight without create so many states like this如何根据输入重量实时 output 多个运费而不创建如此多的状态

this.setState({ courierA,B,C... })

Initial method:初始方法:

    _renderShippingFees() {
        let weight = this.state.weight

        if (weight <= 5) {
        return (
        <span>$ 5.04</span>
        )
        } else if (weight <= 20) {
        return (
        <span>$ 10.50</span>
        )
        } else if (weight > 30) {
        return (
           <span>$ 20.50</span>
        )
      }

No need to declare multiple state variables , the current code is good enough.无需声明多个state 变量,目前的代码已经足够好了。

Try filtering the data from shippingList similar to below尝试从shippingList中过滤数据,如下所示

...

_renderShippingFees(courierName) {
  let shippingRate = 0;
  const { weight } = this.state;
  const inputWeight = isNaN(weight) ? 0 : weight;
  // Filter data from shippingList
  const itemList = shippingList.filter(item => item.courierName === courierName);

  switch (true) {
    case (inputWeight <= 5):
      shippingRate = itemList.find(item => item.maxWeight <= 5).shippingRate;
      break;
    case (inputWeight <= 20):
      shippingRate = itemList.find(item => item.maxWeight <= 20).shippingRate;
      break;
    ...
  }

  return <span>$ {shippingRate}</span>;
}

...
// Call the _renderShippingFees as below in render method
<form>
  <h1>courierA {this._renderShippingFees('a')}</h1>
  <h1>courierB {this._renderShippingFees('b')}</h1>
  <h1>courierC {this._renderShippingFees('c')}</h1>
  <h1>courierD {this._renderShippingFees('d')}</h1>
...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM