У меня есть приведенный ниже код, который считывает и обновляет данные в локальном хранилище и из него, и он отлично работает с 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 я обновил сообщение, чтобы добавить сообщение об ошибке
Можете ли вы запустить React в режиме разработки и получить там ошибки? То, что вы вставили, является минифицированной/сантизированной версией кода.
@agulowaty Я обновил код reactjs и новые сообщения об ошибках, которые он показывает.
Ваш конструктор Application не закрыт должным образом, в нем отсутствует закрывающая фигурная скобка
@thomaux Я проверил, и мой конструктор правильно закрылся. что может быть лучшим местом для размещения функции checkAndInitiateFromLocalStorage() {, так как именно она вызывает ошибку.
Вам не хватает ключевого слова function перед определением checkAndInitiateFromLocalStorage() {...}. И, пожалуйста, рассмотрите возможность форматирования кода для лучшей читабельности при публикации кода.
@Martin, если я создаю функцию, как показано ниже, она выдает ошибку checkAndInitiateFromLocalStorage не определен
Не хватает ключевого слова const. Попробуйте const checkAndInitiateFromLocalStorage = () => {...} и это должно сработать.
@Martin, когда я добавляю const, возникает ошибка. Uncaught TypeError: Cannot read properties of undefined (reading 'bind') at new Application (eval at transform.run Я обновил код, чтобы отразить изменения на данный момент.
Переместите определение checkAndInitiateFromLocalStorage за пределы конструктора, как вы сделали с updateLocalStorage
@Martin Перемещение определения checkAndInitiateFromLocalStorage за пределы конструктора решает проблему. Вы можете обновить свой ответ, чтобы я мог принять его как ответ
Рад, что мы решили это. Но вопрос действительно настолько специфичен для вашего собственного кода и варианта использования, что я не думаю, что он когда-либо будет полезен кому-либо еще; поэтому я считаю бесполезным публиковать ответ и предпочел бы, чтобы вопрос был закрыт.
Эта проблема была решена путем перемещения определения 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'));
Не могли бы вы поделиться точным сообщением об ошибке?