ReactJS
Содержание
- Useful links
- Установить пакеты React (npm)(--save):
- Пакеты сборщики JS кода нужные для ReactJS (npm)(--save-dev):
- Сервер webpack'a если нужно, можно и php серв запускать [по желанию]
- Настройки вебпака для работы с ReactJS webpack.config.js
- Делаем первый компонент
- Подстановка данных в компонент (this.props)
- Подстановка данных в компонент (this.state)
- Изменение переменной (Changing state)
- Цыкл для вывода данных (map function)
- TodoList
- Example 1
- Example 2
- Динамическое создание полей и привязка их к состоянию. Так же сбор и выдача полей
- index.js
- page.html
Useful links
Установить пакеты React (npm)(--save):
- react
- react-dom
Пакеты сборщики JS кода нужные для ReactJS (npm)(--save-dev):
- babel-core
- babel-loader
- babel-preset-es2015
- babel-preset-react
Сервер webpack'a если нужно, можно и php серв запускать [по желанию]
- webpack-dev-server
// вот скрипты которые запускаю и сервер и компил js (content-base - папка в которой html)
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "npm run build",
"build": "webpack -d && webpack-dev-server --content-base app/ --inline --hot --port 8000"
},
Настройки вебпака для работы с ReactJS webpack.config.js
// подключаем пути
var path = require('path');
module.exports = {
// обозначаем входную точку
entry: path.resolve(__dirname, 'app') + '/src/index.js',
output: {
// path: path.resolve(__dirname, 'dist') + '/app',
path: path.resolve(__dirname, 'app') + '/dist/',
filename: 'bundle.js',
publicPath: '/app/'
},
module: {
loaders: [
{
test: /\.js$/,
include: path.resolve(__dirname, 'src'), // <!-- Path to ur js
loader: 'babel-loader',
query: {
presets: ['react', 'es2015']
}
},
{
test: /\.css$/,
loader: 'style-loader!css-loader'
}
]
}
};
Делаем первый компонент
//1. include REACT
var React = require('react');
var ReactDOM = require('react-dom');
//2. Create component
var TodoComponent = React.createClass({
// возвращает html код
render: function(){
return(
<div> // если убрать div, то будет ошибка компила, так как все надо оборачивать в обертку
<h1> Hello </h1>
<p>asdas</p>
</div>
);
}
});
//3. выводим компонент на страницу , в елемент id="todo-div"
ReactDOM.render(<TodoComponent />, document.getElementById('todo-div'));
Подстановка данных в компонент (this.props)
// TodoComponent
var TodoComponent = React.createClass({
// inserting info
render: function(){
return(
<div>
<h1>{this.props.my_obj.name} {this.props.my_obj.surname} </h1>
<p> {this.props.msg}</p>
</div>
);
}
});
var persona = {name:'Joker', surname: 'Petrovich'};
ReactDOM.render(<TodoComponent msg='its me mario' my_obj={persona}/>, document.getElementById('todo-div'));
Подстановка данных в компонент (this.state)
// TodoComponent
var TodoComponent = React.createClass({
// init data
getInitialState: function(){
var data = {
todos: ['wash up', 'eat', 'clean room', 'take a nap'],
};
return data;
},
// inserting info
render: function(){
return(
<div>
<ul>
<li>{this.state.todos[0]}</li>
<li>{this.state.todos[1]}</li>
<li>{this.state.todos[2]}</li>
<li>{this.state.todos[3]}</li>
</ul>
</div>
);
}
});
ReactDOM.render(<TodoComponent/>, document.getElementById('todo-div'));
Изменение переменной (Changing state)
// TodoComponent
var TodoComponent = React.createClass({
// init data
getInitialState: function(){
var data = {
todos: ['wash up', 'eat', 'clean room', 'take a nap'],
age : 30,
name: "gg"
};
return data;
},
// inserting info
render: function(){
var ager = setTimeout(function(){
this.setState({
age:35,
name: 'Joker'
});
}.bind(this), 5000);
return(
<div>
<h3>{this.state.age} {this.state.name}</h3>
<ul>
<li>{this.state.todos[0]}</li>
<li>{this.state.todos[1]}</li>
<li>{this.state.todos[2]}</li>
<li>{this.state.todos[3]}</li>
</ul>
</div>
);
}
});
ReactDOM.render(<TodoComponent/>, document.getElementById('todo-div'));
Цыкл для вывода данных (map function)
// TodoComponent
var TodoComponent = React.createClass({
// init data
getInitialState: function(){
var data = {
todos: ['wash up', 'eat', 'clean room', 'take a nap'],
};
return data;
},
// inserting info
render: function(){
var todos = this.state.todos; // make todos local in render func
todos = todos.map(function(item, index){ // cycle
return(
<li> {item} </li>
);
});
return(
<div>
<h3>{this.state.age} {this.state.name}</h3>
<ul>
{todos}
</ul>
</div>
);
}
});
ReactDOM.render(<TodoComponent/>, document.getElementById('todo-div'));
TodoList
// TodoComponent
var TodoComponent = React.createClass({
// иниц. данных
getInitialState: function(){
var data = {
todos: ['wash up', 'eat', 'clean room', 'take a nap'],
};
return data;
},
// вывод данных
render: function(){
var todos = this.state.todos; // делаем перменную "todos" видимой для текущей функции
todos = todos.map(function(item, index){ // крутим данные
return(
// Вложенный component
// ключ должен быть, так как он показывает на уникальность компонента,
// так же это передача переменных в компонент, которые можно заюзать через this.props в компоненте
<TodoItem item={item} key={index}/>
);
});
// вывод на страницу
return(
<div>
<h3>{this.state.age} {this.state.name}</h3>
<ul>
{todos}
</ul>
</div>
);
}
});
// TodoItem for TodoComponent
var TodoItem = React.createClass({
// className == class в html, так как слово "class" зарезервировано в ReactJS
render: function(){
return(
<li>
<div className="todo-item">
<span className="item-name">{this.props.item}</span>
</div>
</li>
);
}
});
ReactDOM.render(<TodoComponent/>, document.getElementById('todo-div'));
Example 1
// Import ReactJS requires
import React from 'react';
import ReactDOM from 'react-dom'
// Class(Component) todos
class Todos extends React.Component {
constructor() {
super();
this.state = { age: 30 }; // Вот так иниц. переменные в классе
// вот это говорит что надо передать в функцию "this" потому как автоматом оно не появиться в методе ))
// так что если нужно использовать в методе "this", надо писать вот так
this.clicked = this.clicked.bind(this);
}
/*
* Just click on me func
*
*/
clicked(){
alert('gotIt');
this.getTasks()
};
/*
* Get tasks from DB
*
*/
getTasks(){
alert("U get tasks")
}
/*
* Render HTML
*
*/
render() {
return (
<div className="panel panel-default">
<div onClick={this.clicked} className="panel-heading">
<h3 id="gg">Its todoList Age: {this.state.age}</h3>
</div>
<div className="panel-body">
<ul className="list-group">
<li className="list-group-item">
<span className="badge">{this.props.name}</span>
Cras justo odio
</li>
</ul>
</div>
</div>
);
}
}
// RENDER IT
ReactDOM.render(<Todos name="Skavik"/>, document.getElementById('todo-div'));
Example 2
// main.js
import React from 'react';
import ReactDOM from 'react-dom'
import SomeItem from './second.js'
// 2. Creating Component(class)
class ShoppingList extends React.Component {
/*
* Just function
*
*/
clicked(){
alert('Clicked');
};
/*
* Render HTML
*
*/
render() {
return (
<div className="shopping-list">
<h1 onClick={this.clicked}>Shopping List for 123132{this.props.name}</h1>
<ul>
<li>Instagram</li>
<li>WhatsApp</li>
<li>Oculus</li>
</ul>
</div>
);
}
}
// 3. Render component
// ReactDOM.render(<TodoComponent/>, document.getElementById('todo-div'));
ReactDOM.render(<ShoppingList name="gg"/>, document.getElementById('todo-div'));
ReactDOM.render(<SomeItem/>, document.getElementById('todo-div1'));
// someitem.js
import React from 'react';
class SomeItem extends React.Component{
say(){ return(<p>GGG</p>) }
render(){
return(
<h2>It is SomeItem class {this.say}</h2>
)
}
}
export default SomeItem;
Динамическое создание полей и привязка их к состоянию. Так же сбор и выдача полей
index.js
import React, {Component} from 'react';
import ReactDOM from 'react-dom';
class App extends Component {
constructor() {
super();
this.state = {value: [], count: 1};
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(i, event) {
let value = this.state.value.slice();
value[i] = event.target.value;
console.log(value)
this.setState({value});
}
handleSubmit(event) {
alert('A name was submitted: ' + this.state.value);
event.preventDefault();
}
addClick(){
this.setState({count: this.state.count+1})
}
removeClick(i){
let value = this.state.value.slice();
value.splice(i,1);
this.setState({
count: this.state.count - 1,
value
})
}
createUI(){
let uiItems = [];
for(let i = 0; i < this.state.count; i++){
uiItems.push(
<div key={i}>
<input type="text" value={this.state.value[i] || ''} onChange={this.handleChange.bind(this,i)} />
<input type='button' value='remove' onClick={this.removeClick.bind(this,i)}/>
</div>
)
}
return uiItems || null;
}
render() {
return (
<form onSubmit={this.handleSubmit}>
{this.createUI()}
<input type='button' value='add more' onClick={this.addClick.bind(this)}/>
<input type="submit" value="Submit" />
<input type="button" value="getState" onClick={() => alert(JSON.stringify(this.state))}/>
</form>
);
}
}
ReactDOM.render(<App />, document.getElementById('root'));
page.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
<!-- Bootstrap -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
</head>
<body>
<div id="root"></div>
<script src="dist/bundle.js" charset="utf-8"></script>
</body>
</html>