#javascript #html #jquery #reactjs #material-ui
#javascript #HTML #jquery #reactjs #материал-пользовательский интерфейс
Вопрос:
Я захватил элемент с помощью пользовательского хука React. если я использую console.log(this.inputRef), я получаю:
<input aria-invalid="false" autocomplete="off" class="MuiInputBase-input-409 MuiInput-input-394" placeholder="Type ItemCode or scan barcode" type="text" value="2">
Есть ли способ изменить значение этого элемента, используя this.inputRef ? а затем принудительно выполнить его повторный рендеринг?
Комментарии:
1. Я не знаком с React, но предполагаю
this.inputRef
, что ссылка на элемент, как следует из названия,this.inputRef.value = 'foo'
должна работать2. Есть ли причина, по которой вы используете ссылку, а не состояние? Если вы управляете входным значением в состоянии (а не сохраняете ссылку на сам элемент), процесс обычно становится намного чище. Соответствующая документация по React forms
3. потому что функция onchange объявлена внутри компонента ввода, а не от отца. Поэтому я хотел бы запустить его из родительского компонента, используя ссылку
Ответ №1:
Похоже, то, что вы ищете, — это хук ImperativeHandle .
Из React docs:
useImperativeHandle настраивает значение экземпляра, которое предоставляется родительским компонентам при использовании ref
Приведенный ниже код должен работать для вас:
function ValueInput(props, ref) {
const inputRef = useRef();
useImperativeHandle(ref, () => ({
changeValue: (newValue) => {
inputRef.current.value = newValue;
}
}));
return <input ref={inputRef} aria-invalid="false" autocomplete="off" class="MuiInputBase-input-409 MuiInput-input-394" placeholder="Type ItemCode or scan barcode" type="text" value="2">
}
ValueInput = forwardRef(ValueInput);
Документация: https://reactjs.org/docs/hooks-reference.html#useimperativehandle
Комментарии:
1. И как вы вызываете это из родительского компонента?
2. Привет @coler-j, взгляните на ссылку документации в моем ответе. В нем говорится: «В этом примере родительский компонент, который отображает <FancyInput ref={inputRef} />, сможет вызывать inputRef.current.focus()». Таким образом, вы можете использовать свой
ref
, чтобы вызвать его 🙂
Ответ №2:
ну, вы могли бы сделать:
<input ref={myRef} value={myRef.current.value} />
Единственная проблема заключается в том, что ссылки НЕ обновляют и не перенаправляют компонент, поэтому значение никогда не будет обновляться… вместо этого это может привести к ошибке, при которой вы пытаетесь сделать неконтролируемый ввод контролируемым
Ответ №3:
может быть, это может помочь
return(
<input type="text" ref={inptRef} />
<button onClick={()=>inptRef.current.value = ""}>clear input</button>
)