请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

RulesProp(方法二不报错,方法一报错)

方法一:

<script setup lang="ts">
import { reactive, defineProps, ref, PropType, defineEmits } from 'vue'
const emailReg = /^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/
interface RuleProp {
type: 'required' | 'email';
message: string;
}
export type RulesProp = RuleProp[]

const props = defineProps({
rules: Array as PropType<RulesProp>,
modelValue: String
})
const inputRef = reactive({
val: props.modelValue || '',
error: false,
message: ''

})
const emits = defineEmits(['update:modelValue'])
const updateValue = (e: Event) => {
const targetValue = (e.target as HTMLInputElement).value
inputRef.val = targetValue
emits('update:modelValue', targetValue)
}
const validateInput = () => {
if (props.rules) {
const allPassed = props.rules.every(rule => {
let passed = true
inputRef.message = rule.message
switch (rule.type) {
case 'required':
passed = (inputRef.val.trim() !== '')
break
case 'email':
passed = emailReg.test(inputRef.val)
break
default:
break
}
return passed
})
inputRef.error = !allPassed
}
}

</script>

方法二:

<script lang="ts">
import { defineComponent, reactive, PropType } from 'vue'
const emailReg = /^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/
interface RuleProp {
type: 'required' | 'email';
message: string;
}
export type RulesProp = RuleProp[]
export default defineComponent({
props: {
rules: Array as PropType<RulesProp>,
modelValue: String // 属性
},
setup(props, context) {
const inputRef = reactive({
val: props.modelValue || '',
error: false,
message: ''
})
const updateValue = (e: Event) => {
const targetValue = (e.target as HTMLInputElement).value
inputRef.val = targetValue
context.emit('update:modelValue', targetValue)
}
const validateInput = () => {
if (props.rules) {
const allPassed = props.rules.every(rule => {
let passed = true
inputRef.message = rule.message
switch (rule.type) {
case 'required':
passed = (inputRef.val.trim() !== '')
break
case 'email':
passed = emailReg.test(inputRef.val)
break
default:
break
}
return passed
})
inputRef.error = !allPassed
}
}
return {
inputRef,
validateInput,
updateValue
}
}
})
</script>

<template>

<div class="validate-input-container pb-3">

<input type="text" class="form-control" :value="inputRef.val" :class="{ 'is-invalid': inputRef.error }"

@blur="validateInput" @input="updateValue">

<span v-if="inputRef.error" class="invalid-feedback">{{ inputRef.message }}</span>

</div>

</template>

结果:方法二不报错,方法一报错



错误信息::

Module ‘".vue"’ has no exported member ‘RulesProp’. Did you mean to use 'import RulesProp from ".vue"’ instead


正在回答 回答被采纳积分+3

1回答

张轩 2023-12-05 08:58:36

同学你好

在 <script setup> 语法糖中,没办法再使用 export 导出任何的变量或者类型。

你可以把它们放置到单独的 ts 文件中中进行导出,或者写两个 script 标签

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信