Мы можем создать статический член в React?

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

Я уже решил проблему с помощью сокращение., но я с нетерпением ищу решение проблемы с помощью статические члены.

в Java

public class Cart {

    static int totalItemInCart = 0; 
}


class Order{

    static boolean pushToCart() {

        Cart.totalItemInCart += Cart.totalItemInCart+1;     
        return true;
    }
}

class CancelOrder{  

    static boolean removeFromCart() {

        Cart.totalItemInCart += Cart.totalItemInCart-1;     
        return true;
    }
}

class User {

    public static void main(String[] args) {

        Order.pushToCart(); // item added to cart
        Order.pushToCart(); // item added to cart
        CancelOrder.removeFromCart(); // one item removed from cart 

        // if print the count we will get totalItemInCart is 2 
        System.out.println("number of items in cart" + Cart.totalItemInCart);
    }

}

теперь я хочу сделать то же самое в реакции, есть ли способ получить доступ к члену класса в нескольких экземплярах.

в ответ на данный момент я могу получить доступ только к начальные значения

class App extends Component {
  constructor(props) {
    super(props);
  }

  render() {
    return <h1>Count : {new Count().state.count} </h1>;
  }
}

class Count extends Component{
  constructor(props) {
    super(props);
    this.state = {
      count:0
    }
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

выход будет

Count : {new Count().state.count}

Я уже решил проблему с помощью redux., но я с нетерпением ищу решение проблемы с помощью статических членов

Sunil Kumar 19.10.2018 21:28
Поведение ключевого слова "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) для оценки ваших знаний,...
0
1
2 118
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Один из подходов - присвоить классу переменную, чтобы каждый экземпляр класса включал эту переменную. Это значение не будет полностью статичным, поскольку его можно переназначить через this.variableName = 'newValue'.

class MyComponent extends React.Component {
    variableName = 'value'

    render() {
      return <div>{this.variableName}</div>
    }
}

В качестве альтернативы вы можете сделать его методом, возвращающим константу, в этом случае value больше не может быть перезаписан.

const value = 'value'
class MyComponent extends React.Component {
    getValue() {
      return value
    }

    render() {
      return <div>{this.variableName}</div>
    }
}

Кроме того, предположим, что статическое значение может измениться, и вы хотите, чтобы все компоненты могли читать обновленное значение (без сокращения), тогда вы можете обернуть его в объект.

В качестве альтернативы вы можете сделать его методом, возвращающим константу, в этом случае value больше не может быть перезаписан.

const staticProperty = {
  value: 'value'
}
class MyComponent extends React.Component {
    getValue() {
      return staticProperty.value
    }

    render() {
      return <div>{this.variableName}</div>
    }
}

В приведенном выше примере, поскольку staticValue является изменяемым, вы можете запустить staticValue.value = 'some new value', и он обновит значение. В следующий раз, когда какой-либо компонент вызовет this.getvalue(), он получит my new value. Проблема с этим подходом заключается в том, что изменение staticValue.value не приведет к запуску обновления компонентов, поскольку не произошло никаких изменений свойств или состояний.

Если вы хотите, чтобы компоненты получали обновления об изменениях свойств, на этом этапе вы повторно внедряете Redux, и я бы рекомендовал вам использовать Redux. Вам нужно будет подписаться на каждый компонент, чтобы отслеживать изменения в определенном разделе состояния, и вы можете увидеть, как этого добиться, посмотрев исходный код Redux: https://github.com/reduxjs/redux/blob/master/src/createStore.js

спасибо за ввод, но как мы можем повторно инициализировать значение

Sunil Kumar 19.10.2018 21:43

Я просто добавил это как третий пример! @SunilKumar

Alexei Darmin 19.10.2018 21:45

спасибо, Алексей, сэр, я понял, но есть ли способ запустить компоненты для обновления

Sunil Kumar 19.10.2018 21:59

Нет проблем, чтобы обновить компоненты, вам нужно настроить eventListeners или subscribers, чтобы отслеживать, изменилось ли значение свойства. Но это именно то, что делает redux. selector Redux отслеживает изменения свойства и сообщает компоненту об обновлении. Если вы собираетесь на такое расстояние, чтобы поделиться свойством, я настоятельно рекомендую вам использовать Redux вместо того, чтобы воссоздавать его вручную, используя общие статические свойства и прослушиватели событий.

Alexei Darmin 19.10.2018 22:04

сэр, не могли бы вы просмотреть мой код codeandbox.io/s/wnxp7rzvjw

Sunil Kumar 19.10.2018 22:21

@SunilKumar Я просмотрел ваш код и нашел несколько областей для улучшения. Вот рабочая копия того, что вам нужно: codeandbox.io/s/2ol27k3z4r В общем, вы не хотите звонить render(). Эта функция должна автоматически вызываться при изменении состояния компонента, поэтому я реорганизовал увеличение и уменьшение, чтобы использовать this.setState(). У каждой тележки есть собственный экземпляр count, и при использовании this.setState() он автоматически запускает render (). Также onPlus и onMinus определены в тележке, поэтому они используют this.setState() и также обновят родительский.

Alexei Darmin 19.10.2018 22:43

пройдите по ссылке https://codesandbox.io/s/wnxp7rzvjw, я получил решение

я использовал один родительский класс, чтобы создать общий экземпляр для обоих классов

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      countInstance: new Cart(this)
    };
  }

  onPlus = () => {
    this.state.countInstance.state.count += 1;
    this.state.countInstance.render();
  };

  render() {
    return (
      <div>
        <Increment countInstance = {this.state.countInstance} />
        <Decrement countInstance = {this.state.countInstance} />
      </div>
    );
  }
}

class Increment extends Component {
  constructor(props) {
    super(props);
  }

  onPlus = () => {
    this.props.countInstance.state.count += 1;
    this.props.countInstance.render();
  };

  render() {
    return (
      <div>
        <h1>Count in first componet: {this.props.countInstance.state.count}</h1>
        <button onClick = {this.onPlus}>+</button>
      </div>
    );
  }
}

class Decrement extends Component {
  constructor(props) {
    super(props);
  }

  onMinus = () => {
    this.props.countInstance.state.count -= 1;
    this.props.countInstance.render();
  };

  render() {
    return (
      <div>
        <h1>
          Count in second componet : {this.props.countInstance.state.count}
        </h1>
        <button onClick = {this.onMinus}>-</button>
      </div>
    );
  }
}

class Cart extends Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }

  updateParent = () => {
    this.props.setState({
      update: !this.state.update
    });
  };
  render() {
    {
      this.updateParent();
    }
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
Ответ принят как подходящий

Javascript (на котором основана реакция) не является действительно ООП, как Java, это язык на основе прототипного типа, поэтому нет прямого эквивалента для классовых и статических переменных.

В ответ на эти глобальные вещи мы будем использовать Redux для данных или React.Context api для глобального состояния приложения.

Однако с ES6 вы можете написать синтаксис класса, подобный этому

class Cart {
  static count = 0;

  add = () => {
    Cart.count++;
  };
  remove = () => {
    Cart.count--;
  };

  print = () => {
    console.info(Cart.count);
  };
}

которые работают почти так же, как переменные класса Java. вы можете попробовать этот пример, обратите внимание на рендеринг, значение остается прежним. https://codesandbox.io/s/wo62022jo5

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