From d9d6284dad482c5a823c559bacd54552f14b111d Mon Sep 17 00:00:00 2001
From: coder77 <2293444075@qq.com>
Date: Tue, 01 Apr 2025 14:31:03 +0800
Subject: [PATCH] feat: CTextArea组件增加maxLength

---
 forms/textarea/CTextArea.vue |   67 ++++++++++++++++++++++++++++++---
 1 files changed, 60 insertions(+), 7 deletions(-)

diff --git a/forms/textarea/CTextArea.vue b/forms/textarea/CTextArea.vue
index 854caea..8260c98 100644
--- a/forms/textarea/CTextArea.vue
+++ b/forms/textarea/CTextArea.vue
@@ -1,30 +1,40 @@
 /**
  * CTextArea
+ * 多行文本输入组件,用于在表单中收集用户的多行文本输入
+ * 支持设置输入区域高度,可以通过字数、行数或像素值来控制
+ * 支持只读模式和自动增高功能
  * @author Tevin
  */
 
 <template>
-    <view class="c-textarea">
+    <view class="c-textarea" :class="readOnly ? 'read-only' : ''">
         <AtInput
             ref="input"
             :name="itemRes.name"
             :title="itemRes.label"
             :required="itemRes.required"
+            :disabled="itemRes.disabled"
             :error="itemRes.error"
         />
         <textarea
             ref="textarea"
             class="textarea"
-            :style="{height: height || '94px'}"
+            :style="{
+                minHeight: minHeight,
+                maxHeight: maxHeight,
+            }"
             :placeholder="placeholder"
             :value="itemRes.formData[itemRes.name]"
-            :autoFocus="true"
-            @input="evt=>itemRes.onChange(evt.detail.value)"
+            :maxlength="maxLength"
+            :autoFocus="false"
+            :autoHeight="true"
+            @input="evt => itemRes.onChange(evt.detail.value)"
         />
     </view>
 </template>
 
 <script>
+import Taro from '@tarojs/taro';
 import { $ } from '@tarojs/extend';
 import { AtInput } from 'taro-ui-vue';
 import './cTextArea.scss';
@@ -35,16 +45,59 @@
         AtInput,
     },
     props: {
-        height: String,
-        placeholder: String,
+        // 表单数据资源(表单组件内部机制专用)
         itemRes: Object,
+        // 文本域输入区域高度
+        height: {
+            type: Number,
+            default: 94,
+        },
+        // 文本雨输入区行数
+        rows: Number,
+        // 最大输入长度
+        maxLength: Number,
+        // 只读模式
+        readOnly: {
+            type: Boolean,
+            default: false,
+        },
+        // 占位提示
+        placeholder: String,
     },
     data() {
         return {};
     },
+    computed: {
+        minHeight() {
+            // 默认最小高度为2行
+            const defaultRows = 2;
+            return Taro.pxTransform(defaultRows * 40, 750);
+        },
+        maxHeight() {
+            if (this.maxLength > 0) {
+                // maxLength 优先级最高
+                const estimatedRows = Math.ceil(this.maxLength / 25);
+                return Taro.pxTransform(estimatedRows * 40, 750);
+            } else if (this.rows) {
+                // 其次是 rows
+                return Taro.pxTransform(this.rows * 40, 750);
+            } else {
+                // 最后是 height
+                return Taro.pxTransform(this.height, 750);
+            }
+        },
+    },
     methods: {},
     mounted() {
-        $(this.$refs.input.$el).find('.at-input__input').prepend(this.$refs.textarea.$el);
+        if (process.env.TARO_ENV === 'h5') {
+            $(this.$refs.input.$el)
+                .find('.at-input__input')
+                .prepend(this.$refs.textarea.$el);
+        } else if (process.env.TARO_ENV === 'weapp') {
+            $(this.$refs.input.$el)
+                .find('.at-input__container')
+                .append(this.$refs.textarea);
+        }
     },
 };
 </script>
\ No newline at end of file

--
Gitblit v1.9.1