javascript - 在函数调用中更改状态并发送 API 调用的值
问题描述
在函数调用中,我想使用 useState 和 api 调用以新值更改状态值。但是状态不会立即改变。在 callAPI() 函数调用上我没有得到新值
import React, { useState } from "react";
export default function App() {
const originalString = "Hello this is my original string";
const [storeString, setstoreString] = useState(
"Hello this is my original string"
);
const [frontend, setFrontend] = useState(false);
const [floating, setFloating] = useState(false);
const callingAPI=(newvalue)=> {
console.log(newvalue);
};
const handleButton = () => {
if (frontend) {
setstoreString(storeString.replace("original", "frontend true"));
}else {
setstoreString(storeString.replace("original", "frontend true"));
}
if (floating) {
console.log("Current Store", storeString);
setstoreString(storeString.replace("string", "floating true"));
}
callingAPI(storeString);
};
return (
<>
<button onClick={() => setFrontend(!frontend)}>Fronend</button>
<button onClick={() => setFloating(!floating)}>Floating</button>
<button onClick={handleButton}>Submit</button>
<div>{storeString}</div>
</>
);
}
单击时我得到以前的值,但是当我第二次单击时我得到新值
解决方案
状态更新是异步的,因此您不会立即收到新值。
解决您的问题的一种干净方法是使用useEffect
钩子并执行以下操作:
import React, { useState, useEffect, useRef } from "react";
export default function App() {
const prevString = useRef();
const [storeString, setstoreString] = useState(
"Frontend: [false] ; Floating: [false]"
);
const [frontend, setFrontend] = useState(false);
const [floating, setFloating] = useState(false);
const callAPI = (newvalue) => {
console.log(newvalue);
};
useEffect(() => {
if (frontend && floating && prevString.current !== storeString) {
callAPI(storeString);
}
prevString.current = storeString;
}, [frontend, floating, storeString]);
const handleButton = () => {
setstoreString((storeString) => {
return storeString.replace(/Frontend: \[(false|true)\]/, () => {
return "Frontend: " + (frontend ? "[true]" : "[false]");
});
});
setstoreString((storeString) => {
return storeString.replace(/Floating: \[(false|true)\]/, () => {
return "Floating: " + (floating ? "[true]" : "[false]");
});
});
};
return (
<>
<button onClick={() => setFrontend(!frontend)}>Frontend</button>
<button onClick={() => setFloating(!floating)}>Floating</button>
<button onClick={handleButton}>Submit</button>
<div>{storeString}</div>
</>
);
}
当您使用 更新状态时setNewValue
,将重新呈现组件。
随着newValue
更改,useEffect
钩子将被触发,您的 API 调用也会被触发。
推荐阅读
- javascript - 根据从 API 检索到的信息更改页面 - Ionic
- php - 单引号字符串和 mysqli_real_scape_string 出错
- string - Scala - 替换字符串中的文本占位符
- docker - 在 docker 中使用 OpenGL 和 nvidia-docker2
- angular5 - 有人在 ng-charts 2 中解决了这个问题吗
- c# - C# Xamarin 计时器类不更新视图
- java - 给定Java中的非负数数组,如何找到可能的最大数
- scala - ScalaMeta、ScalaFix 和 SemanticDB 之间的关系
- git - 我如何在 Github Desktop 中“Git stash”?
- python - 获取嵌套的python dict键和值并放在列表中