I am using useEffect
hook and I have two states.
The two states depend on each other; which means that when I change one state basecurrency
then the other state totalamount
also gets updated and visa versa.
Each state has different functions that are called when states change.
Initially both states are set as value 0.
Challenge
Whenever the component is loaded, the page re-renders continously due to state changes and am not able to enter any input.
useEffect(() => {
getRequest("/user/get-user-details")
.then(d => {
if (d.code == 1) {
localStorage.setItem("username", `${d.user.name}`);
setuseremail(d.user.email);
setusernumber(d.user.mobileNumber);
postEwalletRequest("showEWalletBalance", {
wallet_id: d.user.mobileNumber
})
.then(res => {
console.log(res);
if (res.status == 1) {
setballance(res.data.balance);
}
})
.catch(error => {
console.log(error);
});
inclusiveTask();
exclusiveTask();
}, [basecurrency,totalamount]);
These are the functions:
const inclusiveTask=()=>{
getRequest("/get-all-conversionPricelistforconsumer")
.then(res => {
setCurrList(res.saveConversionPriceList);
setExchangeRate(res.saveConversionPriceList[0].amount);
const converstionPrice = basecurrency * exchangeprice;
// console.log("convert", converstionPrice);
setconvertCurrency(converstionPrice);
console.log("setconvertCurrency", convertcurrency);
const Amount = `${
converstionPrice - (converstionPrice * gatewaycharge) / 100
}`;
setTotalAmount(Amount);
const transfee = Amount - converstionPrice;
setChargeAmount(transfee);
console.log("Amount", Amount);
console.log("transfee", transfee);
})
.catch(error => {
console.log(error);
});
}
const exclusiveTask = () => {
getRequest("/get-all-conversionPricelistforconsumer")
.then(res => {
setCurrList(res.saveConversionPriceList);
setExchangeRate(res.saveConversionPriceList[0].amount);
const Extotal= totalamount/exchangeprice;//100cad
console.log("Extotal", Extotal);
const ExclufeeAmount = `${
totalamount - (totalamount * gatewaycharge) / 100
}`; //28500
console.log("ExclufeeAmount", ExclufeeAmount);
const excluService = totalamount - ExclufeeAmount;//1500
const extracharge = excluService / exchangeprice;//5
console.log("extracharge", extracharge);
const TotalExclusive = Extotal + extracharge;
console.log("TotalExclusive", TotalExclusive);
setCurrency(TotalExclusive);
})
.catch(error => {
console.log(error);
});
};
Please suggest any solution to help me fix this issue.
I think you may be looking for a formulation like this, but it's really hard to tell from such a sprawling question.
The idea here is that
getUserDetails
returns a promise of user details getConversionPriceList
returns a promise the price list data (that was previously in the inclusiveTask/exclusiveTask functions) inclusiveTask
and exclusiveTask
are simple non-async functions that just do maths These are hooked up like so:
useEffect
has no dependencies, ie it's run exactly once, when the component mounts. It calls the user details and price functions and stores those bits in the state.useEffect
is dependent on the user details and price lists, as well as the state for the base currency and amount (whatever those are, I don't know about your business logic). It has a guard to make it not do anything until the loading effects finish.async function getUserDetails() {
const d = await getRequest("/user/get-user-details");
if (d.code !== 1) {
return undefined;
}
localStorage.setItem("username", `${d.user.name}`);
const retVal = {
username: d.user.name,
email: d.user.email,
mobileNumber: d.user.mobileNumber,
balance: undefined,
};
const res = await postEwalletRequest("showEWalletBalance", {
wallet_id: d.user.mobileNumber,
});
if (res.status === 1) {
retVal.balance = res.data.balance;
}
return retVal;
}
async function getConversionPriceList() {
const res = await getRequest("/get-all-conversionPricelistforconsumer");
return {
currList: res.saveConversionPriceList,
exchangeRate: res.saveConversionPriceList[0].amount,
};
}
function inclusiveTask(basecurrency, exchangeprice, gatewaycharge) {
const converstionPrice = basecurrency * exchangeprice;
const Amount =
converstionPrice - (converstionPrice * gatewaycharge) / 100;
const transfee = Amount - converstionPrice;
return { converstionPrice, Amount, transfee };
}
function exclusiveTask(totalamount, exchangeprice, gatewaycharge) {
const Extotal = totalamount / exchangeprice; //100cad
const ExclufeeAmount = totalamount - (totalamount * gatewaycharge) / 100; //28500
const excluService = totalamount - ExclufeeAmount; //1500
const extracharge = excluService / exchangeprice; //5
const TotalExclusive = Extotal + extracharge;
return {
Extotal,
ExclufeeAmount,
excluService,
extracharge,
TotalExclusive,
};
}
function MyComponent() {
const [basecurrency, setBaseCurrency] = useState("USD");
const [totalamount, setTotalAmount] = useState(0);
const [userDetails, setUserDetails] = useState();
const [prices, setPrices] = useState();
const [results, setResults] = useState();
useEffect(() => {
// Need an IIFE here since `useEffect` can not return a promise
(async () => {
setUserDetails(await getUserDetails());
setPrices(await getConversionPriceList());
})();
}, []);
useEffect(() => {
if (!(userDetails && prices)) {
// Not ready to compute yet
return;
}
setResults({
inclusive: inclusiveTask(/* ... */),
exclusive: exclusiveTask(/* ... */),
});
}, [prices, userDetails, basecurrency, totalamount]);
if (results === undefined) {
return <>Still loading...</>;
}
return <>{JSON.stringify(results)}</>;
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.