由于项目技术栈有vue,react,我有如下想法:
1.给对应组件封一层,但这样改动量比较大,而且需要所有项目都接入封装的组件
2.统一给axios或干脆给fetch做拦截,处理所有入参的前后空格,但一时也没想到有什么影响,且也需要各系统接入/改造
请问各位大佬有无更合适,侵入性更小的方式
补充:
我想了下还可以委托change事件到body上,然后通过event改变input的value
由于项目技术栈有vue,react,我有如下想法:
1.给对应组件封一层,但这样改动量比较大,而且需要所有项目都接入封装的组件
2.统一给axios或干脆给fetch做拦截,处理所有入参的前后空格,但一时也没想到有什么影响,且也需要各系统接入/改造
请问各位大佬有无更合适,侵入性更小的方式
补充:
我想了下还可以委托change事件到body上,然后通过event改变input的value
可以考虑使用HOC(Higher Order Component)或者装饰器模式给组件进行封装,这样可以避免修改原组件代码。在封装的组件中,可以对输入框的change事件进行拦截,去掉前后空格后再传递给原组件,例如:
import React from 'react';
function trimInputWrapper(WrappedComponent) {
return class TrimInputWrapper extends React.Component {
handleInputChange = (event) => {
const { value } = event.target;
const trimValue = value.trim();
event.target.value = trimValue; // 修改输入框的值
this.props.onChange(event); // 传递给原组件的onChange事件
}
render() {
return <WrappedComponent {...this.props} onChange={this.handleInputChange} />;
}
};
}
export default trimInputWrapper;
使用时只需要将需要去掉前后空格的输入框组件进行封装,例如:
import React from 'react';
import trimInputWrapper from './trimInputWrapper';
class MyInput extends React.Component {
render() {
return <input type="text" {...this.props} />;
}
}
export default trimInputWrapper(MyInput);
对于Vue项目,也可以使用类似的方法进行封装。
关于在axios或fetch中拦截处理前后空格,可以使用axios的拦截器或者fetch的中间件来实现,例如:
import axios from 'axios';
axios.interceptors.request.use(config => {
// 处理所有请求参数的前后空格
const params = config.params || {};
for (const key in params) {
if (typeof params[key] === 'string') {
params[key] = params[key].trim();
}
}
// 处理所有请求体的前后空格
const data = config.data || {};
for (const key in data) {
if (typeof data[key] === 'string') {
data[key] = data[key].trim();
}
}
return config;
}, error => {
return Promise.reject(error);
});
对于fetch的中间件,可以使用类似的方法实现。这样可以避免在每个请求中都手动去掉前后空格。
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
vue 的话,可以使用
.trim
修饰符。统一处理的方案听上去都会存在未知风险,且无法规避。所以建议还是由使用方主动选择。
当然,如果你有固定组件,那么你可以考虑覆盖它。这样行为更加可控。