Как правильно переписать код AngularJS для React?

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

Вот моя проблема: Я пытаюсь переписать код Angularjs для React, но он выдает неожиданный токен ошибки.

УгловойJS:

<script>
    var app = angular.module('myapp', []);
    
    app.controller('MainCtrl', function($scope) {
    
     //called at initiazation, reads from localstorage if array is present there
      $scope.checkAndInitiateFromLocalStorage = function() {
        var readArrayStr = localStorage.getItem('messagingArray');
        if (readArrayStr && readArrayStr.length > 0) {
          $scope.arr = JSON.parse(readArrayStr);
        } else {
          $scope.arr = [{
              name: "user1"
            },
            {
              name: "user2"
            },
            {
              name: "user3"
            },
            {
              name: "user4"
            }
          ];
        }
      }
    
      //called at each update, stores the latest status in localstorage
      $scope.updateLocalStorage = function() {
        localStorage.setItem('messagingArray', JSON.stringify($scope.arr));
        /* console.info("updated local storage !!"); */
      }
    
      $scope.checkAndInitiateFromLocalStorage();
    
    
    });
</script>

Реагировать:

    <script src = "react.min.js"></script>
    <script src = "react-dom.min.js"></script>
    <script src = "browser.min.js"></script>
    
    <div id = "app"></div>

    
<script type = "text/babel">


class Application extends React.Component {
  constructor(props) {
    super(props);

 
 //called at initiazation, reads from localstorage if array is present there
  //const checkAndInitiateFromLocalStorage () {
const checkAndInitiateFromLocalStorage = () => {
    var readArrayStr = localStorage.getItem('messagingArray');
    if (readArrayStr && readArrayStr.length > 0) {
      this.state.arr = JSON.parse(readArrayStr);
    } else {


this.state = {
      arr: [
    {      name: "user1"},
    {      name: "user2"},
    {      name: "user3"},
    {      name: "user4"}
      ],

    };

    }
   }

this.checkAndInitiateFromLocalStorage = this.checkAndInitiateFromLocalStorage.bind(this);
this.updateLocalStorage = this.updateLocalStorage.bind(this);
  }


  //called at each update, stores the latest status in localstorage
updateLocalStorage() {
    localStorage.setItem('messagingArray', JSON.stringify(this.state.arr));
   
  };


componentDidMount() {
this.checkAndInitiateFromLocalStorage(); 
this.updateLocalStorage();
}
  render() {
    return (
        <div>
          <h3>Display Data</h3>
 <ul>
            {this.state.arr.map((obj, i) => (
              <li key = {i}>
                {obj.name} - {obj.name}
               
              </li>
            ))}
          </ul>
</div>

    );
  }
}




ReactDOM.render(<Application />, document.getElementById('app'));



</script>

Вот обновленное сообщение об ошибке реакции:

Uncaught TypeError: Cannot read properties of undefined (reading 'bind')
    at new Application (eval at transform.run  

Не могли бы вы поделиться точным сообщением об ошибке?

agulowaty 14.02.2023 10:59

@agulowaty я обновил сообщение, чтобы добавить сообщение об ошибке

Nancy Moore 14.02.2023 11:09

Можете ли вы запустить React в режиме разработки и получить там ошибки? То, что вы вставили, является минифицированной/сантизированной версией кода.

agulowaty 15.02.2023 12:21

@agulowaty Я обновил код reactjs и новые сообщения об ошибках, которые он показывает.

Nancy Moore 15.02.2023 14:20

Ваш конструктор Application не закрыт должным образом, в нем отсутствует закрывающая фигурная скобка

thomaux 15.02.2023 14:32

@thomaux Я проверил, и мой конструктор правильно закрылся. что может быть лучшим местом для размещения функции checkAndInitiateFromLocalStorage() {, так как именно она вызывает ошибку.

Nancy Moore 15.02.2023 14:53

Вам не хватает ключевого слова function перед определением checkAndInitiateFromLocalStorage() {...}. И, пожалуйста, рассмотрите возможность форматирования кода для лучшей читабельности при публикации кода.

Martin 15.02.2023 15:19

@Martin, если я создаю функцию, как показано ниже, она выдает ошибку checkAndInitiateFromLocalStorage не определен

Nancy Moore 15.02.2023 15:44

Не хватает ключевого слова const. Попробуйте const checkAndInitiateFromLocalStorage = () => {...} и это должно сработать.

Martin 15.02.2023 15:47

@Martin, когда я добавляю const, возникает ошибка. Uncaught TypeError: Cannot read properties of undefined (reading 'bind') at new Application (eval at transform.run Я обновил код, чтобы отразить изменения на данный момент.

Nancy Moore 15.02.2023 16:13

Переместите определение checkAndInitiateFromLocalStorage за пределы конструктора, как вы сделали с updateLocalStorage

Martin 15.02.2023 16:22

@Martin Перемещение определения checkAndInitiateFromLocalStorage за пределы конструктора решает проблему. Вы можете обновить свой ответ, чтобы я мог принять его как ответ

Nancy Moore 15.02.2023 18:00

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

Martin 15.02.2023 18:21
Что такое двойные вопросительные знаки (??) в JavaScript?
Что такое двойные вопросительные знаки (??) в JavaScript?
Как безопасно обрабатывать неопределенные и нулевые значения в коде с помощью Nullish Coalescing
Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
Принципы ООП в JavaScript
Принципы ООП в JavaScript
Парадигма объектно-ориентированного программирования имеет 4 основных принципа,
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
1
13
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эта проблема была решена путем перемещения определения checkAndInitiateFromLocalStorage за пределы конструктора.

Вот код ниже

class Application extends React.Component {
  constructor(props) {
    super(props);

 



this.state = {
      arr: [
    {      name: "user1"},
    {      name: "user2"},
    {      name: "user3"},
    {      name: "user4"}
      ],

    };



this.checkAndInitiateFromLocalStorage = this.checkAndInitiateFromLocalStorage.bind(this);
this.updateLocalStorage = this.updateLocalStorage.bind(this);
  }

checkAndInitiateFromLocalStorage () {
//const checkAndInitiateFromLocalStorage = () => {
    var readArrayStr = localStorage.getItem('messagingArray');
    if (readArrayStr && readArrayStr.length > 0) {
      this.state.arr = JSON.parse(readArrayStr);
    } else {
this.state.arr;

}
}
  //called at each update, stores the latest status in localstorage
updateLocalStorage() {
    localStorage.setItem('messagingArray', JSON.stringify(this.state.arr));
   
  };


componentDidMount() {
this.checkAndInitiateFromLocalStorage(); 
this.updateLocalStorage();
}
  render() {
    return (
        <div>
          <h3>Display Data</h3>
 <ul>
            {this.state.arr.map((obj, i) => (
              <li key = {i}>
                {obj.name} - {obj.name}
               
              </li>
            ))}
          </ul>
</div>

    );
  }
}

ReactDOM.render(<Application />, document.getElementById('app'));

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