このように_v-form
_を作成しました
_<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
_
console.log(this.$ref.form)
だけの場合、validate()関数が使用可能です。しかし、ビルド中にこのエラーが発生するのはなぜですか?
シンプル:
(this.$refs.form as Vue & { validate: () => boolean }).validate()
代替(コンポーネントでthis.$refs.form
を複数回参照する場合はこれを使用):
computed: {
form(): Vue & { validate: () => boolean } {
return this.$refs.form as Vue & { validate: () => boolean }
}
} // Use it like so: this.form.validate()
再利用可能(アプリケーション全体でv-form
コンポーネントを複数回使用する場合はこれを使用):
// In a TS file
export type VForm = Vue & { validate: () => boolean }
// In component, import `VForm`
computed: {
form(): VForm {
return this.$refs.form as VForm
}
}
Vue
テンプレート構文では、ref
インスタンスまたはDOM要素のVue
属性を使用できます。 ref
がv-for
ループで使用されている場合、Vue
インスタンスまたはDOM要素の配列が取得されます。
これが、this.$refs
がVue | Element | Vue[] | Element[]
を返すことができる理由です。
TypeScript
がどのタイプが使用されているかを知るために、値をキャストする必要があります。
次のいずれかを実行できます。
(this.$refs.form as Vue).validate()
または(<Vue>this.$refs.form).validate()
v-form
はVue
ではなくVue
インスタンス(コンポーネント)であるため、Element
にキャストします。
私の個人的な好みは、既にキャストされたVue
インスタンスまたはDOM要素を返す計算プロパティを作成することです。
すなわち。
computed: {
form(): Vue {
return this.$refs.form as Vue
}
}
v-form
インスタンスには、ブール値を返すvalidate
メソッドがあるため、交差タイプリテラルを使用する必要があります。
computed: {
form(): Vue & { validate: () => boolean } {
return this.$refs.form as Vue & { validate: () => boolean }
}
}
その後、次のように使用できます:this.form.validate()
より良い解決策は、交差点を持つタイプを作成して、複数のコンポーネントで再利用できるようにすることです。
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と同じ最初のステップを調査してconsole.log(this.$ref.form)
を実行しました。コンソールの出力は実際には[VueComponent]の配列であり、validate()
関数はそのコンテキストに存在しません。
validate()
を実行することで、フォームのthis.$ref.form[0].validate()
関数にアクセスできました