Хобрук: Ваш путь к мастерству в программировании

установка состояния с помощью onChange в React приводит к тому, что холст равен нулю

У меня есть простое приложение, состоящее из двух компонентов - родительского приложения и дочернего круга. Моя цель - нарисовать круг на холсте (это делает компонент Circle) и иметь ввод, который принимает числовое значение и составляет угол этого числового значения с радиусом. вот так: пример

Проблема в том, что я установил прослушиватель событий onChange с обработчиком на вводе, который должен обновлять мое состояние, но всякий раз, когда я ввожу что-то в поле ввода, он сообщает мне, что мой холст равен нулю, и метод .getContext ("2d") не может быть выполнен, что приводит к сбоям в работе всего приложения. Я погуглил и выяснил, что это связано с тем, что холст отображает после обновления состояния или что-то в этом роде. Я не могу придумать никакого решения, которое сделало бы это возможным. вот мой код:

App.js

import React, { Component } from "react";
import "./App.css";
import { degreesToRadiansFlipped } from "./helpers/helpers";
import Circle from "./components/Circle";
class App extends Component {
  state = { degrees: 0 };
  handleChange = (event) => {
    this.setState({ degrees: event.target.value });
  };

  coordinates = {
    x: Math.cos(degreesToRadiansFlipped(120)) * 100 + 150,
    y: Math.sin(degreesToRadiansFlipped(120)) * 100 + 150
  };
  drawCircle = (context, x, y) => {
    context.beginPath();
    context.arc(150, 150, 100, 0, Math.PI * 2);
    context.moveTo(150, 150);
    context.lineTo(x, y);
    context.stroke();
  };
  render() {
    console.log(this.currentDegreeValue);
    return (
      <div className="main">
        <Circle drawCircle={this.drawCircle} coordinates={this.coordinates} />
        <form>
          <input name="degrees" type="text" onChange={this.handleChange} />
        </form>
      </div>
    );
  }
}

export default App; 

Circle.js

import React, { Component } from "react";
class Circle extends Component {
  componentDidMount() {
    this.props.drawCircle(
      this.context,
      this.props.coordinates.x,
      this.props.coordinates.y
    );
  }
  render() {
    return (
      <canvas
        ref={(canvas) => (this.context = canvas.getContext("2d"))}
        width={300}
        height={300}
      />
    );
  }
}

export default Circle;

Фактическая ошибка:

TypeError: невозможно прочитать свойство getContext со значением null


  • вы пробовали ref={(canvas) => (this.context = canvas!.getContext("2d"))}? 18.04.2019

Ответы:


1

// index.js

import React, { Component } from "react";
import ReactDOM from "react-dom";
import Circle from "./Circle";

class App extends Component {
  state = { degrees: 0, showCirle: false };
  handleChange = event => {
    this.setState({ degrees: event.target.value, showCirle: true });
  };
  degreesToRadiansFlipped(angle) {
    return (angle + Math.PI) % (2 * Math.PI);
  }
  coordinates = {
    x: Math.cos(this.degreesToRadiansFlipped(120)) * 100 + 150,
    y: Math.sin(this.degreesToRadiansFlipped(120)) * 100 + 150
  };
  drawCircle = (context, x, y) => {
    console.log("inside drawcircle");
    context.beginPath();
    context.arc(150, 150, 100, 0, Math.PI * 2);
    context.moveTo(150, 150);
    context.lineTo(x, y);
    context.stroke();
  };
  render() {
    console.log(this.currentDegreeValue);
    return (
      <div className="main">
        {this.state.showCirle && (
          <Circle drawCircle={this.drawCircle} coordinates={this.coordinates} />
        )}
        <form>
          <input name="degrees" type="text" onChange={this.handleChange} />
        </form>
      </div>
    );
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

// Компонент Circel

import React, { Component } from "react";
class Circle extends Component {
  constructor(props) {
    super(props);
  }
  fillContext = () => {
    const canvas = this.refs.canvas
    const ctx = canvas.getContext("2d")
    this.context = ctx
    this.props.drawCircle(
      this.context,
      this.props.coordinates.x,
      this.props.coordinates.y
    );
  }

  componentDidMount() {
    this.fillContext()
  }
  componentDidUpdate() {
    this.fillContext()
  }
  render() {
    return <canvas ref="canvas" width={300} height={300} />;
  }
}

export default Circle;

В вашем примере координаты x и y должны изменяться в зависимости от изменения входного значения, но координаты - это объект с фиксированными значениями x и y. Я считаю, что логика тоже должна измениться.

18.04.2019
Новые материалы

Введение в контекст React
В этом посте мы поговорим о Context API, который был представлен в React 16, и о том, как вы можете их использовать. Что такое контекст? Глядя на определение из react docs , оно..

Шлюз с лицензией OSS, совместимый с Apollo Federation v2, появится в WunderGraph
Сегодня мы рады сообщить, что мы сотрудничаем с поддерживаемой YC Tailor Technologies, Inc. для внедрения Apollo Federation v2. Реализация будет лицензирована MIT (Engine) и Apache 2.0..

Это оно
Ну, я официально уволился с работы! На этой неделе я буду лихорадочно выполнять последние требования Думающего , чтобы я мог сосредоточиться на поиске работы. Что именно это значит?..

7 полезных библиотек JavaScript, которые вы должны использовать в своем следующем проекте
Усильте свою разработку JavaScript Есть поговорка «Не нужно изобретать велосипед». Библиотеки — лучший тому пример. Это поможет вам написать сложные и трудоемкие функции простым способом...

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

C в C.R.U.D с использованием React-Redux
Если вы использовали React, возможно, вы знакомы с головной болью, связанной с обратным потоком данных. Передача состояния реквизитам от родительских компонентов к дочерним компонентам может..

5 обязательных элементов современного инструмента конвейера данных
В цифровом мире предприятия используют конвейеры данных для перемещения, преобразования и хранения огромных объемов данных. Эти конвейеры составляют основу бизнес-аналитики и играют..