Как сделать динамическое состояние для нескольких полей в реакции? - PullRequest
0 голосов
/ 17 ноября 2018
class Bills extends Component {
constructor(props) {
    super(props)
    this.state = {
        productName: '',
        price: 0,
        quantity: 0,
        noOfProductsField: 0
    }
}
handleChange = name => event => {
    this.setState({
        [name]: event.target.value,
    });
};

createFields = () => {
        const { classes } = this.props;
        let children = []
        for (let i = 0; i < this.state.noOfProductsField; i++) {
            children.push(
                <div>
                    <Select
                        className={classes.textField}
                         value = { this.state[i] }
                    onChange={this.handleChange('productName')}
                        displayEmpty
                        SelectProps={{
                            MenuProps: {
                                className: classes.menu,
                            }
                        }}>
                        <MenuItem value="" disabled>
                            Select Product
                           </MenuItem>
                        {this.state.products.map((option, ind) => (
                            <MenuItem key={ind} value={option.productName}>
                                {option.productName}
                            </MenuItem>
                        ))}
                    </Select>
                    <TextField className={classes.textField} placeholder='Price' type='number' onChange={this.handleChange('price')} />
                    <TextField className={classes.textField} placeholder='Quantity' type='number' onChange={this.handleChange('quantity')} />
                </div>
            )
        }
        return children
    }
}

У меня есть эта функция, которая создает 3 поля ввода для цикла

  • productName
  • цена
  • количество

Например, если цикл выполняется 2 раза, он создаст 6 полей, как на рисунке ниже:

Click on this to see image

Так что теперь я хочу управлять состоянием для всех 6 полей по-разному. Как я могу сделатьчто?

Ответы [ 3 ]

0 голосов
/ 17 ноября 2018

Вы можете добавить атрибут name к каждому входному компоненту и создать один метод-обработчик, который получает имя в качестве аргумента.

handleInputChange(event) {

  const value = event.target.value;
  const name = event.target.name;

  this.setState({
    [name]: value
  });
}

Вы можете прочитать больше о , как обрабатывать несколько входов на React документы.

0 голосов
/ 07 февраля 2019

Вы можете создать поле динамического выбора, используя реагировать JS

**Code sample:**

const templates = [
    {'id': 1, 'value': 'JavaScript', 'name': 'JavaScript'}, 
    {'id': 2, 'value': 'React', 'name': 'React'},    
    {'id': 3, 'value': 'Angular', 'name': 'Angular'},
    {'id': 4, 'value': 'Node', 'name': 'Node'},
    {'id': 5, 'value': 'Vue', 'name': 'Vue'},
 ]

class Dynamic extends React.Component {
  state={
    selectedTemplates: ""
  }

 onChange = (e) => {
   console.log(e)
   // selected value store into state
    this.setState({ 
      selectedTemplates: e.target.value 
    });
  };

  render() {
    return (
      <div>
        <h2>Dynamic Select(Options):</h2>
        <select className="form-control"
            value={this.state.value}
            onChange={(e) => this.onChange(e.target.value)}
          >
          {
              templates.map(msgTemplate => {
                  return (
                      <option 
                        key={msgTemplate.id} 
                        name={msgTemplate.name} 
                        value={msgTemplate.text}
                       >
                          {msgTemplate.name}
                      </option>
                  )
              })
          }
       </select>
     </div>
    )
  }
}

React.render(<Dynamic />, document.getElementById('app'));

демо >> codepen

0 голосов
/ 17 ноября 2018

Вам нужно создавать динамические входные данные, верно? Итак, вы можете передать имя продукта своему обработчику this.handleChange('productName'), а затем сделать что-то вроде следующего. В вашем случае вам нужно будет использовать имя вычисляемого свойства, чтобы динамически устанавливать состояние (как вы уже делаете)

handleChange = name => event => {
    //more logic here as per the requirement
    this.setState({
        [name]: event.target.value,
    });
};

Или вы можете создать отдельные обработчики onChange для каждого продукта, цены, количества.

handleProductChange = (name) => (evt) => {
    const newProducts = this.state.products.map((product, pidx) => {
      if (name !== product.productName) return product;
      return { ...product, productName: evt.target.value };
    });

    this.setState({ products: newProducts });
}

Быстрый поток: Когда происходит изменение продукта onChange, вы можете сохранить продукт в массиве procucts (в состоянии), а когда произойдет изменение цены, вы можете отправить имя продукта вместе с ним и сопоставить продукт с ценой. и количество.

Здесь вы можете найти хорошую копию JS bin с React, точно такую ​​же, какую вы хотите достичь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...