【发布时间】:2021-01-22 14:47:27
【问题描述】:
我在 v-on 处理程序中遇到错误:“TypeError: this.$refs.EmailMessage.validate 不是我在控制台中单击发送时表单上的函数以及 this.$refs.EmailMessage.validate 不是一个函数。
我创建了一个 Mapactions 我将 Payload 提交到 emailjs 服务器
我已经在其他地方测试过 $refs 并且它做同样的事情。会不会是 Vuejs 有错误?还是我在做傻事?
我的联系页面中的表单
<v-form ref="EmailMessage" v-model="valid" lazy-validation>
<v-text-field
solo
:rules="[required]"
v-model="fd.name"
label=" Name & Surname"
name="nameSurname"
type="text"
required
></v-text-field>
<v-text-field
solo
:rules="emailRules"
v-model="fd.email"
label="E-mail address"
name="emailAddress"
required
></v-text-field>
<v-textarea
solo
v-model="fd.Message"
:rules="[required]"
label="Message"
name="Message"
required
></v-textarea>
<p class="text-right red--text ma-0 py-3" v-if="emailError">
{{ emailError }}
</p>
<v-btn
color="#212529"
dark
@click="validate()"
:loading="loading"
:disabled="!valid"
block
>SEND</v-btn
>
</v-form>
我处理联系表单发送和重置的方法
<script>
import { mapState } from "vuex";
import { mapActions } from "vuex";
import emailjs from "emailjs-com";
export default {
data: () => ({
emailError: null,
valid: true,
loading: false,
required: (v) => !!v || "This field is required",
emailRules: [
(v) => !!v || "E-mail is required",
(v) => /.+@.+\..+/.test(v) || "E-mail must be valid",
],
///////////
fd: {
name: process.env.NODE_ENV == "development" ? "Test name" : null,
email: process.env.NODE_ENV == "development" ? "email@gmail.com" : null,
Message: process.env.NODE_ENV == "development" ? "Hello World" : null,
},
}),
methods: {
...mapActions(["sendMail"]),
validate() {
if (this.$refs[`EmailMessage`].validate()) {
this.loading = true;
emailjs
.send(
"gmail_service_id",
"ContactForm",
this.fd,
"userIDhere"
)
.then((result) => {
console.log("SUCCESS!", result.status, result.text);
this.loading = false;
this.resetForm();
})
.catch((e) => {
console.log("Error", e);
this.loading = false;
this.emailError = "Error while trying to send email";
});
}
},
resetForm() {
this.$refs[`EmailMessage`].reset();
},
contactImage: function (path) {
return require("@/" + path);
},
},
computed: {
...mapState("staticData", ["contact", "contactSocialMedia"]),
},
};
</script>
我在商店 index.js 中的操作
actions: {
sendMail: ({
commit
}, pl) => new Promise((resolve, reject) => {
if (pl.name) {
console.log('PL recieved: ', pl)
resolve('email is sent')
} else {
reject('email is not sent')
}
}),
},
非常感谢您的帮助。
【问题讨论】:
-
删除按钮元素中处理程序中的括号。应该是
@click="validate"尝试将ref从EmailMessage重命名为form失败,这样您就可以使用this.$refs.form.validate(); -
您能否编辑此codepen 以重现该问题?
-
@S.Ramjit 都失败了。最终以两种方式说它未定义
[Vue warn]: Error in v-on handler: "TypeError: this.$refs.form is undefined"TypeError: this.$refs.form is undefined -
@tony19 我正在尝试这样做,但我的地图操作给我带来了问题
-
mapActions似乎与问题无关。
标签: javascript vue.js vuetify.js