React.js - Синтаксическая ошибка: это зарезервированное слово в функции render()
Я застрял на ошибке для зарезервированного ключевого слова "это". В моем компоненте React ниже показано, как я передал состояние из моего основного компонента "App.js" в свой компонент "RecipeList.js", чтобы затем отобразить данные и отобразить каждый компонент RecipeItem. Я просто не понимаю, почему я получаю эту ошибку
React.js - Синтаксическая ошибка: это зарезервированное слово
Ошибка вызывается в RecipeList внутри метода возврата рендеринга; Если бы кто-нибудь мог помочь, это здорово!
Спасибо
App.js
//main imports
import React, { Component } from 'react';
//helper imports
import {Button} from 'reactstrap'
import RecipeItem from './components/RecipeItem';
import RecipeList from './components/RecipeList';
import './App.css';
const recipes = [
{
recipeName: 'Hamburger',
ingrediants: 'ground meat, seasoning'
},
{
recipeName: 'Crab Legs',
ingrediants: 'crab, Ole Bay seasoning,'
}
];
class App extends Component {
constructor(props){
super(props);
this.state = {
recipes
};
}
render() {
return (
<div className="App">
<div className = "container-fluid">
<h2>Recipe Box</h2>
<div>
<RecipeList recipes = {this.state.recipes}/>
</div>
</div>
<div className = "AddRecipe">
<Button>Add Recipe</Button>
</div>
</div>
);
}
}
export default App;
RecipeLists.js
import React, {Component} from 'react';
import _ from 'lodash';
import RecipeItem from './RecipeItem';
class RecipeList extends Component {
renderRecipeItems() {
return _.map(this.props.recipes, recipeItem => <RecipeItem key = {i} {...recipes} />);
}
render() {
return (
{ this.renderRecipeItems() }
);
}
}
export default RecipeList
Ответы
Ответ 1
Все приведенные здесь решения верны.
Самое простое изменение заключается в том, чтобы просто включить вызов функции в элемент JSX:
return (
<div>
{ this.renderRecipeItems() }
</div>
)
Тем не менее, ни один из ответов (правильно) не говорит вам, почему код нарушался в первую очередь.
Для упрощенного примера, немного упростите свой код.
// let simplify this
return (
{ this.renderRecipeItems() }
)
так что смысл и поведение остаются прежними. (удалить шестнадцатиричные и перемещать завитки):
// into this
return {
this.renderRecipeItems()
};
Что делает этот код, он содержит блок, обозначенный {}
, в котором вы пытаетесь вызвать функцию.
Из-за оператора return
блок {}
обрабатывается как объектный литерал
Литеральный объект - это список нулей или более пар имен свойств и связанных значений объекта, заключенных в фигурные скобки ({}).
который ожидает либо a: b
либо a
(сокращенный) синтаксис для его пар значений свойства.
// valid object
return {
prop: 5
}
// also valid object
const prop = 5;
return {
prop
}
Однако вместо этого вы передаете вызов функции, что является недопустимым.
return {
this.renderRecipeItems() // There no property:value pair here
}
Просматривая этот код, движок предполагает, что он будет читать объект-литерал. Когда он достигнет this.
, он замечает это .
не является допустимым символом для имени свойства (если только вы не обертываете его в строку - см. ниже), и здесь выполняются разрывы.
function test() {
return {
this.whatever()
// ^ this is invalid object-literal syntax
}
}
test();
Ответ 2
Вы можете избежать этого, переписывая RecipeLists.js
как чистый компонент без гражданства.
Как чистый компонент:
import _ from 'lodash';
import RecipeItem from './RecipeItem';
const RecipeList = props => renderRecipeItems(props);
const renderRecipeItems = ({ recipes }) => _.map(recipes, recipeItem => <RecipeItem key = {i} {...recipes} />);
export default RecipeList;
Итак, теперь вы являетесь компонентом в основном просто функцией с параметрами.
Ответ 3
Оберните часть this.renderRecipeItems()
с помощью div
, она будет работать.
Причина, почему она терпит неудачу, объясняется очень хорошо @nem035 в этом ответе.
Как это:
render () {
return (
<div>
{ this.renderRecipeItems() }
</div>
);
}
И я думаю вместо:
<RecipeItem key = {i} {...recipes} />
Так должно быть:
<RecipeItem key = {i} {...recipeItem} />
Это изменения, которые я вижу, возможно, некоторые другие также потребуются.