Я нашел React чрезвычайно сложным, когда только начинал. Теперь, когда это было объяснено, становится совершенно понятным, почему кто-то захочет его использовать.
React был создан несколькими инженерами Facebook несколько лет назад. Это действительно полезно, потому что разделяет все движущиеся части внешнего интерфейса ванильного JavaScript и делает его более эффективным.
Итак, каковы сложные части? ПРИМЕЧАНИЕ. ЭТО ПРЕДНАЗНАЧЕНО ТОЛЬКО ДЛЯ НАЧИНАЮЩИХ ЛЮДЕЙ. Я НЕ БУДУ РАССКАЗЫВАТЬ ОСНОВЫ НАСТРОЙКИ, ТОЛЬКО НЕМНОГО О СОСТОЯНИИ, ПРОПСАХ И КОМПОНЕНТАХ.
Давайте вместе создадим простое приложение, которое пройдёт сложные части React. Моя падчерица Рамона и я прошли через то, что, по ее мнению, было самой сложной лабораторией для работы. Она учится в школе Флэтайрон. Мы вместе провели лабораторную работу под названием «Акции».
По сути, вы хотите, чтобы ваш App.js выглядел так:
import React, { Component } from ‘react’; import Header from ‘./components/Header’ import MainContainer from ‘./containers/MainContainer’ class App extends Component { render() { return ( <div> <Header/> <MainContainer/> </div> ); } } export default App;
Это показывает, что MainContainer находится в папке контейнера и является компонентом App.js.
Теперь, когда App.js говорит, что ему нужен MainContainer.js, давайте настроим его.
import React, { Component } from ‘react’; import StockContainer from ‘./StockContainer’; import PortfolioContainer from ‘./PortfolioContainer’; import SearchBar from ‘../components/SearchBar’ class MainContainer extends Component { constructor(){ super() this.state = { stocks: [], displayStocks: [], portfolioStocks: [] } } componentDidMount(){ fetch(“http://localhost:3000/stocks") .then(res => res.json()) .then(data => { // check data this.setState({ stocks: data, displayStocks: data }) }) } addPortfolio = (stock) => { this.setState({ portfolioStocks: […this.state.portfolioStocks, stock] }) } removeStock = (stock) => { this.setState({ portfolioStocks: this.state.portfolioStocks.filter(s => s !== stock) }) } filterStocks = (type) => { if(type !== “All”){ this.setState({ displayStocks: this.state.stocks.filter(stock => stock.type === type) }) }else{ this.setState({ displayStocks: this.state.stocks }) } } sortStocks = (sortBy) => { let arr = [] switch(sortBy){ case “Alphabetically”: arr = this.state.displayStocks.sort((a,b) => a.name > b.name ? 1 : -1) break; case “Price”: arr = this.state.displayStocks.sort((a,b) => a.price > b.price ? 1 : -1) break; default: console.log(“Wrong choice”) } this.setState({ displayStocks: arr }) } render() { return ( <div> <SearchBar filterStocks={this.filterStocks} sortStocks={this.sortStocks}/> <div className=”row”> <div className=”col-8"> <StockContainer stocks={this.state.displayStocks} addPortfolio={this.addPortfolio}/> </div> <div className=”col-4"> <PortfolioContainer stocks={this.state.portfolioStocks} removeStock={this.removeStock}/> </div> </div> </div> ); } } export default MainContainer;
Здесь говорится, что в MainContainer есть другие контейнеры, такие как StockContainer и PortfolioContainer. В нем также есть панель поиска! Давайте сосредоточимся на поиске в последнюю очередь, так как это будет немного сложно, поскольку включает сортировку и фильтрацию.
Сначала это PortfolioContainer, потому что, как видно из приведенной выше гифки, в портфелях много акций!
import React, { Component } from ‘react’; import Stock from ‘../components/Stock’ class PortfolioContainer extends Component { render() { return ( <div> <h2>My Portfolio</h2> {this.props.stocks.map(stock => <Stock stock={stock} removeStock={this.props.removeStock}/> ) } </div> ); } } export default PortfolioContainer;
Хороший! Теперь покажем StockContainer:
import React, { Component } from ‘react’; import Stock from ‘../components/Stock’ class StockContainer extends Component { render() { let stocks = this.props.stocks return ( <div> <h2>Stocks</h2> {stocks.map(stock => <Stock stock={stock} addPortfolio={this.props.addPortfolio} /> )} </div> ); } } export default StockContainer;
Мы ВСЕ ЕЩЕ не будем касаться поиска, пока не закончим с остальными компонентами. Просто поверь мне! Важно поддерживать организованность.
Теперь займемся Header.js. Это в компонентах
import React, { Component } from ‘react’; class Header extends Component { render() { return ( <header> <h1 className=”text-center”>Flatiron Stock Exchange</h1> </header> ); } } export default Header;
Хороший! Теперь давайте сделаем Stock.js, который также находится в папке компонентов. Это ФУНКЦИОНАЛЬНЫЙ КОМПОНЕНТ. Это означает, что это не внутри класса:
import React from ‘react’ const Stock = (props) => ( <div> <div className=”card” onClick={() => props.addPortfolio ? props.addPortfolio(props.stock) : props.removeStock(props.stock)}> <div className=”card-body”> <h5 className=”card-title”>{ props.stock.name }</h5> <p className=”card-text”>{ props.stock.ticker + “ “ + props.stock.price }</p> </div> </div> </div> ); export default Stock
Хорошо… все выглядит хорошо! Теперь давайте настроим наш поиск. Это также в компонентах, но это компонент MainContainer, а не другой предок контейнера. Еще один функциональный компонент!
import React from ‘react’; const SearchBar = (props) => { return ( <div> <strong>Sort by:</strong> <label> <input type=”radio” value=”Alphabetically” name=”sort” checked={null} onChange={(e) => props.sortStocks(e.target.value)}/> Alphabetically </label> <label> <input type=”radio” value=”Price” name=”sort” checked={null} onChange={(e) => props.sortStocks(e.target.value)}/> Price </label> <br/> <label> <strong>Filter:</strong> <select onChange={(e)=>props.filterStocks(e.target.value)}> <option value=”All”>All</option> <option value=”Tech”>Tech</option> <option value=”Sportswear”>Sportswear</option> <option value=”Finance”>Finance</option> </select> </label> </div> ); } export default SearchBar;
Надеюсь, это поможет! Комментарий ниже и дайте мне знать, если вы нашли это полезным. Как всегда, удачного дня!