vue 提交具有更新的输入值的表单
vue submit form with updated input values
我有一个简单的隐藏表格
<template>
<form ref="form" method="POST" action="https://target.com/post" accept-charset="utf-8">
<input type="hidden" name="data" :value="myData"/>
<input type="hidden" name="signature" v-model="mySignature" />
<input ref="submit" type="submit">
</form>
</template>
我希望我的方法附加到不同的按钮 (v-on:click="submitForm"
) 以提交此表单设置数据。
export default {
name: 'MyComponent',
methods: {
submitForm() {
// should update values for inputs
this.myData = 'dynamically calculated';
this.mySignature = 'creates signature from data';
// submit the form with values above
this.$refs.form.submit();
},
},
data() {
return {
myData: null,
mySignature: null,
}
}
}
但是好像我误解了reactivity/binding/refs?在Vue中,所以我试过了
this.$refs.submit.click();
this.$forceUpdate();
- 在输入上设置
:value="myData"
/v-model="myData"
和 none 的方法有效。 data
/signature
的表单发送时带有空字段,因此似乎变量未更新或表单无法在一次函数调用中重新呈现。进行此类更新的正确方法是什么?
这似乎是 <form>
的问题,而不是反应性。
您已经定义了一个带有操作 action="https://target.com/post"
的 <form>
元素。这告诉浏览器处理您的表单并将忽略任何 javascript 处理。当用户点击 <input ref="submit" type="submit">
如果您正在构建 SPA,您可能应该只删除表单元素并使用 ajax 调用处理提交。这将使表单交互的处理更加一致,但是您将失去 no-js-enabled 后备功能,但是,鉴于它是由 js 触发的隐藏表单,这可能不是问题。
无论如何,如果你想用一个form
元素来处理它,你可以添加一个@submit
事件处理程序,在处理程序中使用一个e.preventDefault()
来防止表单提交,如果条件不匹配。请务必在多个浏览器上进行测试,因为 chrome 和 firefox 之间在处理表单提交功能方面存在一些不一致。
<template>
<form ref="form" method="POST" action="https://target.com/post" accept-charset="utf-8" @submit="handleSubmitForm">
<input type="hidden" name="data" :value="myData"/>
<input type="hidden" name="signature" v-model="mySignature" />
<input ref="submit" type="submit">
</form>
</template>
export default {
name: 'MyComponent',
methods: {
submitForm() {
// should update values for inputs
this.myData = 'dynamically calculated';
this.mySignature = 'creates signature from data';
// submit the form with values above
this.$refs.form.submit();
},
handleSubmitForm(e) {
if (this.myData !== "what I want") {
e.preventDefault(); // prevent form submit
}
},
},
data() {
return {
myData: null,
mySignature: null,
}
}
}
Vue 执行 DOM 异步更新。
在您的情况下 DOM 更新不会在表单提交之前发生。
解决方法是使用 $nextTick
this.$nextTick(() => {
this.$refs.form.submit();
});
我遇到了同样的问题并找到了以下解决方案:
this.myData = 'dynamically calculated';
this.mySignature = 'creates signature from data';
//force to update form
this.$refs.form.data = this.myData;
this.$refs.form.signature = this.mySignature;
// submit the form with values above
this.$refs.form.submit();
但是,nextTick
方法更好。
我有一个简单的隐藏表格
<template>
<form ref="form" method="POST" action="https://target.com/post" accept-charset="utf-8">
<input type="hidden" name="data" :value="myData"/>
<input type="hidden" name="signature" v-model="mySignature" />
<input ref="submit" type="submit">
</form>
</template>
我希望我的方法附加到不同的按钮 (v-on:click="submitForm"
) 以提交此表单设置数据。
export default {
name: 'MyComponent',
methods: {
submitForm() {
// should update values for inputs
this.myData = 'dynamically calculated';
this.mySignature = 'creates signature from data';
// submit the form with values above
this.$refs.form.submit();
},
},
data() {
return {
myData: null,
mySignature: null,
}
}
}
但是好像我误解了reactivity/binding/refs?在Vue中,所以我试过了
this.$refs.submit.click();
this.$forceUpdate();
- 在输入上设置
:value="myData"
/v-model="myData"
和 none 的方法有效。 data
/signature
的表单发送时带有空字段,因此似乎变量未更新或表单无法在一次函数调用中重新呈现。进行此类更新的正确方法是什么?
这似乎是 <form>
的问题,而不是反应性。
您已经定义了一个带有操作 action="https://target.com/post"
的 <form>
元素。这告诉浏览器处理您的表单并将忽略任何 javascript 处理。当用户点击 <input ref="submit" type="submit">
如果您正在构建 SPA,您可能应该只删除表单元素并使用 ajax 调用处理提交。这将使表单交互的处理更加一致,但是您将失去 no-js-enabled 后备功能,但是,鉴于它是由 js 触发的隐藏表单,这可能不是问题。
无论如何,如果你想用一个form
元素来处理它,你可以添加一个@submit
事件处理程序,在处理程序中使用一个e.preventDefault()
来防止表单提交,如果条件不匹配。请务必在多个浏览器上进行测试,因为 chrome 和 firefox 之间在处理表单提交功能方面存在一些不一致。
<template>
<form ref="form" method="POST" action="https://target.com/post" accept-charset="utf-8" @submit="handleSubmitForm">
<input type="hidden" name="data" :value="myData"/>
<input type="hidden" name="signature" v-model="mySignature" />
<input ref="submit" type="submit">
</form>
</template>
export default {
name: 'MyComponent',
methods: {
submitForm() {
// should update values for inputs
this.myData = 'dynamically calculated';
this.mySignature = 'creates signature from data';
// submit the form with values above
this.$refs.form.submit();
},
handleSubmitForm(e) {
if (this.myData !== "what I want") {
e.preventDefault(); // prevent form submit
}
},
},
data() {
return {
myData: null,
mySignature: null,
}
}
}
Vue 执行 DOM 异步更新。 在您的情况下 DOM 更新不会在表单提交之前发生。
解决方法是使用 $nextTick
this.$nextTick(() => {
this.$refs.form.submit();
});
我遇到了同样的问题并找到了以下解决方案:
this.myData = 'dynamically calculated';
this.mySignature = 'creates signature from data';
//force to update form
this.$refs.form.data = this.myData;
this.$refs.form.signature = this.mySignature;
// submit the form with values above
this.$refs.form.submit();
但是,nextTick
方法更好。