#javascript #reactjs
#javascript #reactjs
Вопрос:
Я пытаюсь передать функцию форматирования компоненту с дочерними элементами. Я теряюсь в том, как установить состояние.
Для начала у меня есть пара элементов в компоненте:
const InputWithLabel = ({ labelText, value, name, onChange, }) => (
<div>
<label>{labelText}</label>
<input name={name} value={value} onChange={onChange} />
</div>
);
Затем у меня есть компонент, который я хотел бы использовать для их хранения, и добавить форматирование к введенным значениям во входных данных:
class FormatInput extends Component {
constructor( props ){
super( props );
this.state = {};
this.onChange = this.onChange.bind(this);
}
onChange(event) {
const originalValue = event.target.value;
const newValue = this.props.applyFormat(originalValue);
this.setState({[event.target.name]: newValue});
}
render() {
return (
<InputWithLabel
name="IWL"
labelText="Input With Label"
onChange={this.onChange}>
</InputWithLabel>
);
}
}
Я вызываю с простой домашней страницы, вот так:
<FormatInput name="FI" applyFormat={(arg)=> arg *=2}></FormatInput>
Ввод значений во входные данные на домашней странице не имеет никакого эффекта (т. Е. не умножается на 2). Проходя через код, он не выдает никаких ошибок, поэтому я не уверен, где происходит сбой.
При проверке состояние FormatInput не задано, если я явно не задал его в конструкторе, даже если состояние должно содержать любое введенное значение. Но я не понимаю, как компонент FormatInput может получать это состояние, обновлять его, поэтому, я думаю, вопрос в том, как я могу обновить состояние дочернего компонента?
Ответ №1:
Возможно, вы написали свой вопрос именно так, но вам нужно установить value
атрибут для <InputWithLabel>
. Не уверен, какой ключ состояния ему присвоить, хотя бы потому, что вы используете event.target.name
, и я не уверен, почему.
Может быть, вы могли бы сделать что-то вроде:
this.state = {
formattedValue: ''
}
...
this.setState({ formattedValue: newValue })
...
<InputWithLabel
value={this.state.formattedValue}
name="IWL"
labelText="Input With Label"
onChange={this.onChange}>
</InputWithLabel>
Также внутри вашего средства форматирования вам следует убрать знак равенства с (arg) => arg * 2
. Используя знак равенства, вы предлагаете умножить аргумент на 2 , а затем сохранить его в arg , где, поскольку вы просто хотите вернуть измененное значение.