Как создать динамический компонент типа ввода - PullRequest
0 голосов
/ 13 ноября 2018

Я разрабатываю динамический компонент, в котором вход может использоваться для нескольких типов: text, password, number, date и т. Д. Идея состоит в том, чтобы использовать этот ввод, независимо от типа и где его реализовать, как долго его адаптивно. Я думал, что использование состояния было хорошей идеей, но я понятия не имею, как это сделать. Есть мысли?

import React, { Component } from 'react';
import './styles.css';

export default class InputField extends Component {
constructor(props) {
    super(props);

    this.state = {
        name: '',
        password: false,
        type: ''
    }
}

render () {
    return (
        <div>
            <label className='f-size'>{this.state.name}</label>
            <input 
                className='input'
                name={this.state.name}
                placeholder={this.state.name}
                value={this.props.value}
                type={this.state.type}
                onChange={this.props.onChange}
            />
            <span className="errorMessage">{this.props.error}</span>
            <span className="errorMessage">{this.props.missField}</span>

        </div>

    )
}
}

Спасибо!

Ответы [ 4 ]

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

Вы можете использовать this.props.type, но стандартный компонент ввода jsx уже динамический, как вы можете видеть из моего примера ниже:

var root = document.getElementById('root');
class InputField extends React.Component {
	render() {
		return (
		<div>
			<input type={this.props.type} />
		</div>
		)
	}	
}

class App extends React.Component {
	render() {
		return (
		<div>
			<input type='date' />
			<InputField type='password'/>
		</div>
		)
	}	
}

ReactDOM.render(<App />, root)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id='root'></div>

Есть ли причина, по которой вы хотели бы использовать пользовательский компонент ввода?

0 голосов
/ 13 ноября 2018
<InputField type="text" />
<InputField   type="password" />

<input 
  className='input'
  name={this.state.name}
  placeholder={this.state.name}
  value={this.props.value}
  type={this.props.type}
  onChange={this.props.onChange}
  />

Я бы использовал реквизит для изменения типа и управления компонентом. Затем вы можете управлять компонентом из определения формы

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

Лично я считаю, что вы должны контролировать это с помощью реквизита, поскольку значение будет иметь значение только для родительского элемента Input.

Я использовал это

const InputField = ({
  name,
  placeholder,
  value,
  type,
  onChange,
  error,
  missField
}) => (
  <div>
    <label className="f-size">{name}</label>
    <input
      className="input"
      name={name}
      placeholder={placeholder}
      value={value}
      type={type}
      onChange={onChange}
    />
    <span className="errorMessage">{error}</span>
    <span className="errorMessage">{missField}</span>
  </div>
);

Родительский компонент:

class App extends React.Component {
  constructor(props) {
    super(props);

    this.handleChange = this.handleChange.bind(this);
  }
  state = {
    value: '',
    password: '',
  };

  handleChange(event) {
    this.setState({ [event.target.name]: event.target.value });
  }
  render() {
    return (
      <div className="App">
        <InputField
          value={this.state.value}
          type="number"
          name="value"
          onChange={this.handleChange}
        />
        <InputField
          value={this.state.password}
          type="password"
          name="password"
          onChange={this.handleChange}
        />
      </div>
    );
  }
}

Код Песочница: https://codesandbox.io/s/y4ljv75k9

Отредактировано для использования компонента без состояния.Не уверен, что вы хотите, чтобы state обрабатывал сообщения об ошибках, но из вашего примера это верное решение.

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

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

<InputType type="text" />
<InputType type="password" />
<InputType type="number" />

, а для других параметров вы также можете использовать реквизиты.

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