Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions classworks/lesson-2/_babelrc

This file was deleted.

18 changes: 0 additions & 18 deletions classworks/lesson-2/index.html

This file was deleted.

25 changes: 0 additions & 25 deletions classworks/lesson-2/package.json

This file was deleted.

212 changes: 212 additions & 0 deletions classworks/lesson-2/react-components-theory.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
import React from 'react';// для бабеля, чтобы когда он будет трансформировать код в
// React.createElement, он мог добавить эту зависимость

// ----------------КОМПОНЕНТЫ-----------------------------------------------------------------


//---1 вариант создания компонента--------------------------------
//---базовый реакт-компонент-------------------------------------

// он написан с большой буквы
// он принимает в себя props
// работает быстрее, чем написанный на классе
// это превратится просто в React.createElement

const Avatar = (props) => { // здесь пришедшие пропсы никогда не переопределяем!!
props.log(); //privet
console.log(props.title2) // true
return (
<div>
<img src={props.src} />
<h3>{props.title}</h3> // если вдруг в пропсах title не пришел, то будет пусто
// чтобы все равно там что-то отображать, даже если тайтл не пришел, используют defaultProps
</div>
)
}

Avatar.defaultProps = { // это типа static свойства
title: 'Avatar 2 cool cinema' //это значание попадет в h3 Аватара, если там в пропсах никакой тайтл не придет
}

//---2 вариант создания компонента---------------------------------
//---можно написать компонент при помощи класса--------------------
// он должен обязательно наследовать React.Component
// он должен обязательно иметь метод render()
// метод render() возвращает ту верстку, которая в нем будет лежать
// constructor необязателен (даже в js)
// так как есть наследование от React.Component, то есть доп функционал, кот лежит в прототипах
// это превратится в нечто юолее сложное, чем просто React.createElement

// export class Header extends React.Component { // - если хотим экспортировать класс в Апп, например,
// то тут пишем export, а в Апп принимаем его как import {Header} from 'путь/к/файлу'
class Header extends React.Component {
render() {
return (
<header>
<h1>User name</h1>
<Avatar
src = 'http://google.com' // в компонент можно передать все, что хочешь - строку
log = {() => { // функцию, объект, массив, другой компонент
console.log('privet') // это ф-ция придет в компонент Avatar в пропсах,там можно ее сразу и вызвать
}}
title = "Title from Avatar" // это прийдет в компонент Avatar в его h3
title2 // даже так можно передать что-то, без значания. Это значит, что это свойство есть
// и его нельзя перебить с помощью defaultProps
onClickFunc = {(str) => { // так onClick придет в Аватар в составе props
console.log(str); // 'will be shown'
}
}
<button onClick={() => {console.log('qwerty')}}>Header button</button> //а так onClick повесится как обработчик события на button
/>
</header>
)
}

}

//--------THIS.PROPS и методы----------------------------------------------------
// Как пропсы передаются в класс? Перепишем компонент Аватар как класс:

class Avatar extends React.Component{
// class Avatar extends Component - можно писать так, но тогда в самом верху пишем import React, {Component} from 'react';

static defaultProps = {
title: 'Avatar 2 cool cinema'
};
/*static get defaultProps() { // такая запись по новой спеке, но пока лучше так не писать
return {
title: 'Avatar 2 cool cinema'
}
};*/

render() {
console.log(this.props) // тут уже не просто props, а this.props
return (
<div>
<img src={this.props.src} />
<h3>{this.props.title}</h3>
<button onClick={this.props.onClickFunc('will be shown')}>Submit</button>//при клике на кнопку хочу отображать каунтер в компоненте Header
// при этом сам onClick описываем в родителе, т.е. в компоненте Header
</div>
)
}

}
// для доступа к пропсам используем this
// defaultProps уже не пишем отдельно, а пишем прям в классе


//----SETSTATE()----------------------------------------------------------------------
import React, {Component} from 'react';

export class InputComponent extends Component {
constructor() {
super();

this.state ={ // чтобы указать this.state, обязательно нужно писать constructor
inputValue = '',
};
//this.inputChange = this.inputChange.bind(this) //так надо было бы биндить ф-цию
}

//inputChange(event) { можно было написать так, но тогда надо было бы писать в конструкторе биндинг
inputChange = (event) => { // при вводе чего-то в инпут ф-ция меняет значение this.state.inputValue в стейте
this.setState({
inputValue: event.target.value, // реклмендовано таким образом отслеживать инпуты
})
}

render() {
return {
<div>
<input type="text"
value={this.state.inputValue}
onChange = {this.inputChange} //по onChange будет срабатывать ф-ция inputChange
/>
</div>

}
}
}

//--ПРИМЕР С COUNTER-------------------------------------------------
// при кликена кнопочки число в теге p будет увеличиваться или умеьшаться
import React, {Component} from 'react';

export class Counter extends Component {
constructor() {
super();

this.state ={
counter: 0,
};

};

incrementCounter = () => {
this.setState({
counter: this.state.counter + 1,
}, () => {
console.log('I run after setState')// setState вторым параметром принимает колбек ф-цию,
// которая выполнится сразу после выполнения setState
})
}

//state = { //можно не писать constructor и в нем this.state, а просто state = {}
// counter: 0,
//};

decrementCounter = () => {
//this.state.counter = this.state.counter + 1 - такая запись не влечет за собой перерисовку ДОМ, только setState
this.setState({
counter: this.state.counter - 10,
});

this.setState((prevState) => { //в setState можно передать не только объект, но и функцию
console.log(prevState);
return {
counter: prevState.counter + 1; //prevState - предыдущее состояние
} // по клику сначала сработает this.state.counter - 10, потом prevState.counter + 1,
// т.е если было изначально 100, то сначала станет 100-10=90, потом prevState+1, т.е. 90+1=91
//

});
}

render() {
console.log(this.props.children);// 'qwerty' - придет из Апп
return {
<div>
<button onClick={this.incrementCounter}>Increment +</button> // по клику вызывается ф-ция incrementCounter
<p>{this.state.counter}</p>
<button onClick={this.decrementCounter}>Decrement -</button> // по клику вызывается ф-ция decrementCounter
</div>

}
}
}




//---ЭТО ДОЛЖНО БЫТЬ НАПИСАНО В App.js, чтобы это все работало:---------
import React, {Component} from 'react';
import {Header} from 'путь к файлу где лежит компонент Header';
import {InputComponent} from 'путь к файлу где лежит компонент InputComponent';
import {Counter} from 'путь к файлу где лежит компонент Counter';

class App extends Component {
render() {
return {
<main>
<Header />
<InputComponent />
<Counter>
qwerty //это qwerty придет в компонент Counter как this.props.children. Можно передать что угодно - кусок верстки, другой компонент
</Counter>
</main>
}
}
}

export default App;
41 changes: 0 additions & 41 deletions classworks/lesson-2/src/main.js

This file was deleted.

21 changes: 21 additions & 0 deletions classworks/lesson-2/store/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# See https://help.github.com/ignore-files/ for more about ignoring files.

# dependencies
/node_modules

# testing
/coverage

# production
/build

# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local

npm-debug.log*
yarn-debug.log*
yarn-error.log*
Loading