Запустите приложение, если оно у вас не запущено (npm start).
Как вы помните на прошлом скрине, у нас были предупреждения от eslint. eslint - вспомогательный инструмент, который помогает поддерживать код в чистоте, на данный момент у нас следующие проблемы:
./src/App.js
Line 50: Links must not point to "#". Use a more descriptive href or use a button instead jsx-a11y/href-no-hash
Line 126: 'value' is assigned a value but never used no-unused-vars
Line 140: 'agree' is assigned a value but never used no-unused-vars
Строка 50: у ссылки должен быть атрибут href не #, а что-то более вразумительное (замените на '#readmore').
Поддерживайте свой код без предупреждений. Если вы не знаете о чем речь, например, сработало правило no-unused-vars, не ленитесь. Изучайте документацию на eslint.org
Импорты
Наша задача - разбить огромный файл src/App.js на компоненты.
Поддерживаются следующие импорты:
import A from 'A' // импорт по дефолту
import { B } from 'B' // именованный импорт
import * as C from 'C' // импорт "всего" в namespace C
С другой стороны поддерживаются следующие экспорты:
export default A // экспорт по дефолту
export const B // именованный экспорт
Мы создадим несколько файлов, в каждом из которых будем пользоваться именованным экспортом. Затем в App импортируем.
Создайте директорию src/components и в ней создайте файлы для каждого компонента, кроме <App />.
Рассмотрим создание файла, на примере <Article />:
src/components/Article.js
import React from'react'// мы обязаны импортировать необходимые пакеты в каждом файлеimport PropTypes from'prop-types'// у Article это react и prop-types// далее просто скопировано все что было, кроме последней строкиclassArticleextendsReact.Component { state = { visible:false, }handleReadMoreClck= e => {e.preventDefault()this.setState({ visible:true }) }render() {const { author,text,bigText } =this.props.dataconst { visible } =this.statereturn ( <divclassName="article"> <pclassName="news__author">{author}:</p> <pclassName="news__text">{text}</p> {!visible && ( <aonClick={this.handleReadMoreClck}href="#readmore"className="news__readmore" > Подробнее </a> )} {visible && <pclassName="news__big-text">{bigText}</p>} </div> ) }}Article.propTypes = { data:PropTypes.shape({ id:PropTypes.number.isRequired,// добавили id, это число, обязательно author:PropTypes.string.isRequired, text:PropTypes.string.isRequired, bigText:PropTypes.string.isRequired, }),}export { Article } // именованный экспорт
Остальные файлы оформите аналогично.
Должна получиться следующая структура:
При этом, необходимо добавить import'ы в App.js и в News.js
src/App.js
import React from'react'// импорт пакета prop-types удален, так как в этом файле prop-types не используетсяimport { Add } from'./components/Add'// ./ = текущая директория,import { News } from'./components/News'// далее мы идем в директорию components и в нужный компонентimport'./App.css'constmyNews= [ { id:1, author:'Саша Печкин',...
src/components/News.js
import React from'react'import PropTypes from'prop-types'import { Article } from'./Article'// идти в components не нужно, так как мы уже в этой директорииclassNewsextendsReact.Component {renderNews= () => {...
Я думаю принцип понятен: в каждом файле мы импортируем то, что нам нужно относительно этого файла.
чтобы подняться на уровень выше - '../'
чтобы на два уровня выше - '../../'
чтобы начать поиск в текущей директории - './'
чтобы найти компонент Name в текущей директории в components - './components/Name'
чтобы импортировать из библиотеки - 'название библиотеки'
Наш App.js заметно похудел. Ориентироваться в коде стало удобнее.
myNews тоже можно выкинуть из этого файла.
src/data/newsData.json (экспорт json структуры по дефолту)
[ {"id":1,"author":"Саша Печкин","text":"В четверг, четвертого числа...","bigText":"в четыре с четвертью часа четыре чёрненьких чумазеньких чертёнка чертили чёрными чернилами чертёж." }, {"id":2,"author":"Просто Вася","text":"Считаю, что $ должен стоить 35 рублей!","bigText":"А евро 42!" }, {"id":3,"author":"Max Frontend","text":"Прошло 2 года с прошлых учебников, а $ так и не стоит 35","bigText":"А евро опять выше 70." }, {"id":4,"author":"Гость","text":"Бесплатно. Без смс, про реакт, заходи - https: //maxpfrontend.ru","bigText":"Еще есть группа VK, telegram и канал на youtube! Вся инфа на сайте, не реклама!" }]