powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Зачем?
12 сообщений из 12, страница 1 из 1
Зачем?
    #40070424
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
import React, { Component } from 'react';

export class Counter extends Component {
  static displayName = Counter.name;

  constructor(props) {
    super(props);
    this.state = { currentCount: 0 };
    this.incrementCounter = this.incrementCounter.bind(this); 
  }

  incrementCounter() {
    this.setState({
      currentCount: this.state.currentCount + 1
    });
  }

  render() {
    return (
      <div>
        <h1>Counter</h1>

        <p>This is a simple example of a React component.</p>

        <p aria-live="polite">Current count: <strong>{this.state.currentCount}</strong></p>

        <button className="btn btn-primary" onClick={this.incrementCounter}>Increment</button>
      </div>
    );
  }
}
...
Рейтинг: 0 / 0
Зачем?
    #40070460
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и почему?
...
Рейтинг: 0 / 0
Зачем?
    #40070462
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic Hunter,

Потому что incrementCounter() не хранит контекст this.
Можно биндить, мне больше нравится стрелочные функции, они сохраняют this.
Код: javascript
1.
2.
3.
4.
5.
 incrementCounter = () => {
    this.setState({
      currentCount: this.state.currentCount + 1
    });
  }
...
Рейтинг: 0 / 0
Зачем?
    #40070463
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так как setState асинхронный, то вот так

Код: javascript
1.
2.
3.
4.
5.
 incrementCounter = () => {
    this.setState(prevState => {
       return {currentCount: prevState.currentCount + 1}
    })
  }




https://reactjs.org/docs/faq-state.html#:~:text=Currently, setState is asynchronous inside,end of the browser event.
...
Рейтинг: 0 / 0
Зачем?
    #40070464
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и вообще в такой реализации у конструктора будет sideEffect.
Лучше - componentDidMount().
https://reactjs.org/docs/react-component.html#mounting
...
Рейтинг: 0 / 0
Зачем?
    #40070477
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-duke
Ну и вообще в такой реализации у конструктора будет sideEffect.

У автора не "чистая функция", а класс с состоянием. Состояние меняется как в примерах любого учебника по Реакт, т.ч. все тут правильно.
...
Рейтинг: 0 / 0
Зачем?
    #40070486
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вот тут tick() не биндится,. Как он имеет доступ к контексту тогда?

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
import React, { Component } from 'react';

export class Clock extends Component {
    static displayName = Clock.name;

    constructor(props) {
        super(props);
        this.state = { date: new Date() };
    }

    componentDidMount() {
        this.timerID = setInterval(
            () => this.tick(),
            1000
        );
    }

    componentWillUnmount() {
        clearInterval(this.timerID);
    }

    tick() {
        this.setState({
            date: new Date()
        });
    }

    render() {
        return (
            <div>
                <h1>Hello, world!</h1>
                <h2>It is {this.state.date.toLocaleTimeString()}.</h2>
            </div>
        );
    }
}
...
Рейтинг: 0 / 0
Зачем?
    #40070487
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если биньдить то биндить. но во втором примере и так все работает. чо за...?
...
Рейтинг: 0 / 0
Зачем?
    #40070554
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic Hunter , ты не видишь разницы в вызовах?

Один метод вызывается из обработчика ДОМ-документа... Второй вызывается из метода того же класса с использованием стрелочной функции, где this и так есть...
...
Рейтинг: 0 / 0
Зачем?
    #40070555
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic Hunter
если биньдить то биндить.

Перебиндить тут не получится.
Т.е. ты можешь писать как тебе удобнее. Но и другим оставляй право писать как им удобнее.
...
Рейтинг: 0 / 0
Зачем?
    #40070941
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa,

Это равнозначно добавлению addEventListener на кнопку. На tick() слушатель не нужен по определению. Никакого отношения к контекскту это не имеет. Так та.

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
class Toggle extends React.Component {
  constructor(props) {
    super(props);
    this.state = {isToggleOn: true};

    // This binding is necessary to make `this` work in the callback 
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState(state => ({
      isToggleOn: !state.isToggleOn
    }));
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        {this.state.isToggleOn ? 'ON' : 'OFF'}
      </button>
    );
  }
}

ReactDOM.render(
  <Toggle />,
  document.getElementById('root')
);
...
Рейтинг: 0 / 0
Зачем?
    #40070958
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic Hunter , дело конечно твое... Но если работает без bind, а в другом месте не работает - таки разница есть.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Зачем?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]