【问题标题】:How to create a dynamic input type component如何创建动态输入类型组件
【发布时间】:2018-11-13 12:35:14
【问题描述】:

我正在开发一个动态组件,其中输入可用于多种类型:textpasswordnumberdate 等。想法是使用此输入,无论类型如何以及在哪里实施它,只要它具有适应性。我认为使用状态是一个好主意,但我不知道如何做到这一点。有什么想法吗?

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>

    )
}
}

谢谢!

【问题讨论】:

  • 您想如何配置type?您可以改用this.props.type 并让InputField 的用户配置它。
  • 你有什么理由想要输入中的状态。当然,您希望在其父级上设置输入的值?

标签: javascript reactjs react-component


【解决方案1】:

我个人认为你应该通过 props 来控制它,因为这个值只会对 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 处理错误消息,但从您的示例来看,这是一个有效的解决方案。

【讨论】:

    【解决方案2】:
    <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}
      />
    

    我会使用道具来改变类型和管理组件。 然后,您可以从表单定义中控制组件

    【讨论】:

      【解决方案3】:

      你应该使用道具而不是状态,所以你可以通过

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

      对于其他参数,您也可以使用道具。

      【讨论】:

        【解决方案4】:

        您可以使用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>

        您是否有理由要使用自定义输入组件?

        【讨论】:

        • 这个想法是构建一个小型的 react 组件库,这样我就可以在不更改父组件中的 props 的情况下构建表单。
        猜你喜欢
        • 1970-01-01
        • 2014-06-09
        • 2013-09-06
        • 1970-01-01
        • 2020-06-11
        • 1970-01-01
        • 1970-01-01
        • 2019-03-19
        • 2022-10-08
        相关资源
        最近更新 更多