You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中如何实现textarea存在内容时自动展开的效果

解决方案

你可以通过给有内容的textarea新增专属样式类的方式实现需求,以下是两种可选实现方案:


方案1:固定展开高度(和现有聚焦展开效果保持一致)

仅需修改2处代码即可实现:textarea只要有内容,无论是否失焦都保持展开状态,高度固定为150px。

1. 修改CSS样式

在原有CSS基础上新增has-content类的共同样式规则:

.dynamic-textarea {
  text-align: left;
  transition: all .3s ease;
  height: 60px;
}

/* 聚焦、有内容时都保持展开状态 */
.dynamic-textarea:focus,
.dynamic-textarea.has-content {
  height: 150px;
  width: 650px !important;
}

2. 修改DynamicWidthInput组件逻辑

在textarea的className判断中新增内容检测逻辑,有内容时自动添加has-content类:

// 仅展示修改部分的render逻辑
render() {
  const { id, placeholder, type, onChange, value, error, size } = this.props;
  if (type === "textarea") {
    return (
      <div style={{ display: "inline-block", verticalAlign: "top" }}>
        <textarea
          {/* 新增value非空判断,trim是为了过滤仅输入空格的情况 */}
          className={`input dynamic-input dynamic-textarea ${size} ${value?.trim() ? 'has-content' : ''}`}
          id={id}
          onChange={onChange}
          placeholder={placeholder}
          value={value}
          wrap="soft"
          maxLength="1000"
          {...this.props}
        />
        {error && <p className="help is-danger">{error.message}</p>}
      </div>
    );
  }
// 其余原有逻辑保持不变
}

方案2:自适应内容高度(高度随输入文本长度自动调整)

如果需要实现高度随文本内容实时变化,不需要固定150px的高度,可以按以下方式修改:

1. 调整CSS样式

移除固定高度限制,仅保留最小高度和过渡效果:

.dynamic-textarea {
  text-align: left;
  transition: all .3s ease;
  min-height: 60px; /* 无内容时的最小高度 */
  height: auto;
  resize: none; /* 可选:禁止用户手动拖拽调整大小 */
}

.dynamic-textarea:focus,
.dynamic-textarea.has-content {
  width: 650px !important;
}

2. 新增组件高度适配逻辑

在组件的生命周期方法中新增高度自动计算逻辑:

class DynamicWidthInput extends React.Component {
  // 适配高度的公共方法
  adjustTextareaHeight = () => {
    const textareaDom = document.getElementById(this.props.id);
    if (!textareaDom || this.props.type !== 'textarea') return;
    // 先重置高度,再设置为滚动高度,实现自适应
    textareaDom.style.height = 'auto';
    textareaDom.style.height = `${textareaDom.scrollHeight}px`;
  }

  componentDidMount() {
    const { id, value } = this.props;
    resizable(document.getElementById(id), 16, value);
    // 新增:初始化时适配高度
    this.adjustTextareaHeight();
  }

  componentDidUpdate(prevProps) {
    const { id, value } = this.props;

    if (this.props.value !== prevProps.value) {
      resizable(document.getElementById(id), 16, value);
      // 新增:内容变化时适配高度
      this.adjustTextareaHeight();
    }
  }

  // render逻辑和方案1保持一致,保留has-content类的判断
}

内容的提问来源于stack exchange,提问作者Nhan Nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:45:02