freeCodeCamp/curriculum/challenges/german/03-front-end-development-li.../react/bind-this-to-a-class-method.md

4.8 KiB

id title challengeType forumTopicId dashedName
5a24c314108439a4d4036174 Binde "this" an eine Klassenmethode 6 301379 bind-this-to-a-class-method

--description--

Neben dem Setzen und Aktualisieren des state, kannst du auch Methoden für deine Komponentenklasse definieren. Eine Klassenmethode muss normalerweise das Schlüsselwort this verwenden, damit sie auf Eigenschaften der Klasse (wie state und props) innerhalb des Geltungsbereichs der Methode zugreifen kann. Es gibt ein paar Möglichkeiten, den Methoden deiner Klasse den Zugriff auf this zu ermöglichen.

Eine gängige Methode ist, this explizit im Konstruktor zu verknüpfen, so dass this mit den Methoden der Klasse verbunden wird, wenn die Komponente initialisiert wird. Du hast vielleicht bemerkt, dass die letzte Aufgabe this.handleClick = this.handleClick.bind(this) für ihre Methode handleClick im Konstruktor verwendet. Wenn du dann eine Funktion wie this.setState() innerhalb deiner Klassenmethode aufrufst, bezieht sich this auf die Klasse und ist nicht undefined.

Hinweis: Das this-Schlüsselwort ist einer der verwirrendsten Aspekte von JavaScript, aber es spielt eine wichtige Rolle in React. Obwohl das Verhalten hier völlig normal ist, sind diese Aufgaben nicht der richtige Ort, um this ausführlich zu besprechen, also schau bitte in anderen Aufgaben nach, wenn das oben genannte verwirrend ist!

--instructions--

Der Code-Editor hat eine Komponente mit einem state, die den Text im Auge behält. Sie hat auch eine Methode, mit der du den Text auf You clicked! setzen kannst. Die Methode funktioniert jedoch nicht, weil sie das Schlüsselwort this verwendet, das undefiniert (undefined) ist. Behebe es, indem du this explizit an die Methode handleClick() im Konstruktor der Komponente bindest.

Als Nächstes fügst du dem button-Element in der Render-Methode einen Click-Handler hinzu. Er sollte die Methode handleClick() auslösen, wenn der Button ein Klickereignis erhält. Denke daran, dass die Methode, die du an den onClick-Handler übergibst, geschweifte Klammern braucht, weil sie direkt als JavaScript interpretiert werden soll.

Sobald du die oben genannten Schritte abgeschlossen hast, solltest du auf den Button klicken können und You clicked! sehen.

--hints--

MyComponent sollte ein div-Element zurückgeben, das zwei Elemente umhüllt, einen Button und ein h1-Element, in dieser Reihenfolge.

assert(
  Enzyme.mount(React.createElement(MyComponent)).find('div').length === 1 &&
    Enzyme.mount(React.createElement(MyComponent))
      .find('div')
      .childAt(0)
      .type() === 'button' &&
    Enzyme.mount(React.createElement(MyComponent))
      .find('div')
      .childAt(1)
      .type() === 'h1'
);

Der Zustand von MyComponent sollte mit dem Schlüssel-Wert-Paar { text: "Hello" } initialisiert werden.

assert(
  Enzyme.mount(React.createElement(MyComponent)).state('text') === 'Hello'
);

Wenn du auf das button-Element klickst, sollte die handleClick-Methode ausgeführt werden und der state text auf You clicked! gesetzt werden.

async () => {
  const waitForIt = (fn) =>
    new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 250));
  const mockedComponent = Enzyme.mount(React.createElement(MyComponent));
  const first = () => {
    mockedComponent.setState({ text: 'Hello' });
    return waitForIt(() => mockedComponent.state('text'));
  };
  const second = () => {
    mockedComponent.find('button').simulate('click');
    return waitForIt(() => mockedComponent.state('text'));
  };
  const firstValue = await first();
  const secondValue = await second();
  assert(firstValue === 'Hello' && secondValue === 'You clicked!');
};

--seed--

--after-user-code--

ReactDOM.render(<MyComponent />, document.getElementById('root'))

--seed-contents--

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      text: "Hello"
    };
    // Change code below this line

    // Change code above this line
  }
  handleClick() {
    this.setState({
      text: "You clicked!"
    });
  }
  render() {
    return (
      <div>
        { /* Change code below this line */ }
        <button>Click Me</button>
        { /* Change code above this line */ }
        <h1>{this.state.text}</h1>
      </div>
    );
  }
};

--solutions--

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      text: "Hello"
    };
    this.handleClick = this.handleClick.bind(this);
  }
  handleClick() {
    this.setState({
      text: "You clicked!"
    });
  }
  render() {
    return (
      <div>
        <button onClick = {this.handleClick}>Click Me</button>
        <h1>{this.state.text}</h1>
      </div>
    );
  }
};