xXRustamXx
@xXRustamXx

Допускается ли такой подход что бы сделать textarea-autosize?

Это противоречит концепции React, но библиотеку/компонент который подстраивает высоту поля не хочу подключать из-за какой-то textarea, когда можно сделать это самому, пробовал через setState задавать 2 высоты, одну по дефолту, а другую динамическую, но тщетно:
  • Вопрос задан
  • 1261 просмотр
Пригласить эксперта
Ответы на вопрос 2
@Alexprintme
Как то так:
import React, { useEffect, useRef, useState} from "react";
const defaultStyle = {
    display: "block",
    overflow: "hidden",
    resize: "none",
    width: "100%",
    backgroundColor: "mediumSpringGreen"
};

const AutoHeightTextarea = ({ style = defaultStyle, ...etc }) => {
    const textareaRef = useRef(null);
    const [currentValue, setCurrentValue ] = useState("");

    useEffect(() => {
        textareaRef.current.style.height = "0px";
        const scrollHeight = textareaRef.current.scrollHeight;
        textareaRef.current.style.height = scrollHeight + "px";
    }, [currentValue]);

    return (
        <textarea
            ref={textareaRef}
            style={style}
            {...etc}
            value={currentValue}

            onChange={e=>setCurrentValue(e.target.value)}
        />
    );
};

export default AutoHeightTextarea;
Ответ написан
Комментировать
miraage
@miraage
Старый прогер
Теоретически – допускается. Нормально ли так писать – на мой взгляд, нет.
Я бы написал как-то так.

class Textarea extends React.Component {
  constructor(props) {
    super(props);
    
    this.state = {};
    this.onChange = this.onChange.bind(this);
  }

  onChange(e) {
    this.setState({
      height: e.target.scrollHeight
    });
  }
  
  render() {
    const { height } = this.state;

    return (
      <div>
        <textarea 
          name="text"
          style={{ height }}
          placeholder="Autoresize textarea"
          onChange={this.onChange}
        />
      </div>
    )
  }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы