|
@@ -1,24 +1,26 @@
|
|
|
<template>
|
|
<template>
|
|
|
- <view class="nut-textarea">
|
|
|
|
|
|
|
+ <view :class="classes">
|
|
|
<view class="nut-input-label">
|
|
<view class="nut-input-label">
|
|
|
- <view v-if="props.label" class="label-string">{{ props.label }}</view>
|
|
|
|
|
|
|
+ <view v-if="label" class="label-string">{{ label }}</view>
|
|
|
</view>
|
|
</view>
|
|
|
<view class="nut-text">
|
|
<view class="nut-text">
|
|
|
<textarea
|
|
<textarea
|
|
|
:style="styles"
|
|
:style="styles"
|
|
|
- :rows="props.rows"
|
|
|
|
|
|
|
+ :rows="rows"
|
|
|
@input="valueChange"
|
|
@input="valueChange"
|
|
|
- v-model="state.curretvalue"
|
|
|
|
|
|
|
+ @focus="valueFocus"
|
|
|
|
|
+ @blur="valueBlur"
|
|
|
|
|
+ v-model="curretvalue"
|
|
|
class="nut-text-core"
|
|
class="nut-text-core"
|
|
|
:maxlength="maxLength"
|
|
:maxlength="maxLength"
|
|
|
- :placeholder="props.placeholder"
|
|
|
|
|
- :disabled="props.disabled"
|
|
|
|
|
- :readonly="props.readonly"
|
|
|
|
|
|
|
+ :placeholder="placeholder"
|
|
|
|
|
+ :disabled="disabled"
|
|
|
|
|
+ :readonly="readonly"
|
|
|
>
|
|
>
|
|
|
</textarea>
|
|
</textarea>
|
|
|
<view class="nut-text-limit" v-if="limitShow">
|
|
<view class="nut-text-limit" v-if="limitShow">
|
|
|
- <view :class="[{ 'nut-field-over': state.textNum > maxLength }]">{{
|
|
|
|
|
- state.textNum
|
|
|
|
|
|
|
+ <view :class="[{ 'nut-field-over': textNum > maxLength }]">{{
|
|
|
|
|
+ textNum
|
|
|
}}</view>
|
|
}}</view>
|
|
|
<view>/{{ maxLength }}</view>
|
|
<view>/{{ maxLength }}</view>
|
|
|
</view>
|
|
</view>
|
|
@@ -26,12 +28,12 @@
|
|
|
</view>
|
|
</view>
|
|
|
</template>
|
|
</template>
|
|
|
<script lang="ts">
|
|
<script lang="ts">
|
|
|
-import { ref, toRefs, reactive, computed } from 'vue';
|
|
|
|
|
|
|
+import { toRefs, reactive, computed, watch } from 'vue';
|
|
|
import { createComponent } from '@/utils/create';
|
|
import { createComponent } from '@/utils/create';
|
|
|
|
|
|
|
|
const { componentName, create } = createComponent('textarea');
|
|
const { componentName, create } = createComponent('textarea');
|
|
|
interface Events {
|
|
interface Events {
|
|
|
- eventName: 'change' | 'focus' | 'blur' | 'clear' | 'update:value';
|
|
|
|
|
|
|
+ eventName: 'change' | 'focus' | 'blur' | 'update:value';
|
|
|
params: (string | number | Event)[];
|
|
params: (string | number | Event)[];
|
|
|
}
|
|
}
|
|
|
export default create({
|
|
export default create({
|
|
@@ -49,8 +51,8 @@ export default create({
|
|
|
default: ''
|
|
default: ''
|
|
|
},
|
|
},
|
|
|
rows: {
|
|
rows: {
|
|
|
- type: String,
|
|
|
|
|
- default: ''
|
|
|
|
|
|
|
+ type: [String, Number],
|
|
|
|
|
+ default: '2'
|
|
|
},
|
|
},
|
|
|
label: {
|
|
label: {
|
|
|
type: String,
|
|
type: String,
|
|
@@ -78,38 +80,40 @@ export default create({
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
- emits: ['change', 'update:value', 'blur', 'focus', 'clear', 'error'],
|
|
|
|
|
|
|
+ emits: ['change', 'update:value', 'blur', 'focus'],
|
|
|
|
|
|
|
|
setup(props, { emit }) {
|
|
setup(props, { emit }) {
|
|
|
- const { maxLength } = props;
|
|
|
|
|
- const { value } = toRefs(props);
|
|
|
|
|
- const active = ref(false);
|
|
|
|
|
const state = reactive({
|
|
const state = reactive({
|
|
|
- curretvalue: value,
|
|
|
|
|
- textNum: String(value.value).length
|
|
|
|
|
|
|
+ curretvalue: props.value,
|
|
|
|
|
+ textNum: String(props.value).length
|
|
|
});
|
|
});
|
|
|
|
|
+
|
|
|
const classes = computed(() => {
|
|
const classes = computed(() => {
|
|
|
|
|
+ const prefixCls = componentName;
|
|
|
return {
|
|
return {
|
|
|
- [componentName]: true
|
|
|
|
|
|
|
+ [prefixCls]: true
|
|
|
};
|
|
};
|
|
|
});
|
|
});
|
|
|
|
|
+
|
|
|
const styles = computed(() => {
|
|
const styles = computed(() => {
|
|
|
return {
|
|
return {
|
|
|
- 'text-align': props.textAlign,
|
|
|
|
|
|
|
+ textAlign: props.textAlign,
|
|
|
resize: props.autosize ? 'vertical' : 'none'
|
|
resize: props.autosize ? 'vertical' : 'none'
|
|
|
};
|
|
};
|
|
|
});
|
|
});
|
|
|
|
|
+
|
|
|
const emitChange = (envs: Array<Events>) => {
|
|
const emitChange = (envs: Array<Events>) => {
|
|
|
envs.forEach((item: Events) => {
|
|
envs.forEach((item: Events) => {
|
|
|
return emit(item.eventName, ...item.params);
|
|
return emit(item.eventName, ...item.params);
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
|
|
+
|
|
|
const valueChange = (e: Event) => {
|
|
const valueChange = (e: Event) => {
|
|
|
const input = e.target as HTMLInputElement;
|
|
const input = e.target as HTMLInputElement;
|
|
|
let val = input.value;
|
|
let val = input.value;
|
|
|
|
|
|
|
|
- if (maxLength && val.length > Number(maxLength)) {
|
|
|
|
|
- val = val.slice(0, Number(maxLength));
|
|
|
|
|
|
|
+ if (props.maxLength && val.length > Number(props.maxLength)) {
|
|
|
|
|
+ val = val.slice(0, Number(props.maxLength));
|
|
|
}
|
|
}
|
|
|
state.textNum = val.length;
|
|
state.textNum = val.length;
|
|
|
emitChange([
|
|
emitChange([
|
|
@@ -123,8 +127,8 @@ export default create({
|
|
|
}
|
|
}
|
|
|
]);
|
|
]);
|
|
|
};
|
|
};
|
|
|
|
|
+
|
|
|
const valueFocus = (e: Event) => {
|
|
const valueFocus = (e: Event) => {
|
|
|
- active.value = true;
|
|
|
|
|
const input = e.target as HTMLInputElement;
|
|
const input = e.target as HTMLInputElement;
|
|
|
let val = input.value;
|
|
let val = input.value;
|
|
|
val = String(val);
|
|
val = String(val);
|
|
@@ -139,49 +143,42 @@ export default create({
|
|
|
}
|
|
}
|
|
|
]);
|
|
]);
|
|
|
};
|
|
};
|
|
|
|
|
+
|
|
|
const valueBlur = (e: Event) => {
|
|
const valueBlur = (e: Event) => {
|
|
|
- setTimeout(() => {
|
|
|
|
|
- active.value = false;
|
|
|
|
|
- }, 400);
|
|
|
|
|
const input = e.target as HTMLInputElement;
|
|
const input = e.target as HTMLInputElement;
|
|
|
- let val = input.value;
|
|
|
|
|
- val = String(val);
|
|
|
|
|
emitChange([
|
|
emitChange([
|
|
|
{
|
|
{
|
|
|
eventName: 'update:value',
|
|
eventName: 'update:value',
|
|
|
- params: [val]
|
|
|
|
|
|
|
+ params: [String(input.value)]
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
eventName: 'blur',
|
|
eventName: 'blur',
|
|
|
- params: [val]
|
|
|
|
|
- }
|
|
|
|
|
- ]);
|
|
|
|
|
- };
|
|
|
|
|
- const handleClear = () => {
|
|
|
|
|
- const val = '';
|
|
|
|
|
- emitChange([
|
|
|
|
|
- {
|
|
|
|
|
- eventName: 'update:value',
|
|
|
|
|
- params: [val]
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- eventName: 'clear',
|
|
|
|
|
- params: [val]
|
|
|
|
|
|
|
+ params: [String(input.value)]
|
|
|
}
|
|
}
|
|
|
]);
|
|
]);
|
|
|
};
|
|
};
|
|
|
|
|
+
|
|
|
|
|
+ watch(
|
|
|
|
|
+ () => props.value,
|
|
|
|
|
+ val => {
|
|
|
|
|
+ state.curretvalue = val;
|
|
|
|
|
+ state.textNum = String(val).length;
|
|
|
|
|
+ emitChange([
|
|
|
|
|
+ {
|
|
|
|
|
+ eventName: 'update:value',
|
|
|
|
|
+ params: [String(val)]
|
|
|
|
|
+ }
|
|
|
|
|
+ ]);
|
|
|
|
|
+ }
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
return {
|
|
return {
|
|
|
- props,
|
|
|
|
|
- value,
|
|
|
|
|
- state,
|
|
|
|
|
|
|
+ ...toRefs(state),
|
|
|
|
|
+ classes,
|
|
|
styles,
|
|
styles,
|
|
|
- active,
|
|
|
|
|
- maxLength,
|
|
|
|
|
valueChange,
|
|
valueChange,
|
|
|
valueFocus,
|
|
valueFocus,
|
|
|
- valueBlur,
|
|
|
|
|
- handleClear,
|
|
|
|
|
- emitChange
|
|
|
|
|
|
|
+ valueBlur
|
|
|
};
|
|
};
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|