Как исправить «Неожиданный токен, ожидаемый «;»» в React Native/Expo?

Я пытаюсь получить данные Json из https://api.myjson.com/bins/q47s3 и отобразить их в FlatList.

Я использую Экспо. Я начал новый проект, используя шаблон react-native-tabs

И это мой код (HomeScreen.js):

export default function HomeScreen() {
  constructor() {
    super();
    this.state = {
      dataSource: []
    }
  }

  renderItem = ({item}) => {
    return (
      <View>
      <Image source = {{uri: item.image}} style = {{width: 100, height: 100}}/>
      <View>
        <Text>{item.book_title}</Text>
        <Text>{item.author}</Text>
      </View>
    </View>
    )
  }

  componentDidMount() {
    const url = 'https://api.myjson.com/bins/q47s3'
    fetch(url)
    .then((response) => response.json())
    .then((responseJson) => {
      this.setState({
        dataSource: responseJson.book_array
      })
    })
    .catch((error) => {
      console.info(error)
    })
  }

  return (
    <View style = {{flex: 1}}>
      <View style = {styles.header}>
        <View style = {styles.searchBarHolder}>
          <Icon name='ios-search' style = {{fontSize: 24}} />
          <TextInput placeholder='Search' style = {{fontSize: 24, marginLeft: 15}} />
        </View>
      </View>
      <FlatList
        data = {this.state.dataSource}
        renderItem = {this.renderItem}
      />
    </View>
  );
}

HomeScreen.navigationOptions = { заголовок: ноль, };

Вот журнал ошибок:

Error: D:\Projects\React Native\fick\screens\HomeScreen.js: Unexpected token, expected ";" (18:16)

  16 | import Icon from 'react-native-vector-icons/Ionicons';
  17 | export default function HomeScreen() {
> 18 |   constructor() {
     |                 ^
  19 |     super()
  20 |     this.state = {
  21 |       dataSource: []

ОБНОВИТЬ

  1. Я заменил export default function HomeScreen() { на export default class HomeScreen {
  2. Я переместил последний метод return в метод render, так что теперь код выглядит так:
export default class HomeScreen extends React.Component {
  constructor() {
    super();
    this.state = {
      dataSource: []
    }
  }

  renderItem = ({item}) => {
    return (
      <View style = {{flex: 1}}>
        <View style = {styles.header}>
          <View style = {styles.searchBarHolder}>
            <Icon name='ios-search' style = {{fontSize: 24}} />
            <TextInput placeholder='Search' style = {{fontSize: 24, marginLeft: 15}} />
          </View>
        </View>
        <FlatList
          data = {this.state.dataSource}
          renderItem = {this.renderItem}
        />
      </View>

      <View>
      <Image source = {{uri: item.image}} style = {{width: 100, height: 100}} />
      <View>
        <Text>{item.book_title}</Text>
        <Text>{item.author}</Text>
      </View>
    </View>
    )
  }
  }

  componentDidMount() {
    const url = 'https://api.myjson.com/bins/q47s3'
    fetch(url)
    .then((response) => response.json())
    .then((responseJson) => {
      this.setState({
        dataSource: responseJson.book_array
      })
    })
    .catch((error) => {
      console.info(error)
    })
  }
      <View style = {{flex: 1}}>
        <View style = {styles.header}>
          <View style = {styles.searchBarHolder}>
            <Icon name='ios-search' style = {{fontSize: 24}} />
            <TextInput placeholder='Search' style = {{fontSize: 24, marginLeft: 15}} />
          </View>
        </View>
        <FlatList
          data = {this.state.dataSource}
          renderItem = {this.renderItem}
        />
      </View>

      <View>
      <Image source = {{uri: item.image}} style = {{width: 100, height: 100}} />
      <View>
        <Text>{item.book_title}</Text>
        <Text>{item.author}</Text>
      </View>
    </View>
    )
  }
  }

  componentDidMount() {
    const url = 'https://api.myjson.com/bins/q47s3'
    fetch(url)
    .then((response) => response.json())
    .then((responseJson) => {
      this.setState({
        dataSource: responseJson.book_array
      })
    })
    .catch((error) => {
      console.info(error)
    })
  }

Но теперь появляется новая ошибка, есть идеи, что я снова сделал не так?:

Error: D:\Projects\React Native\fick\screens\HomeScreen.js: Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...</>? (42:6)

  40 |       </View>
  41 | 
> 42 |       <View>
     |       ^
  43 |       <Image source = {{uri: item.image}} style = {{width: 100, height: 100}}/>
  44 |       <View>
  45 |         <Text>{item.book_title}</Text>

Функции не имеют методов. Вы хотели использовать класс?

tkausl 11.07.2019 15:12

так должно быть export default class HomeScreen { вместо этого?

quachhengtony 11.07.2019 15:13

да. И самое последнее return должно быть в методе render.

tkausl 11.07.2019 15:14
Поведение ключевого слова "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
3
1 901
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

так должно быть:

class HomeScreen extends React.Component{
  //your code
 render(){
   return()
 }
}
export default HomeScreen; 
  1. Вы использовали функцию, а не класс.
  2. Где ваш метод рендеринга? (Возможно, это не эта ошибка, но она создаст новую ошибку, потому что у вас нет метода рендеринга).
  3. Добавьте класс для использования конструктора.

    export default class HomeScreen extends React.Component {
          constructor(props) {
            super(props);
            this.state = {
              dataSource: []
            }
          }
    
Ответ принят как подходящий

Обновите код соответствующим образом

export default class HomeScreen extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      dataSource: []
    }
  }

componentDidMount() {
    const url = 'https://api.myjson.com/bins/q47s3'
    fetch(url)
    .then((response) => response.json())
    .then((responseJson) => {
      this.setState({
        dataSource: responseJson.book_array
      })
    })
    .catch((error) => {
      console.info(error)
    })
  }



  renderItem = ({item}) => {
    return (
      <View>
      <Image source = {{uri: item.image}} style = {{width: 100, height: 100}}/>
      <View>
        <Text>{item.book_title}</Text>
        <Text>{item.author}</Text>
      </View>
    </View>
    )
  }

  render(){
  return (
    <View style = {{flex: 1}}>
      <View style = {styles.header}>
        <View style = {styles.searchBarHolder}>
          <Icon name='ios-search' style = {{fontSize: 24}} />
          <TextInput placeholder='Search' style = {{fontSize: 24, marginLeft: 15}} />
        </View>
      </View>
      <FlatList
        data = {this.state.dataSource}
        renderItem = {this.renderItem}
      />
    </View>
  );
 }

}

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