Этот урок входит в цикл "Блог на React".
head.jsx
На экран выведется "Hey, Africa!" Т.к. в children хранятся вложенные HTML-элементы и другие React-компоненты.
children - зарезервированное свойство в props обозначающее вложенные объекты. Передавать в него эти объекты можно просто указывая их внутри тега компонента (например: <Div>asd</Div> - в компоненте Div, children это asd)
Но также надпись будет красного цвета. Потому что мы передали дополнительное свойство в props компонента Head color = "red". Затем принименили в style к возвращаемому div'у.
Зачем нужен state? state - схож с props, с той разницей, что это внутреннее состояние компонента(как понятно из названия). state нельзя поменять извне компонента. Т.е. state, как и props, нужен для отслеживания изменений, но внутренних. Костяк приложения у нас есть, нам нужно лишь добавить обработку стилей. Добавляем стили в формате SCSS (он нам упростит указание вложенных элементов): styles.scss
Подправим main.js - уберём передачу color и получение их из props в head.js:
head.js
Для обработки стилей добавим загрузчик CSS, SASS/SCSS и плагин для сборки в один файл в webpack:
npm install sass-loader css-loader style-loader node-sass extract-text-webpack-plugin --save-dev
webpack.config.js
Также не помешает создать более удобные команды для сборки проекта.
Для этого используем npm run. В package.json - конфиг npm добавим команду serve в scripts
package.json
Теперь для запуска webpack-dev-server --watch достаточно ввести::
npm run serve
Для сборбки bundle-файлов:
npm run build
Теперь SCSS собирается в bundle.css
Последний шаг - нужно подключить bundle.css к нашему index.html и механизм сборки будет полностью налажен и автоматизирован
index.html
На этом настройка окружения закончена. SCSS, JSX компилируются в CSS, JS соответственно!
Примите поздравления с её окончанием!
До завершения проекта остаётся ещё немного настроек, но уже не окружения, а взаимодействия компонентов между собой, будем использовать Redux.
И дальше будет только реализация новых фич и чистое программирование.
Следующая статья будет посвящена Redux, Mock-серверу (json-server) и получению/сохранению/отображению данных с бэкенда.
Спасибо за внимание.
- Блог на ReactJS #1. Компоненты. npm, jsx, webpack, webpack-dev-server
- Блог на ReactJS #2. Несколько компонентов, props, state. npm run, конфигурация webpack
- Блог на ReactJS #3. Redux, Middleware, json-server, fetch
1 2 3 4 5 6 7 8 9 10 11 | import React from 'react';import ReactDOM from 'react-dom';import Head from './head.jsx'; class Main extends React.PureComponent { render() { return <Head color="red">Hey, Africa!</Head>; }} ReactDOM.render(<Main />, document.getElementById('main')); |
1 2 3 4 5 6 7 8 9 | import React from 'react';const Head = props => ( <div style={{ color: props.color }}> {props.children} </div>);export default Head; |
Зачем нужен state? state - схож с props, с той разницей, что это внутреннее состояние компонента(как понятно из названия). state нельзя поменять извне компонента. Т.е. state, как и props, нужен для отслеживания изменений, но внутренних. Костяк приложения у нас есть, нам нужно лишь добавить обработку стилей. Добавляем стили в формате SCSS (он нам упростит указание вложенных элементов): styles.scss
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | * { font-family: Lato, sans-serif; padding: 0; margin: 0;}#main { background: #eee; .head { padding: 20px; background: #d00; color: #fff; } .item { margin: 8px 0; background: #fff; padding: 20px; }}@font-face { font-family: Lato; src: local('Lato'), } |
1 2 3 | const Head = props => ( <h1 className="head">{props.children}</h1>); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | var path = require('path');var webpack = require('webpack');var ExtractTextPlugin = require('extract-text-webpack-plugin');module.exports = { entry: [ './main.jsx', './styles.scss' ], output: {path: __dirname, filename: 'bundle.js'}, module: { loaders: [ { test: /.jsx?$/, loader: 'babel-loader', exclude: /node_modules/, query: { presets: ['es2015', 'react'] } }, { test: /\.scss$/, loader: ExtractTextPlugin.extract('css-loader!sass-loader') } ] }, plugins: [ new ExtractTextPlugin('bundle.css', {allChunks: true}) ]}; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | { "scripts": { "serve": "webpack-dev-server --watch", "build": "webpack" }, "dependencies": { "react": "^16.0.0", "react-dom": "^16.0.0" }, "devDependencies": { "babel-core": "^6.26.0", "babel-loader": "^7.1.2", "babel-preset-es2015": "^6.24.1", "babel-preset-react": "^6.24.1", "css-loader": "^0.28.7", "extract-text-webpack-plugin": "^3.0.2", "node-sass": "^4.5.3", "sass-loader": "^6.0.6", "style-loader": "^0.19.0", "webpack": "^3.8.1", "webpack-dev-server": "^2.9.3" }} |
1 2 3 4 5 6 7 8 9 10 11 12 | <!doctype html><html><head> <meta charset="UTF-8"> <title>Hello React</title> <link rel="stylesheet" href="bundle.css"></head><body><div id="main"></div> <script src="bundle.js"></script></body></html> |