Гость
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Зачем? / 12 сообщений из 12, страница 1 из 1
14.05.2021, 18:22
    #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
14.05.2021, 20:19
    #40070460
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем?
и почему?
...
Рейтинг: 0 / 0
14.05.2021, 20:30
    #40070462
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем?
Relic Hunter,

Потому что incrementCounter() не хранит контекст this.
Можно биндить, мне больше нравится стрелочные функции, они сохраняют this.
Код: javascript
1.
2.
3.
4.
5.
 incrementCounter = () => {
    this.setState({
      currentCount: this.state.currentCount + 1
    });
  }
...
Рейтинг: 0 / 0
14.05.2021, 20:32
    #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
14.05.2021, 20:35
    #40070464
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем?
Ну и вообще в такой реализации у конструктора будет sideEffect.
Лучше - componentDidMount().
https://reactjs.org/docs/react-component.html#mounting
...
Рейтинг: 0 / 0
14.05.2021, 22:38
    #40070477
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем?
big-duke
Ну и вообще в такой реализации у конструктора будет sideEffect.

У автора не "чистая функция", а класс с состоянием. Состояние меняется как в примерах любого учебника по Реакт, т.ч. все тут правильно.
...
Рейтинг: 0 / 0
15.05.2021, 00:47
    #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
15.05.2021, 00:49
    #40070487
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем?
если биньдить то биндить. но во втором примере и так все работает. чо за...?
...
Рейтинг: 0 / 0
15.05.2021, 22:32
    #40070554
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем?
Relic Hunter , ты не видишь разницы в вызовах?

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

Перебиндить тут не получится.
Т.е. ты можешь писать как тебе удобнее. Но и другим оставляй право писать как им удобнее.
...
Рейтинг: 0 / 0
17.05.2021, 23:43
    #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
18.05.2021, 08:15
    #40070958
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем?
Relic Hunter , дело конечно твое... Но если работает без bind, а в другом месте не работает - таки разница есть.
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Зачем? / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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