Javascript 如何解决函数中参数的问题?
我有一个函数,我在多个组件中使用它。它从组件收集数据并将其存储在数据库中。我的问题是这个函数有很多参数,其中一些可能没有在某些组件中使用。看一看:Javascript 如何解决函数中参数的问题?,javascript,reactjs,vue.js,Javascript,Reactjs,Vue.js,我有一个函数,我在多个组件中使用它。它从组件收集数据并将其存储在数据库中。我的问题是这个函数有很多参数,其中一些可能没有在某些组件中使用。看一看: export default async function addUserLogs(account, service, terminal,isSaved,isSentToGateway,amount ) { const obj = { serviceID: service, terminalID: terminal, am
export default async function addUserLogs(account, service, terminal,isSaved,isSentToGateway,amount ) {
const obj = {
serviceID: service,
terminalID: terminal,
amountName: account,
amount: amount,
isSaved: isSaved,
isSentToGateway: isSentToGateway,
};
const db = await InitDb();
const tx = db.transaction('userLogs', 'readwrite');
const store = tx.objectStore('userLogs');
const index = await store.put(obj);
let params = {};
if (window.localStorage.getItem('params') !== null) {
params = JSON.parse(window.localStorage.getItem('params'));
}
window.localStorage.setItem(
'params',
JSON.stringify({ ...params, userLogIndex: index })
);
}
例如,我在一个组件上传递给函数的帐户和服务参数,不需要其他参数。在另一个组件中,我只需要传递amount参数,但我需要指定以前的参数以不覆盖其他值。但有一个错误“帐户、服务、终端、isSaved、ISEntToGateway未定义”。你能建议我如何解决这个问题吗?为了更好地理解这个问题并使你的函数更通用,你应该为函数提供默认参数,这样当你不在这里传递任何项目创建时
serviceID: service,
terminalID: terminal,
amountName: account,
amount: amount,
isSaved: isSaved,
isSentToGateway: isSentToGateway,
};
不会破裂。为此,请使用以下格式
export default async function addUserLogs(account="default", service = "default", terminal = "default value",isSaved = "default value",isSentToGateway = "default value",amount = "default Value" )
仅为调用时在其他地方不需要的变量提供默认值
注意:当您调用此函数并提供参数时,它们将替换默认值,但当您不这样做时,函数将使用默认值,因此您的函数不会因未定义的变量而中断在该示例中,您可以为一些不需要的参数设置null,并且在调用函数时不希望使用这些参数 您可以对参数使用一些筛选器,如下所示:
export default async function addUserLogs(account, service, terminal,isSaved,isSentToGateway,amount ) {
const obj = {};
if(account) obj.amountName = account;
if(service) obj.serviceID = service;
if(terminal) obj.terminalID = terminal;
if(isSaved !== null) obj.isSaved = isSaved;
if(isSentToGateway !== null) obj.isSentToGateway = isSentToGateway;
if(amount) obj.amount = amount;
const db = await InitDb();
const tx = db.transaction('userLogs', 'readwrite');
const store = tx.objectStore('userLogs');
const index = await store.put(obj);
let params = {};
if (window.localStorage.getItem('params') !== null) {
params = JSON.parse(window.localStorage.getItem('params'));
}
window.localStorage.setItem(
'params',
JSON.stringify({ ...params, userLogIndex: index })
);
} ```
addUserLogs可以接收带有可选键的对象,并将上次接收的对象与新对象合并:
export default async function addUserLogs(newParams) {
const lastParams = <get the last params from storage>;
const obj = Object.assign(lastParams, newParams);
...
}
// usage examples
addUserLogs({amountName: 'x', serviceID: 1, terminalID: 2, isSaved: true ,isSentToGateway: false, amount: 10});
addUserLogs({isSentToGateway: false, amount: 10});
addUserLogs({amountName: 'x', serviceID: 1, terminalID: 2});
导出默认异步函数addUserLogs(newParams){
常量lastParams=;
const obj=Object.assign(lastParams,newParams);
...
}
//用法示例
addUserLogs({amountName:'x',serviceID:1,terminalID:2,isSaved:true,IsEntToGateway:false,amount:10});
addUserLogs({isSentToGateway:false,amount:10});
addUserLogs({amountName:'x',serviceID:1,terminalID:2});
如果您想对addUserLogs签名更具声明性,可以执行以下操作链接:
export default async function addUserLogs({amountName, serviceID, terminalID, isSaved ,isSentToGateway, amount}) {
const lastParams = <get the last params from storage>;
const newParams = {
amountName: amountName || lastParams.amountName,
serviceID: serviceID || lastParams.serviceID,
terminalID: terminalID || lastParams.terminalID,
isSaved: isSaved === undefined ? lastParams.isSaved : isSaved,
isSentToGateway: isSentToGateway === undefined ? lastParams.isSentToGateway : isSentToGateway,
amount: amount === undefined ? lastParams.amount : amount
};
...
}
导出默认异步函数addUserLogs({amountName、serviceID、terminalID、isSaved、isSentToGateway、amount}){
常量lastParams=;
常量newParams={
amountName:amountName | | lastParams.amountName,
serviceID:serviceID | | lastParams.serviceID,
terminalID:terminalID | | lastParams.terminalID,
isSaved:isSaved==未定义?lastParams.isSaved:isSaved,
isSentToGateway:isSentToGateway==未定义?lastParams.isSentToGateway:isSentToGateway,
金额:金额===未定义?lastParams.amount:金额
};
...
}
在JS中,参数是可选的,所以除了在函数中设置一个条件if(arg1){do something}
等,您不需要做任何事情。因为您在创建obj
时访问了它,但没有传递它,所以会出现错误。你应该让那些不是强制性的有默认值,这样当你不提供它们的时候就不会有任何问题。我认为你应该参考它,我认为你应该参考它-