背景
在开发表单过程,有的字段在某些场景下可能没有实际值,传递的还是初始值(比如空字符串''
,空对象指针null
和未定义值undefined
),在我的项目中,会转换为JSON
字符串后给到后端的同学,经常会遇到数据类型匹配不上的问题,双方的矛盾出现了233~
思路
基础版本
比如一个整型数据类型的表单字段,在前端初始化时是null
,该字段是非必填项,用户没有输入,到后端就直接报错,提示这个用户类型有问题,那么在页面里,提交表单之前,进行字段进行摘除或者赋予一个初始值(类型为后端可接受的)。
// 移除该字段(项目使用的)
delete postForm.xxx
// 或者赋予一个初始值(类型为后端可接受的)
postForm.xxx = {}
postForm.xxx = 0
进阶版本
上面的解决方法在涉及数据转换的页面较少的情况下,暂时可以,但是如果页面比较多,每个页面都需要手动处理下,这时业务代码和数据转换杂糅在一块,会影响业务代码的可读性,所以不是很建议,最好在某一个地方统一进行过滤处理,我的项目中是使用axios
库发送请求,所以可以在axios
的请求拦截器中,对数据进行统一过滤
- axios的请求数据
在我的项目中,请求的数据一般放在axios.config的params
或者data
中,所以在进行过滤时,仅过滤这两个字段中的数据,这里需要结合项目的实际情况进行处理
请求api一般如下
// post请求的参数放在data
export function createUser(data) {
return request({
url: `/user`,
method: 'post',
data
})
}
// 多个参数的get请求,参数放在params
export function userList(params) {
return request({
url: `/user`,
method: 'get',
params
})
}
实现
- 过滤函数
过滤config.data
和config.params
两个属性里的参数
// 移除空字符串,null, undefined
function clearEmptyParam(config) {
['data', 'params'].forEach(item => {
if (config[item]) {
const keys = Object.keys(config[item])
if (keys.length) {
keys.forEach(key => {
const rawType = toRawType(config[item])
if (['', undefined, null].includes(config[item][key]) &&
['Object'].includes(rawType)) {
delete config[item][key]
}
})
}
}
})
}
/**
* @description 获取原始类型
* @param {*} value
* @returns {String} 类型字符串,如'String', 'Object', 'Null', 'Boolean', 'Number', 'Array'
*/
export function toRawType(value) {
return Object.prototype.toString.call(value).slice(8, -1)
}
- 在axios请求拦截器中使用
const httpIns = axios.create({
// axios中请求配置有baseURL选项,表示请求URL公共部分
baseURL: process.env.VUE_APP_BASE_API,
// 超时时间
timeout: 15000
})
// request拦截器
httpIns.interceptors.request.use(
config => {
// ...略略略
// 移除params和data中空参数
clearEmptyParam(config)
return config
},
error => {
return Promise.reject(error)
}
)
- post请求:如果页面中调用
createUser
接口,传递如下
createUser({
username: 'laststardust',
password: 'laststardust666',
is_married: '', // 非必填项,如果有值,是一个整数
})
经过axios
的请求拦截器里的clearEmptyParam
函数处理后,结果如下:
{
username: 'laststardust',
password: 'laststardust666'
}
可以看到is_married
字段被移除了
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!