#javascript #reactjs #material-ui
Вопрос:
У меня есть пользовательский компонент, который вызывает другой пользовательский компонент, созданный с использованием withStyles. Это выглядит примерно так
import {FormControl, InputBase, InputLabel, withStyles} from "@material-ui/core";
import React from "react";
export const CustomInput = withStyles((theme) => ({
...
}
}))(InputBase);
export const CustomTextField = (props) => {
...
return (
<FormControl fullWidth >
<CustomInput
id={id}
fullWidth
onChange={e => onChange(e)}
value={value}
variant={'outlined'}
disabled={disabled}
name={name}
height={height}
multiline={multiline}
minRows={3} maxRows={10}
/>
</FormControl>
);
}
Я получаю сообщение об ошибке saying React does not recognize the "minRows" prop on a DOM element.
, а также «maxRows». Но когда я смотрю на InputBase
API, присутствуют как минимальные, так и максимальные значения. Это использование пользовательского интерфейса v4 material
РЕДАКТИРОВАТЬ: Скриншот DOM
Ответ №1:
minRows
и maxRows
действительны только тогда, когда multiline
установлено значение true:
https://mui.com/api/input-base/
Что происходит, когда для multiline установлено значение false, так это то, что все неизвестные / неиспользуемые реквизиты передаются базовому элементу DOM. Поскольку minRows и maxRows не являются допустимыми атрибутами DOM, это объясняет ошибку, которую вы получаете. Убедитесь, что вы устанавливаете минимальные / максимальные строки только тогда, когда многострочность на самом деле истинна. Я не в том месте, где я мог бы это проверить, но я верю, что вы можете это сделать:
minRows={multiline ? 3 : null}
maxRows={multiline ? 10 : null}
ОБНОВЛЕНИЕ: убедитесь, что вы используете последнюю версию MUI — вы можете сделать это, запустив npm update
или yarn upgrade
.
Комментарии:
1. Хм. Я попробовал это сделать, но, похоже, это не сработало. Я даже добавил условие, чтобы добавлять только минимальные и максимальные строки в реквизит, если многострочность имеет значение true, и проблема не устранена. Спасибо за информацию, хотя
2. Можете ли вы взглянуть на DOM и посмотреть, к какому элементу он применяется? Вы должны увидеть
minRows
на каком-то элементе в dom.document.querySelector('[minRows]')
должен найти элемент из консоли инструментов разработчика браузера.3. Я добавил скриншот к исходному сообщению о том, как выглядит DOM, реквизит добавляется в InputBase-root, который является div. Вот почему это не работает, но я не уверен в решении для этого.
4. Я воссоздал код, который вы нам показали, и он работает так, как ожидалось, поэтому у вас должно быть что-то еще. Вы можете начать с этого рабочего пера и добавлять элементы по одному, пока он не станет больше похож на ваше приложение — ошибка должна проявиться: codepen.io/DesignByOnyx/pen/zYdzZgx
5. Хорошо, я наконец понял, проблема была не в коде. Как вы показали, это работает в вашем примере. Проблема заключалась в том, что я использовал версию 4.11.4, я обновился до 4.12.3, и теперь она работает правильно. Большое спасибо за вашу помощь, Райан