0

пользователи. Мне необходимо изменять текст отображенный после рендера React компонента. Вопросов с обычными цифрами и строками не возникает, но дело дошло до массива. Начал использовать state внутри компонента, и снова вылетала ошибка. Из текста ошибки в консоли пологаю что код не может вызвать функцию, изменяющую state.

Кусок исходника где всё умирает:

class UserStats extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      ActiveTab: "profile",
      topOrders: null,
    };
    this.changeTop = this.changeTop.bind(this);
  }

changeTop = (item) => { console.log(item); this.setState({ topOrders: item, }); };

render() { const { topOrders } = this.state; return ( <Card> <Card.Body className="text-center"> <Card.Title>Ваша статистика</Card.Title> <Card.Text> <InputGroup className="mb-3"> <Form.Control type="date" id="start_date" /> <Form.Control type="date" id="end_date" /> <Button variant="outline-secondary" size="sm" id="stats-button" onClick={function handleClick() { var btn = document.getElementById("stats-button"); btn.setAttribute("disabled", "disabled"); var sdate = document.getElementById("start_date").value; var edate = document.getElementById("end_date").value; fetch("http://localhost:5000/api/v1/stats/", { method: "POST", headers: { Accept: "application/json", "Content-Type": "application/json; charset=UTF-8", }, body: JSON.stringify({ id: localStorage.getItem("userid"), start_date: sdate, end_date: edate, }), }).then((res) => { fetch( "http://localhost:5000/api/v1/stats/?start_date=" + sdate + "&end_date=" + edate + "&id=" + localStorage.getItem("userid") ) .then((res) => res.json()) .then((result) => { if (!result.succes) { alert("Произошла ошибка\n" + result.message); return; } document.getElementById("buysValue").textContent = result.data.orders + " шт"; document.getElementById("buysSumm").textContent = result.data.ordersMoney + "₽"; document.getElementById("ordersValue").textContent = result.data.buys + " шт"; document.getElementById("ordersSumm").textContent = result.data.buysMoney + "₽"; const listItems = result.data.topOrders.map((item) => ( <Row> item {/* {item.map((nm, val) => ( <> <Col>{nm}</Col> <Col>{val}</Col> </> ))} */} </Row> )); // changeTop(<>{listItems}</>); // this.changeTop(listItems); this.changeTop(<Row>123</Row>); }); });

              btn.removeAttribute("disabled");
            }}
          &gt;</code></pre>

Скрин ошибки: Консоль Firefox

  • не стоит смешивать реактовый код и доступ к DOM напрямую - это приводит к запутанности и тяжелой отладке – Grundy Nov 30 '23 at 16:54
  • Ошибка говорит, что там гед вы обращаетесь к this, его там не существует. Первое: Все селекторы вида document.getElement* должны быть убраны из кода, второе, вынесете все обработчики клика в отдельные методы. Ошибка у вас в строке 96, но вот по предоставленному коду не понятно, где такая строка – SwaD Nov 30 '23 at 16:56
  • @SwaD я не имею достаточно опыта, чтобы делать иначе. Ошибка начинается с обработки нажатия кнопки с id='stats-button'. В ней функция onClick. – Vladimir bab0n Stern Nov 30 '23 at 17:03
  • для решения достаточно вынести onClick в метод и сделать его по аналогии с changeTop – Grundy Nov 30 '23 at 20:10
  • @Grundy, я так и поступил прислушавшись к SwaD. Спасибо большое за помощь – Vladimir bab0n Stern Nov 30 '23 at 20:27

0 Answers0