Как я могу использовать переменные в React?

#javascript #reactjs

Вопрос:

Я хочу получить ввод в начале веб-страницы от пользователя о его/ее имени и отобразить его на экране. Я создал переменную let componentDidMount , но она запрашивает снова и снова бесконечно. И в других методах это говорит fullname undefined об обратном . Как правильно это сделать?

 import './App.css';
import React, { Component } from 'react';
import Clock from './Clock';

class App extends Component {
  state = {
    secondRatio: 0,
    minuteRatio: 0,
    hourRatio: 0
  }

  getName() {
    let fullname = prompt("Lutfen isim giriniz:");
    return fullname;
  }

  componentDidMount() {
    setInterval(() => (
      this.setClock()
    ), 1000);
    console.log(this.fullname);
  }

  setClock = () => {
    const currentDate = new Date;
    let secondRatio = currentDate.getSeconds() / 60;
    let minuteRatio = (secondRatio   currentDate.getMinutes()) / 60;
    let hourRatio = (minuteRatio   currentDate.getHours()) / 12;
    this.setState({ secondRatio: secondRatio });
    this.setState({ minuteRatio: minuteRatio });
    this.setState({ hourRatio: hourRatio });
  }

  render() {
    const { secondRatio, minuteRatio, hourRatio } = this.state;

    return (
      <fragment>
        <div>  <h1 className="text1">Hello, {this.getName().fullname} ! Welcome! </h1>
          <div className="test"><Clock secondRatio={secondRatio} minuteRatio={minuteRatio} hourRatio={hourRatio} />
          </div>
        </div>
      </fragment>
    );
  }
}

export default App;
 

Ответ №1:

В fullname вашем классе нет свойства, поэтому this.fullname оно есть всегда undefined . Это не связано с fullname переменной, используемой в getName методе.

Что вы могли бы сделать, так это создать fullname свойство в своем классе и присвоить этому свойству запрошенное значение в componentDidMount :

 class App extends Component {
  fullname = undefined;

  state = {
    secondRatio: 0,
    minuteRatio: 0,
    hourRatio: 0
  };

  getName() {
    this.fullname = prompt("Lutfen isim giriniz:");
  }

  componentDidMount() {
    this.getName();
    setInterval(() => (
      this.setClock()
    ), 1000);
  }

  setClock = () => {
    const currentDate = new Date;
    let secondRatio = currentDate.getSeconds() / 60;
    let minuteRatio = (secondRatio   currentDate.getMinutes()) / 60;
    let hourRatio = (minuteRatio   currentDate.getHours()) / 12;
    this.setState({ secondRatio: secondRatio });
    this.setState({ minuteRatio: minuteRatio });
    this.setState({ hourRatio: hourRatio });
  };

  render() {
    const { secondRatio, minuteRatio, hourRatio } = this.state;

    return (
      <fragment>
        <div>  <h1 className="text1">Hello, {this.fullname} ! Welcome! </h1>
          <div className="test"><Clock secondRatio={secondRatio} minuteRatio={minuteRatio} hourRatio={hourRatio} />
          </div>
        </div>
      </fragment>
    );
  }
}
 

Ответ №2:

другой способ

 import './App.css';
import React, { Component } from 'react';
import Clock from './Clock';


class App extends Component {

  state = {
    secondRatio: 0,
    minuteRatio: 0,
    hourRatio: 0,
    fullname: '',
  }

  componentDidMount() {
    let fullname = prompt("Lutfen isim giriniz:");
    this.setState({ ...this.state, fullname });
    setInterval(() => (
      this.setClock()
    ), 1000);
    console.log(this.state.fullname);
  }

  setClock = () => {
    const currentDate = new Date;
    let secondRatio = currentDate.getSeconds() / 60;
    let minuteRatio = (secondRatio   currentDate.getMinutes()) / 60;
    let hourRatio = (minuteRatio   currentDate.getHours()) / 12;
    this.setState({ secondRatio: secondRatio });
    this.setState({ minuteRatio: minuteRatio });
    this.setState({ hourRatio: hourRatio });
  }

  render() {

    const { secondRatio, minuteRatio, hourRatio } = this.state;

    return (
      <fragment>
        <div>  <h1 className="text1">Hello, {this.state.fullname} ! Welcome! </h1>
          <div className="test"><Clock secondRatio={secondRatio} minuteRatio={minuteRatio} hourRatio={hourRatio} />
          </div>
        </div>
      </fragment>
    );
  }
}

export default App;