React的`useEffect`在状态更新时执行。

huangapple go评论103阅读模式
英文:

React useEffect executes every time the state is updated

问题

以下是您提供的React组件代码的翻译部分:

  1. const App = () => {
  2. let webSocket = new WebSocket(WS_URL);
  3. const [image, setImage] = useState({});
  4. const [bannerName, setBannerName] = useState('');
  5. const [bannerId, setBannerId] = useState(0);
  6. useEffect(() => {
  7. webSocket.onopen = (evt) => {
  8. console.log('On open web socket: ', evt);
  9. }
  10. webSocket.onmessage = (evt) => {
  11. console.log('SERVER DATA: ', evt.data);
  12. }
  13. console.log('Ready state: ', webSocket.readyState);
  14. }, []);
  15. const updateImage = (evt) => {
  16. setImage(evt.target.files[0]);
  17. }
  18. const updateBannerName = (evt) => {
  19. setBannerName(evt.target.value);
  20. }
  21. const updateBannerID = (evt) => {
  22. setBannerId(Number(evt.target.value));
  23. }
  24. }

请注意,我已经忽略了您提供的问题,只翻译了您的React组件代码。如果您有任何其他疑问或需要进一步的帮助,请随时提出。

英文:

In my React component I have the following code (I'm gonna exclude the return statement because it's not relevant for this case):

  1. const App = () => {
  2. let webSocket = new WebSocket(WS_URL);
  3. const [image, setImage] = useState({});
  4. const [bannerName, setBannerName] = useState('');
  5. const [bannerId, setBannerId] = useState(0);
  6. useEffect(() => {
  7. webSocket.onopen = (evt) => {
  8. console.log('On open web socket: ', evt);
  9. }
  10. webSocket.onmessage = (evt) => {
  11. console.log('SERVER DATA: ', evt.data);
  12. }
  13. console.log('Ready state: ', webSocket.readyState);
  14. }, []);
  15. const updateImage = (evt) => {
  16. setImage(evt.target.files[0]);
  17. }
  18. const updateBannerName = (evt) => {
  19. setBannerName(evt.target.value);
  20. }
  21. const updateBannerID = (evt) => {
  22. setBannerId(Number(evt.target.value));
  23. }
  24. }

As I understand, if I use the useEffect() hook with an empty dependency array, it should be executed just once (it should work like a componentDidMount when using class components).

The problem is that it's being executed every time I update the state properties. Does anyone know what am I missing here?

Thank you!

答案1

得分: 1

我注意到每次 App 组件代码运行时都会创建一个新的 WebSocket(例如,每次更新状态变量时都会这样)。您是否真的打算这样做?

否则,请更改您的代码,使WebSocket只创建一次。

英文:

I do note that you create a new WebSocket every time the App component code runs (and that is every time you update a state variable for example). Do you really mean to do this?

Otherwise change your code so that the WebSocket is only created once.

huangapple
  • 本文由 发表于 2023年5月7日 04:31:57
  • 转载请务必保留本文链接:https://go.coder-hub.com/76191002.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定