如何创建动态输入类型组件
How to create a dynamic input type component
我正在开发一个动态组件,其中输入可用于多种类型: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>
)
}
}
谢谢!
你应该使用道具而不是状态,这样你就可以通过
<InputType type="text" />
<InputType type="password" />
<InputType type="number" />
对于其他参数,您也可以使用 props。
<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}
/>
我会使用道具来改变类型和管理组件。
然后您可以从表单定义中控制组件
我个人认为你应该通过道具来控制它,因为这个值只会对输入的父级有意义。
我用过这个
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
编辑为使用无状态组件。不确定您是否希望状态处理错误消息,但从您的示例来看,这是一个有效的解决方案。
您可以使用 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>
您想使用自定义输入组件的原因是什么?
我正在开发一个动态组件,其中输入可用于多种类型: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>
)
}
}
谢谢!
你应该使用道具而不是状态,这样你就可以通过
<InputType type="text" />
<InputType type="password" />
<InputType type="number" />
对于其他参数,您也可以使用 props。
<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}
/>
我会使用道具来改变类型和管理组件。 然后您可以从表单定义中控制组件
我个人认为你应该通过道具来控制它,因为这个值只会对输入的父级有意义。
我用过这个
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
编辑为使用无状态组件。不确定您是否希望状态处理错误消息,但从您的示例来看,这是一个有效的解决方案。
您可以使用 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>
您想使用自定义输入组件的原因是什么?