# zx-textarea 文本域组件

基于 uni-app 官方 textarea 组件封装的增强型文本域组件，提供了丰富的功能和良好的跨平台兼容性。

## 功能特性

- ✅ 完全兼容 uni-app 官方 textarea 组件的所有功能
- ✅ 支持 v-model 双向数据绑定
- ✅ 字数统计功能，支持自定义显示格式
- ✅ 清除按钮功能
- ✅ 多种边框样式（四周边框、底部边框、无边框）
- ✅ 自适应高度
- ✅ 丰富的自定义样式选项
- ✅ 完整的事件支持
- ✅ 输入长度限制
- ✅ 多种输入模式支持
- ✅ 平台兼容性优化（H5、小程序、App）
- ✅ 禁用状态支持
- ✅ 自定义占位符样式

## 基础用法

```vue
<template>
  <zx-textarea 
    v-model="value" 
    placeholder="请输入内容"
    @input="onInput"
    @change="onChange"
  />
</template>

<script setup>
import { ref } from 'vue';
import zxTextarea from '@/components/zx-textarea/zx-textarea.vue';

const value = ref('');

const onInput = (val) => {
  console.log('输入值:', val);
};

const onChange = (val) => {
  console.log('变化值:', val);
};
</script>
```

## API

### Props

| 属性名 | 类型 | 默认值 | 说明 | 平台差异说明 |
|-------|------|--------|------|-------------|
| value | String \| Number | '' | 输入框的内容 | |
| placeholder | String \| Number | '' | 输入框为空时占位符 | |
| placeholder-class | String | 'textarea-placeholder' | 指定 placeholder 的样式类 | |
| placeholder-style | String \| Object | '' | 指定 placeholder 的样式 | |
| height | String \| Number | '140rpx' | 输入框高度 | |
| disabled | Boolean | false | 是否禁用 | |
| maxlength | String \| Number | 140 | 最大输入长度，-1 为不限制 | |
| focus | Boolean | false | 是否自动获取焦点 | H5 取决于浏览器实现，nvue 不支持 |
| auto-focus | Boolean | false | 自动聚焦，拉起键盘 | |
| auto-height | Boolean | false | 是否自动增加高度 | |
| confirm-type | String | 'done' | 键盘右下角按钮文字 | 仅微信小程序、App-vue 和 H5 有效 |
| confirm-hold | Boolean | false | 点击键盘右下角按钮时是否保持键盘不收起 | |
| cursor-spacing | Number | 0 | 指定光标与键盘的距离 | |
| cursor | String \| Number | -1 | 指定 focus 时的光标位置 | |
| show-confirm-bar | Boolean | true | 是否显示键盘上方带有"完成"按钮那一栏 | |
| selection-start | Number | -1 | 光标起始位置 | |
| selection-end | Number | -1 | 光标结束位置 | |
| adjust-position | Boolean | true | 键盘弹起时，是否自动上推页面 | |
| disable-default-padding | Boolean | false | 是否去掉 iOS 下的默认内边距 | 仅微信小程序有效 |
| hold-keyboard | Boolean | false | focus 时，点击页面的时候不收起键盘 | 仅微信小程序有效 |
| auto-blur | Boolean | false | 键盘收起时，是否自动失去焦点 | |
| fixed | Boolean | false | 如果 textarea 是在一个 position:fixed 的区域，需要显示指定属性 fixed 为 true | |
| ignore-composition-event | Boolean | true | 是否忽略组件内对文本合成系统事件的处理 | |
| inputmode | String | 'text' | 输入模式提示 | 仅 H5 和 App-vue 平台支持 |

#### 扩展属性

| 属性名 | 类型 | 默认值 | 说明 |
|-------|------|--------|------|
| count | Boolean | false | 是否显示字数统计 |
| show-maxlength-in-count | Boolean | true | 字数统计是否显示最大长度 |
| clearable | Boolean | false | 是否显示清除按钮 |
| border | String | 'surround' | 边框类型：surround-四周边框，bottom-底部边框，none-无边框 |
| font-size | String \| Number | '15px' | 字体大小 |
| color | String | '#606266' | 字体颜色 |
| background-color | String | '#fff' | 背景色 |
| border-radius | String \| Number | '4px' | 边框圆角 |
| border-color | String | '#dadbde' | 边框颜色 |
| padding | String \| Number | '9px' | 内边距 |

### confirm-type 有效值

