vue의 유형 스크립트 - 'validate' 속성이 'Vue | Element | Vue[] | Element[]' 유형에 없습니다.
나는 이렇게 창조했다
<v-form ref="form" v-model="valid" lazy-validation>
...
<v-btn
:disabled="!valid"
@click="submit"
>
submit
</v-btn>
</v-form>
스크립트:
if (this.$refs.form.validate()) // Error is in here
validate() 기능만 사용할 수 있는 경우. 그런데 왜 이런 오류가 생기는 걸까요?
솔루션:
단순:
(this.$refs.form as Vue & { validate: () => boolean }).validate()
대안:
computed: {
form(): Vue & { validate: () => boolean } {
return this.$refs.form as Vue & { validate: () => boolean }
}
} // Use it like so: this.form.validate()
재사용 가능:
// In a TS file
export type VForm = Vue & { validate: () => boolean }
// In component, import `VForm`
computed: {
form(): VForm {
return this.$refs.form as VForm
}
}
설명:
템플릿 구문에서 인스턴스 또는 DOM 요소의 속성을 사용할 수 있습니다. 루프에서 사용되는 경우 인스턴스 또는 DOM 요소의 배열이 검색됩니다.
그래서 둘 중 하나가 돌아올 수 있는 것이다.
어떤 유형이 사용되고 있는지 알기 위해서는 값을 캐스팅해야 합니다.
다음 중 하나를 수행할 수 있습니다:
또는
이 인스턴스(구성 요소)이기 때문에 에 캐스팅했습니다.
내 개인적인 선호는 이미 캐스팅된 인스턴스 또는 DOM 요소를 반환하는 계산된 속성을 만드는 것이다.
예를 들면.
computed: {
form(): Vue {
return this.$refs.form as Vue
}
}
인스턴스에 부울을 반환하는 메서드가 있으므로 교차 유형 리터럴을 사용해야 합니다:
computed: {
form(): Vue & { validate: () => boolean } {
return this.$refs.form as Vue & { validate: () => boolean }
}
}
그러면 다음과 같이 사용할 수 있습니다:
더 나은 해결책은 교차점이 있는 유형을 만들어 여러 구성요소에서 재사용할 수 있도록 하는 것입니다.
export type VForm = Vue & { validate: () => boolean }
그런 다음 구성 요소로 가져옵니다:
computed: {
form(): VForm {
return this.$refs.form as VForm
}
}
let form: any = this.$refs.form
if(form.validate){}
StackOverflow가 처음이라 이에 대한 솔루션을 제공하고 싶었기 때문에 수락된 솔루션에 대해 언급할 수 없었습니다. OP와 동일한 초기 단계를 수행하여 을 수행했는데, 콘솔의 출력은 실제로 [VueComponent]의 배열이며 기능은 해당 컨텍스트에 존재하지 않습니다.
나는 양식에 있는 기능에 접속할 수 있었다
아무도 하지 않았어요. 나는 검증을 받고 양식 작업을 약속하려고 노력하고 있었다.
에 따라
다음을 사용하여 유형 스크립트로 값 구성 요소를 작성하는 경우
export default Vue.extend({})
그럼 하다
import { ValidationObserver, ValidationProvider, extend } from "vee-validate";
import { required } from "vee-validate/dist/rules";
import Vue, { VueConstructor } from "vue";
export default (Vue as VueConstructor<
Vue & {
$refs: {
form: InstanceType<typeof ValidationProvider>;
};
}
>).extend({
methods: {
saveEntity() {
if (this.loading) return;
console.log(this.entity);
this.$refs.form.validate().then(success => {
if (!success) {
console.log("not valid");
return;
}
console.log("valid");
});
}
}
})
그러면 ValidationObserver ref="form"이 올바르게 검증됩니다.
와 함께 사용하면 다음과 같이 수행할 수 있습니다:
vuetify 폼 기능을 사용하여 새 유형을 정의합니다:
export type VForm = Vue & {
validate: () => boolean;
resetValidation: () => boolean;
reset: () => void;
};
그런 다음 구성 요소로 가져옵니다:
import { VForm } from "types";
import { Component, Ref} from "vue-property-decorator";
구성 요소에서 @Ref를 사용하여 양식을 정의합니다:
export default class YourComponent extends Vue {
@Ref("form") readonly form!: VForm;
}
따라서 다음과 같이 사용할 수 있습니다:
this.form.validate();
this.form.resetValidation();
this.form.reset();
유형 스크립트가 있는 vue 3의 경우 다음과 같은 작업이 가능했습니다:
<script setup lang="ts">
import { VForm } from 'vuetify/components'
import { ref } from 'vue';
const form = ref(VForm); // here I just put the type of the form.
const logUser = async () => {
const { valid } = await form.value.validate()
console.log("The form is:", valid);
}
</script>
'개발하자' 카테고리의 다른 글
서버리스 실패를 통한 유형 스크립트 컴파일 (0) | 2023.06.10 |
---|---|
파이썬에서 그래프 3개를 위에 2개, 아래 축에 1개씩 플롯하시겠습니까? (1) | 2023.06.09 |
떨림: 대화 페이지 하단 텍스트 표시줄을 만드는 방법 (0) | 2023.06.08 |
VSCodeJupyter가 python 커널에 연결되지 않음 (0) | 2023.06.07 |
IPython/Jupiter 노트북 내부의 SQL 쿼리 형식 지정 (0) | 2023.06.07 |