前言:一个函数的参数越少越好,并不是参数少或不传更优雅,而是有其他方案来优化长参数。一个函数的参数尽量不要超过3个,如果超过了这个限制,那么代码的坏味道就产生了。
一、整合参数
如果参数很多,那么第一就要考虑,这些参数是否存在关联?若存在是否可以归为一组?
badCase:
function updateElements(element1, text1, element2, text2, element3, text3) {
element1.innerText = text1;
element2.innerText = text2;
element3.innerText = text3;
}
// 使用该函数
const header = document.getElementById('header');
const mainContent = document.getElementById('main-content');
const footer = document.getElementById('footer');
updateElements(header, 'Welcome!', mainContent, 'This is the main content.', footer, 'Goodbye!');
goodCase:
function updateElements(elements) {
for (const key in elements) {
if (elements.hasOwnProperty(key) && document.getElementById(key)) {
const element = document.getElementById(key);
element.innerText = elements[key];
}
}
}
// 使用该函数
updateElements({
'header': 'Welcome!',
'main-content': 'This is the main content.',
'footer': 'Goodbye!'
});
二、避免静态数据做参数传递
静态的变量尽量直接使用,避免产生多余的参数。
badCase:
created () {
this.getUserInfo(this.$router.query.id)
},
methods: {
getUserInfo(id) {
axios.get('/user', {
params: {
id
}
})
}
}
goodCase:
created () {
this.getUserInfo()
},
methods: {
getUserInfo() {
axios.get('/user', {
params: {
id: this.$router.query.id || ''
}
})
}
}
三、组件中的父传子的参数较多
避免父传子的参数过多
badCase:
<template>
<div>
<ChildComponent
:name="name"
:email="email"
:age="age"
:theme="theme"
:notifications="notifications"
:language="language"
/>
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
},
data() {
return {
name: 'John Doe',
email: 'john.doe@example.com',
age: 30
theme: 'dark',
notifications: true,
language: 'en'
}
};
}
</script>
goodCase:
<template>
<div>
<ChildComponent :userInfo="userInfo" :userSettings="userSettings" />
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
},
data() {
return {
userInfo: {
name: 'John Doe',
email: 'john.doe@example.com',
age: 30
},
userSettings: {
theme: 'dark',
notifications: true,
language: 'en'
}
};
}
}
</script>
四、子组件中需要父组件的所有属性
<custom-input v-bind="$attrs" />