Компонент текстовой области (textarea) предназначен для
ввода многострочного текста. В классической HTML-реализации высота
такого поля фиксирована и не изменяется автоматически при вводе. В
пользовательских интерфейсах это нередко приводит к неудобствам: текст
выходит за пределы видимой области и требует прокрутки.
В библиотеке Naive UI предусмотрен механизм
автоматического изменения высоты текстовой области —
autosize. Он позволяет динамически подстраивать высоту
textarea в зависимости от объёма введённого текста.
Автоматическое масштабирование особенно актуально для:
В библиотеке Naive UI текстовая область реализуется через компонент
NInput с типом textarea.
Базовый пример:
<template>
<n-input
type="textarea"
placeholder="Введите текст"
/>
</template>
Компонент автоматически наследует стили и поведение всей системы
ввода Naive UI: валидацию, состояния disabled,
readonly, а также поддержку v-model.
autosizeДля включения автоматического изменения высоты используется свойство
autosize.
Простейший вариант:
<n-input
type="textarea"
autosize
/>
При использовании такого варианта:
textarea исчезаетМеханизм работает за счёт вычисления фактической высоты содержимого и
динамического изменения CSS-свойства height.
В реальных интерфейсах полностью свободное изменение высоты может нарушать компоновку страницы. Поэтому Naive UI позволяет задавать минимальное и максимальное количество строк.
Для этого autosize принимает объект параметров.
<n-input
type="textarea"
:autosize="{
minRows: 3,
maxRows: 6
}"
/>
| Параметр | Назначение |
|---|---|
| minRows | минимальное количество строк |
| maxRows | максимальное количество строк |
Поведение компонента:
minRowsmaxRows появляется прокруткаЭто позволяет сохранить компактность интерфейса.
<template>
<n-input
v-model:value="comment"
type="textarea"
placeholder="Комментарий"
:autosize="{
minRows: 2,
maxRows: 8
}"
/>
</template>
<script setup>
import { ref } from 'vue'
const comment = ref('')
</script>
Особенности такого поля:
Подобная конфигурация широко используется в системах комментариев.
v-modelКомпонент полностью поддерживает двустороннее связывание данных через
v-model:value.
<n-input
v-model:value="text"
type="textarea"
autosize
/>
const text = ref('')
Каждое изменение текста:
Autosize никак не влияет на реактивность данных — он управляет только визуальной частью компонента.
Параметры autosize можно изменять динамически.
<n-input
type="textarea"
:autosize="autosizeConfig"
/>
const autosizeConfig = ref({
minRows: 2,
maxRows: 5
})
Позже конфигурацию можно изменить:
autosizeConfig.value.maxRows = 10
После обновления состояния компонент автоматически пересчитает размеры.
Autosize часто комбинируется со свойством maxlength.
<n-input
type="textarea"
autosize
maxlength="200"
/>
Если требуется отображать счётчик символов:
<n-input
type="textarea"
autosize
maxlength="200"
show-count
/>
Интерфейс получает сразу два механизма контроля:
Autosize работает в обе стороны.
Когда текст удаляется:
Если задано minRows, компонент никогда не станет меньше
этого значения.
В случаях, когда текст изменяется программно (например, при загрузке данных из API), autosize также корректно пересчитывает высоту.
<n-button @click="loadText">
Загрузить текст
</n-button>
<n-input
v-model:value="content"
type="textarea"
autosize
/>
function loadText() {
content.value = `
Большой текст,
загруженный из сервера,
который автоматически
увеличит высоту textarea.
`
}
После обновления значения:
Autosize часто применяется в компонентах форм NForm.
<n-form-item label="Описание">
<n-input
v-model:value="description"
type="textarea"
:autosize="{
minRows: 4,
maxRows: 10
}"
/>
</n-form-item>
Такой подход обеспечивает:
Naive UI использует CSS-переменные и внутренние стили компонента. Однако дополнительные стили могут быть добавлены вручную.
Пример:
<n-input
class="custom-textarea"
type="textarea"
autosize
/>
.custom-textarea textarea {
line-height: 1.6;
font-size: 14px;
}
Изменение line-height может влиять на расчёт высоты,
поскольку autosize ориентируется на реальную высоту строки.
Механизм автоматического масштабирования работает следующим образом:
heightЭто позволяет:
Несмотря на удобство механизма, существуют некоторые особенности.
Если шрифт изменяется динамически, возможен пересчёт высоты.
Некоторые стили могут нарушать точность расчёта:
line-heightbox-sizingПри использовании внутри flex-контейнеров высота может пересчитываться при изменении размеров родительского элемента.
Autosize особенно полезен для текстовых полей отправки сообщений.
<n-input
v-model:value="message"
type="textarea"
placeholder="Сообщение"
:autosize="{
minRows: 1,
maxRows: 4
}"
/>
Такое поведение характерно для:
Поле растёт по мере ввода сообщения и остаётся компактным при коротких текстах.
В чатах часто используется отправка по клавише Enter.
<n-input
v-model:value="message"
type="textarea"
autosize
@keydown.enter="sendMessage"
/>
Для предотвращения переноса строки можно перехватывать событие.
function sendMessage(event) {
event.preventDefault()
// отправка сообщения
}
Autosize при этом продолжает корректно работать.
В админ-интерфейсах autosize применяется для:
Пример:
<n-input
v-model:value="productDescription"
type="textarea"
:autosize="{
minRows: 5,
maxRows: 15
}"
/>
Такой диапазон строк позволяет вводить длинные тексты без нарушения структуры страницы.
Autosize в Naive UI оптимизирован для минимального влияния на производительность.
Основные особенности реализации:
Даже при большом количестве textarea на странице
компонент работает стабильно.
Оптимальные сценарии использования autosize:
Рекомендуемые значения:
| Сценарий | minRows | maxRows |
|---|---|---|
| комментарий | 2 | 6 |
| чат | 1 | 4 |
| описание | 4 | 10 |
| заметки | 5 | 15 |
Правильно выбранные ограничения предотвращают чрезмерное расширение интерфейса и сохраняют удобство ввода текста.