Я создал React View, скажем MyView
, в котором есть 2 текстовых ввода, начальные значения которых будут переданы родительским чтением из БД.
Я также хочу, чтобы измененные значения были сохранены обратно вDB.Таким образом, представлению также передается функция обратного вызова для того же самого.
Учтите, что операция сохранения в БД тяжелая, и вам не следует делать это очень часто .Поэтому я решил прослушивать onBlur
события вместо onChange
событий в полях ввода, так как onChange
вызывается при каждом нажатии клавиши.
Первый подход:
class MyView extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<div>
<input type="url" value={this.props.values.A}
onBlur={(evt)=>{this.props.saveValue('A', evt.target.value)}} />
<input type="url" value={this.props.values.B}
onBlur={(evt)=>{this.props.saveValue('B', evt.target.value)}} />
<button type="button" onClick={this.props.resetValues}>Reset</button>
</div>
);
}
}
Однако это не работает, поскольку React
принудительно заставляет управляемый вход (с атрибутом value
) всегда сопровождаться прослушивателем onChange
.
Второй подход:
Итак, я попытался сделать эти входные данные как uncontrolled
.То есть вместо атрибута value
используется defaultValue
.
<input type="url" defaultValue={this.props.values.A}
onBlur={(evt)=>{this.props.saveValue('A', evt.target.value)}} />
Но это также не сработало, как при нажатии кнопки сброса / очистки, хотя представление было выполнено для повторного рендеринга, но defaultValue
не обновляется после создания представления.
Третий подход:
Итак, я наконец-то добавил onChange
слушатель, но как безоперационный.
<input type="url" value={this.props.values.A}
onChange={()=>{console.log('do nothing')}
onBlur={(evt)=>{this.props.saveValue('A', evt.target.value)}} />
Опять же, это не сработало, так как представление перерисовывается после вызова onChange
, и, поскольку значение не отражается в props
, value
, похоже, сбрасывается обратно к исходному при каждом нажатии клавиши.
Четвертый подход:
Последнее, что я пытался, было сохранить state
в компоненте и считывать значение из состояния, а при каждом onChange
сохранять значение обратно в состояние.В большинстве случаев это работало, но при любых внешних изменениях в подпорках и перерисовывании представления state
не обновлялось.Итак, я добавил getDerivedStateFromProps
функцию для просмотра:
static getDerivedStateFromProps(props, state) {
return props.values;
}
Теперь это снова не сработало.Причина в том, что эта функция вызывается, даже если я временно сохраняю значения в состояние и состояние сбрасывается до начальных значений в реквизитах.
Может ли какой-нибудь эксперт ReactJS помочь мне с моим вариантом использования?