| 值 | 说明 |
|----|------|
| send | 右下角按钮为"发送" |
| search | 右下角按钮为"搜索" |
| next | 右下角按钮为"下一个" |
| go | 右下角按钮为"前往" |
| done | 右下角按钮为"完成" |

### inputmode 有效值

| 值 | 说明 |
|----|------|
| none | 无虚拟键盘 |
| text | 标准文本输入键盘 |
| decimal | 小数输入键盘 |
| numeric | 数字输入键盘 |
| tel | 电话输入键盘 |
| search | 搜索输入键盘 |
| email | 邮件输入键盘 |
| url | URL 输入键盘 |

### Events

| 事件名 | 说明 | 回调参数 |
|-------|------|----------|
| input | 当键盘输入时触发 | value: 输入框当前值 |
| change | 输入框内容变化时触发 | value: 输入框当前值 |
| focus | 输入框聚焦时触发 | event: {detail: {value, height}} |
| blur | 输入框失去焦点时触发 | event: {detail: {value, cursor}} |
| confirm | 点击完成按钮时触发 | event: {detail: {value}} |
| linechange | 输入框行数变化时触发 | event: {detail: {height, heightRpx, lineCount}} |
| keyboardheightchange | 键盘高度发生变化时触发 | event: {detail: {height, duration}} |
| clear | 点击清除按钮时触发 | - |

## 使用示例

### 基础用法

```vue
<zx-textarea 
  v-model="value" 
  placeholder="请输入内容"
/>
```

### 带字数统计

```vue
<zx-textarea 
  v-model="value" 
  placeholder="最多输入100个字符"
  :count="true"
  :maxlength="100"
/>
```

### 清除按钮

```vue
<zx-textarea 
  v-model="value" 
  placeholder="带清除按钮的输入框"
  :clearable="true"
  @clear="onClear"
/>
```

### 自适应高度

```vue
<zx-textarea 
  v-model="value" 
  placeholder="输入区域高度自适应"
  :auto-height="true"
/>
```

### 不同边框样式

```vue
<!-- 四周边框 -->
<zx-textarea 
  v-model="value1" 
  border="surround"
/>

<!-- 底部边框 -->
<zx-textarea 
  v-model="value2" 
  border="bottom"
/>

<!-- 无边框 -->
<zx-textarea 
  v-model="value3" 
  border="none"
/>
```

### 自定义样式

```vue
<zx-textarea 
  v-model="value" 
  placeholder="自定义样式"
  font-size="16px"
  color="#333"
  background-color="#f8f9fa"
  border-color="#007bff"
  border-radius="8px"
  padding="12px"
/>
```

### 不同输入模式

```vue
<!-- 数字输入 -->
<zx-textarea 
  v-model="numericValue" 
  placeholder="数字输入模式"
  inputmode="numeric"
/>

<!-- 邮箱输入 -->
<zx-textarea 
  v-model="emailValue" 
  placeholder="邮箱输入模式"
  inputmode="email"
/>
```

### 自定义占位符样式

```vue
<zx-textarea 
  v-model="value" 
  placeholder="红色占位符文字"
  placeholder-style="color: #f56c6c; font-style: italic;"
/>
```

## 注意事项

1. **平台兼容性**：
   - 微信小程序、百度小程序、抖音小程序等平台中，textarea 是原生组件，层级高于前端组件
   - 小程序端 CSS 动画对 textarea 组件无效
   - H5 平台只能在用户交互时修改 focus 生效

2. **输入限制**：
   - 当设置 `maxlength` 时，超出长度的输入会被自动截断
   - 字数统计会根据输入长度实时更新，超出时会显示红色警告

3. **键盘处理**：
   - 软键盘的弹出和收起逻辑遵循各平台的默认行为
   - 如需禁止点击其他位置收起键盘，可以监听 `touch` 事件并使用 `prevent` 修饰符

4. **样式定制**：
   - 组件支持通过 props 定制大部分样式
   - 如需更复杂的样式定制，可以通过 CSS 变量或深度选择器实现

5. **事件处理**：
   - `blur` 事件会晚于页面上的 `tap` 事件执行
   - 如果需要在按钮点击事件中获取 textarea 的值，建议使用 form 的 `@submit` 事件

## 更新日志

### v1.0.0
- 初始版本发布
- 完整实现 uni-app textarea 组件的所有功能
- 添加字数统计、清除按钮等增强功能
- 支持多种边框样式和自定义样式
- 完善的平台兼容性处理
