vue.js - 如何使用 Vue-SweetAlert2 在单个弹出窗口中传递对象输入并更新数据
问题描述
我目前正在尝试制作一个弹出窗口,用户应该在其中填写他或她的个人信息,如以下代码和所附图像所示。
<template>
<v-btn class="create-button" color="yellow" @click="alertDisplay">Create</v-btn>
<br/>
<p>Test result of createCustomer: {{ createdCustomer }}</p>
</div>
</template>
<script>
export default {
data() {
return {
createdCustomer: null
}
},
methods: {
alertDisplay() {
const {value: formValues} = await this.$swal.fire({
title: 'Create private customer',
html: '<input id="swal-input1" class="swal2-input" placeholder="Customer Number">' +
'<select id="swal-input2" class="swal2-input"> <option value="fi_FI">fi_FI</option> <option value="sv_SE">sv_SE</option> </select>'
+
'<input id="swal-input3" class="swal2-input" placeholder="regNo">' +
'<input id="swal-input4" class="swal2-input" placeholder="Address">' +
'<input id="swal-input5" class="swal2-input" placeholder="First Name">' +
'<input id="swal-input6" class="swal2-input" placeholder="Last Name">'
,
focusConfirm: false,
preConfirm: () => {
return [
document.getElementById('swal-input1').value,
document.getElementById('swal-input2').value,
document.getElementById('swal-input3').value,
document.getElementById('swal-input4').value,
document.getElementById('swal-input5').value,
document.getElementById('swal-input6').value
]
}
})
if (formValues) {
this.createdCustomer = this.$swal.fire(JSON.stringify(formValues));
console.log(this.createdCustomer);
}
}
}
}
</script>
这样,我可以让用户填写多个字段,但我想以对象的形式存储“地址”,而不仅仅是一个字符串。
"address": {
"street": "string",
"city": "string",
"country": "string",
"region": "string",
"zipCode": "string"
}
我设法将 6 个输入中的一个更改为“选择”类型而不是“输入”类型,它只允许用户编写一些文本,但是当涉及到由多个字符串组成的对象类型时,我不知道当我需要使用 HTML 和 preConfirm 参数时该怎么做。
我该怎么做?甚至可以首先将“地址”存储为对象吗?
[更新]
我要做的是让用户分别填写“街道”、“城市”、“国家”、“地区”、“邮政编码”中的每一个,如下图所示,
并将它们存储为“地址”对象,如下面的代码
"address": {
"street": "string",
"city": "string",
"country": "string",
"region": "string",
"zipCode": "string"
}
[更新(版本2]
v 模型不工作
async alertDisplay() {
const {value: formValues} = await this.$swal.fire({
title: 'Create private customer',
html: '<input id="swal-input1" class="swal2-input" placeholder="Customer Number">' +
'<select id="swal-input2" class="swal2-input"> <option value="fi_FI">fi_FI</option> <option value="sv_SE">sv_SE</option> </select>'
+
'<input id="swal-input3" class="swal2-input" placeholder="regNo">' +
'<input v-model="createdCustomer.address.street" id="swal-input4" class="swal2-input" placeholder="Address (street)">' +
'<input v-model="createdCustomer.address.city" id="swal-input5" class="swal2-input" placeholder="Address (city)">' +
'<input v-model="createdCustomer.address.country" id="swal-input6" class="swal2-input" placeholder="Address (country)">' +
'<input v-model="createdCustomer.address.region" id="swal-input7" class="swal2-input" placeholder="Address (region)">' +
'<input v-model="createdCustomer.address.zipCode" id="swal-input8" class="swal2-input" placeholder="Address (zipCode)">' +
'<input id="swal-input9" class="swal2-input" placeholder="First Name">' +
'<input id="swal-input10" class="swal2-input" placeholder="Last Name">'
,
focusConfirm: false,
preConfirm: () => {
return [
document.getElementById('swal-input1').value,
document.getElementById('swal-input2').value,
document.getElementById('swal-input3').value,
document.getElementById('swal-input4').value,
document.getElementById('swal-input5').value,
document.getElementById('swal-input6').value,
document.getElementById('swal-input7').value,
document.getElementById('swal-input8').value,
document.getElementById('swal-input9').value,
document.getElementById('swal-input10').value
]
}
})
if (formValues) {
this.createdCustomer = formValues;
console.log('the content of this.createdCustomer');
console.log(this.createdCustomer);
console.log('the content of this.createdCustomer.address');
console.log(this.createdCustomer.address);
}
}
输出
但我希望它像
Test result of createCustomer: [ "JS1", "fi_FI", "123ABC", {"stackoverflow st 12", "San Francisco", "USA", "California", "12345"}, "Shinichi", "Takagi" ]
解决方案
我设法找到了解决此问题的方法,因此我将自己发布答案。
this.createdCustomer = formValues;
问题的根源原来是零件中的单行
if (formValues) {
this.createdCustomer = formValues;
console.log('the content of this.createdCustomer');
console.log(this.createdCustomer);
console.log('the content of this.createdCustomer.address');
console.log(this.createdCustomer.address);
}
我原来的问题帖子。
因为用户输入被存储为 10 个单独的原始数据类型输入,而不是包含多个字符串的对象形式“地址”,所以它是一个分配给this.createdCustomer
from的字符串数组formValues
。
为了解决这个问题,我做了以下两件事。
createdCustomer
以对象的形式声明- 通过引用它的索引号,一个一个地分配 formValues 的每个值(←这是我很久没有意识到的)
至于第一点,我声明createdCustomer
如下。
data() {
return {
createdCustomer: {
customerNumber: null,
locale: null,
regNo: null,
address: {
street: null,
city: null,
country: null,
region: null,
zipCode: null
},
firstName: null,
lastName: null
}
}
},
而关于第二点,我是这样一一提到formValues的索引的。
if (formValues) {
//this.createdCustomer = formValues; // this one line overwrote the entire createdCustomer object, which was the root of the problem
this.createdCustomer.customerNumber = formValues[0];
this.createdCustomer.locale = formValues[1];
this.createdCustomer.regNo = formValues[2];
this.createdCustomer.address.street = formValues[3];
this.createdCustomer.address.city = formValues[4];
this.createdCustomer.address.country = formValues[5];
this.createdCustomer.address.region = formValues[6];
this.createdCustomer.address.zipCode = formValues[7];
this.createdCustomer.firstName = formValues[8];
this.createdCustomer.lastName = formValues[9];
console.log('the content of this.createdCustomer.address');
console.log(this.createdCustomer.address);
console.log('the content of this.createdCustomer.address.street');
console.log(this.createdCustomer.address.street);
}
现在“地址”以“地址”对象的形式传递,输出也如预期的那样。
Test result of createCustomer: { "customerNumber": "JS1", "locale": "fi_FI", "regNo": "123ABC", "address": { "street": "stackoverflow st 12", "city": "San Francisco", "country": "USA", "region": "California", "zipCode": "12345" }, "firstName": "Shinichi", "lastName": "Takagi" }
推荐阅读
- python-3.x - pd.Series 的串联导致 pandas.core.indexes.base.InvalidIndexError
- php - 如何删除身份验证令牌“角色”以实现 MFA 系统?
- angular - serviceFactory 作为提供者对象中的依赖项(deps:[]) - 有可能吗?
- javascript - javascript中的乘法表应该显示一个从10到19开始的表
- eclipse - 如何在 Xtext generator.xtend 中读取 XML 文件
- c++ - 我如何使用 for 循环来比较不同大小的数组
- hibernate - 如何使用基于主键生成的@OneToOne 映射和序列保存父子实体
- php - 多项目文件夹的 Nginx 配置
- tesseract - 我该怎么做(python-Tesseract)?
- google-cloud-platform - 添加发布操作以追加到现有的大查询表时遇到问题?