2026-01-19 18:52:18 +08:00

87 lines
1.8 KiB
Vue

<template>
<view class="textarea-row">
<view class="form-row__label">
{{ name }}<text v-if="required" class="form-cell--required"></text>
</view>
<view class="mt-10">
<textarea :disabled="disableChange" :value="value" class="form-textarea" :placeholder="placeholder"
placeholder-class="form__placeholder" :maxlength="wordLimit" @input="change($event)" />
<view v-if="wordLimit > 0" class="form-textarea__count">
{{ value && value.length ? value.length : 0 }} / {{ wordLimit }}
</view>
</view>
</view>
</template>
<script setup>
import { computed } from 'vue';
const emits = defineEmits(['change']);
const props = defineProps({
form: {
type: Object,
default: () => ({})
},
name: {
default: ''
},
required: {
type: Boolean,
default: false
},
title: {
default: ''
},
disableChange: {
type: Boolean,
default: false
},
wordLimit: {
type: [Number, String],
default: 100
}
})
const placeholder = computed(() => `请输入${props.name || ''}`)
const value = computed(() => props.form && props.form && props.form[props.title] ? props.form[props.title] : '')
const wordLimit = computed(() => {
if (typeof props.wordLimit === 'string' && Number(props.wordLimit) > 0) {
return Number.ceil(props.wordLimit)
}
if (typeof props.wordLimit === 'number' && props.wordLimit > 0) {
return props.wordLimit
}
return 100
})
function change(e) {
emits('change', {
title: props.title,
value: e.detail.value
})
}
</script>
<style lang="scss" scoped>
.textarea-row {
padding: 24rpx 30rpx;
border-bottom: 1px solid #eee;
font-size: 28rpx;
}
.form-textarea {
width: 100%;
font-size: 28rpx;
border: 1px solid #eee;
padding: 20rpx;
border-radius: 8rpx;
box-sizing: border-box;
}
.form-textarea__count {
padding-top: 20rpx;
text-align: right;
color: #666;
font-size: 24rpx;
}
</style>