Определение внутренних переменных класса внутри методов класса с использованием Javascript?

Эти вопросы на самом деле связаны с React JS. Можно ли определять внутренние переменные класса внутри одного из методов класса, а затем использовать его в других методах? Я хочу сделать что-то вроде этого:

class Something extends React.Component {
  state = {
      value: 'doesnt matter'
  };

  something = () => {
    //a lot is happening in here and at some point I define this.thing
    this.thing = 1;
  }

  increase = () => {
    if (this.thing) {
      this.thing += 1;
    }
  }

  decrease = () => {
    if (this.thing && this.thing > 0) {
      this.thing -= 1;
    }
  }

  render() {
    return (
      <span>this.state.value</span>
    );
  }
}

Дело в том, что мне не нужно помещать этот this.thing в качестве значения состояния, потому что он мне нужен только для внутренних целей. Имейте в виду, что этот код является всего лишь примером, реальный код немного сложнее, но главный вопрос: можно ли определять внутренние переменные класса (this.thing), как я это делаю в моем примере? А может мне стоит поступить иначе? Что было бы лучше всего?

Переменная «вещь» является классом переменных, и к ней можно получить доступ во всех методах, которые вы определяете в этом классе. То же самое, если вы исправите его в своем состоянии: state = {value: "...", thing: null}

Danilo Assis Nobre dos Santos 09.12.2018 00:23

Вы можете проверить medium.freecodecamp.org/… Просто использовать this, как будто вы делаете, похоже, хороший вариант

CertainPerformance 09.12.2018 00:23

@DaniloAssisNobredosSantos. Это хорошая идея, если изменение в thing обязательно должно вызывать повторный рендеринг - в противном случае, я думаю, лучше всего хранить thing в другом месте.

CertainPerformance 09.12.2018 00:25

Возможный дубликат Свойство экземпляра в классе React ES6

misraX 10.12.2018 21:12
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
215
2

Ответы 2

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

class Something extends React.Component {
  constructor(props) {
    super(props);
    // Your thing
    this.thing = 0;
    this.state = {
      value: "doesnt matter."
    };
  }

  something = () => {
    //a lot is happening in here and at some point I define this.thing
    this.thing = 1;
  };

  increase = () => {
    if (this.thing) {
      this.thing += 1;
    }
  };

  decrease = () => {
    if (this.thing && this.thing > 0) {
      this.thing -= 1;
    }
  };

  render() {
    this.something();
    console.info(this.thing); // will equal 1.
    return <span>{this.state.value}</span>;
  }
}

да, я знаю, что могу использовать конструктор и определять там переменные, но вопрос в том, необходимо ли определять все переменные this.something в конструкторе? если да, то почему? Еще одна вещь, касающаяся повторного рендеринга, мне не нужен компонент для повторного рендеринга, когда это значение изменяется, поэтому я знаю об этом. Вопрос все еще остается, это нормальная практика или неправильно использовать такие шаблоны с this.thing, которые я использую в моем примере? :)

tdk 09.12.2018 00:46

Это не проблема и ничего плохого, прежде всего, React - это javascript, а это. {Anything} - действительный прототип класса / объекта.

misraX 09.12.2018 00:52

Итак, нет никаких правил / передовых практик, как и когда это. {что-нибудь} можно определить?

tdk 09.12.2018 10:42

В конструкторе проверьте, как он определен и как транслируется за сценой с помощью babel stackoverflow.com/questions/35774928/…

misraX 09.12.2018 21:02

I don't need to put that this.thing as a state value, because I only need it internally.

state компонента React также следует использовать только для внутренних целей.

What would be the best practice?

Вы можете использовать переменные экземпляра (ivars) вместо состояния повысить производительность, потому что вы можете уменьшить нагрузку на очередь событий. С эстетической точки зрения, ivars часто требует меньше кода. Но обновления состояния обычно предпочтительнее, потому что они запускают повторную визуализацию; эта гарантия делает ваш код легче думать о, так как визуализация никогда не устаревает. В вашем случае функция рендеринга не зависит от this.thing, поэтому можно сохранить ее в ivar.

Как правило, лучше всего инициализировать ivars в конструктор, потому что он запускается первым, поэтому this.thing гарантированно будет готов для использования другими методами:

constructor(props) {
  super(props);
  this.thing = 0;
}

Я не понимаю, как работает конструктор, и знаю рабочий процесс состояний. Я не уверен в том, могу ли я определять ivars, где хочу, или для этого есть какие-то правила / лучшие практики? Типа, действительно ли нужно определять их в конструкторе? в любом случае спасибо за ответ :)

tdk 09.12.2018 10:51

Вы можете инициализировать ivars где угодно, но вы можете получить неожиданное поведение, если код, который читает this.thing, каким-то образом запускается до инициализации this.thing. Даже если вы запрограммируете это правильно, когда я (сторонний участник) открою вашу кодовую базу, я не уверен, правильно ли вы это сделали. Эта неопределенность устраняется, если вы инициализируете this.thing в конструкторе.

Neal Ehardt 11.12.2018 01:03

Другие вопросы по теме