实现过程(setup语法糖形式下)
- 通过props获取父组件传递的初始化信息,如最大最小值,其中的提示语等
- 通过v-model绑定变量,完成子组件中的值处理变量
- 通过blur完成子组件中输入值的合法性校验,并在最后通过emit事件将合法值传递给父组件
- 父组件通过合适的方法接收emit事件传递的值
子组件示例
<template>
<view class="wordCnt">
<input
:placeholder="placeholderText"
class="word-text"
v-model="innerValue"
@blur="blur"
type="number"
/>
</view>
</template>
<script setup>
import { ref, defineProps } from 'vue';
const props = defineProps({
value: {
type: [Number, String],
default: null
},
minValue: {
type: Number,
default: 200
},
maxValue: {
type: Number,
default: 2000
}
});
const placeholderText = computed(() => `默认字${props.minValue},最大${props.maxValue}字`);
const innerValue = ref(props.value);
const oldValue = ref(200)
const emit = defineEmits(['wordCntInput']);
const blur = () => {
if (!/^\d+$/.test(innerValue.value)) {
innerValue.value = oldValue.value;
} else {
const value = parseInt(innerValue.value);
if (value < props.minValue) {
innerValue.value = props.minValue;
} else if (value > props.maxValue) {
innerValue.value = props.maxValue;
}
}
oldValue.value = innerValue.value
emit('wordCntInput', innerValue.value);
};
</script>
<style lang="scss" scoped>
.wordCnt{
margin: 0rpx 30rpx;
margin-bottom: 30rpx;
border-radius: 20rpx;
padding: 10rpx 30rpx;
background-color: #ffffff;
height: 50rpx;
justify-content: center;
align-items: center;
.word-text{
justify-content: center;
align-items: center;
text-align: right;
font-size: 28rpx;
line-height: 30rpx;
}
}
</style>
父组件示例
<template>
<WordCntInput
@wordCntInput="wordCntInput"
:minValue="200"
:maxValue="1000"/>
</template>
<script setup>
import WordCntInput from '@/components/wordCnt/wordCnt.vue';
const wordCntText = ref()
const wordCntInput = (wordCnt) => {
wordCntText.value = wordCnt
}
</script>
<style lang="scss" scoped>
</style>