Как предотвратить бесконечный цикл в react с помощью крючков

#reactjs

Вопрос:

Я работаю над проектом React, В котором у меня есть две кнопки, я применил состояние и функции к обеим кнопкам, но он показывает такую ошибку. пожалуйста, помогите мне решить эту проблему. Он показывает ошибку, подобную этой Ошибке: Слишком много повторных рендеров. React ограничивает количество рендеров, чтобы предотвратить бесконечный цикл.

Это мой код App.js

 import React, { useState } from "react";
import { Button } from "antd"
import 'antd/dist/antd.css';
import "./App.css";

const App = () => {
  const [buttonOne, setButtonOne] = useState({
    backgroundColor: "#b5e5f6",
    color: "black",
    border: "#b5e5f6"
  })

  const buttonOneFun = () => {
    setButtonOne({
      backgroundColor: "#eaeaea",
    color: "black",
    border: "#eaeaea"
    })
  }

  const [buttonTwo, setButtonTwo] = useState({
    backgroundColor: "#eaeaea",
    color: "black",
    border: "#eaeaea"
  })

  const buttonTwoFun = () => {
    setButtonTwo({
      backgroundColor: "#b5e5f6",
      color: "black",
      border: "#b5e5f6"
    })
  }

  return (
    <div>
      <Button style={{backgroundColor: buttonOne.backgroundColor, border: buttonOne.border, color: buttonOne.color}} className="one" type="primary">First</Button>
      <Button onClick={() => buttonTwoFun(), buttonOneFun()} style={{backgroundColor: buttonTwo.backgroundColor, color: buttonTwo.color, border: buttonTwo.border}} className="two" type="primary">Second</Button>
    </div>
  )
}

export default App
 

Комментарии:

1. Я не уверен, но должно () => buttonTwoFun(), buttonOneFun() быть () => { buttonTwoFun(); buttonOneFun() } ?

Ответ №1:

Если вы обернете эти две функции внутри a {} , вы больше не увидите этой ошибки, но я бы посоветовал вам просто использовать одну функцию onClick и установить обе states внутри этой функции.

 import React, { useState } from "react";
import { Button } from "antd"
import 'antd/dist/antd.css';
import "./App.css";

const App = () => {
  const [buttonOne, setButtonOne] = useState({
    backgroundColor: "#b5e5f6",
    color: "black",
    border: "#b5e5f6"
  })

 const [buttonTwo, setButtonTwo] = useState({
    backgroundColor: "#eaeaea",
    color: "black",
    border: "#eaeaea"
  })

  const buttonOneAndTwoFun = () => {
    setButtonOne({
      backgroundColor: "#eaeaea",
    color: "black",
    border: "#eaeaea"
    });
   setButtonTwo({
      backgroundColor: "#b5e5f6",
      color: "black",
      border: "#b5e5f6"
    })
  }

   
 

  return (
    <div>
      <Button style={{backgroundColor: buttonOne.backgroundColor, border: buttonOne.border, color: buttonOne.color}} className="one" type="primary">First</Button>
      <Button onClick={() => buttonOneAndTwoFun()} style={{backgroundColor: buttonTwo.backgroundColor, color: buttonTwo.color, border: buttonTwo.border}} className="two" type="primary">Second</Button>
    </div>
  )
}

export default App
 

Ответ №2:

Попробуйте изменить этот способ

 return (
<div>
  <Button style={{backgroundColor: buttonOne.backgroundColor, border: buttonOne.border, color: buttonOne.color}} className="one" type="primary">First</Button>
  <Button onClick={() => {
      buttonTwoFun(); 
      buttonOneFun();
  }} style={{backgroundColor: buttonTwo.backgroundColor, color: buttonTwo.color, border: buttonTwo.border}} className="two" type="primary">Second</Button>
 </div>
)
 

Комментарии:

1. Привет @Chanuka Sandeepa, я попробовал ваш код, он показывает ошибку, подобную этой, Ожидал вызова назначения или функции, а вместо этого увидел выражение без неиспользуемых выражений