foo.x = foo = {n: 2};
foo.x = (foo = {n: 2});
{ n: 2 }
.let foo = {};
const bar = foo;
foo.x = (foo = {n: 2});
console.log(foo.x === undefined); // true
console.log(bar); // { x: { n: 2 } }
console.log(bar.x === foo); // true
foo.x =
- присваивание свойства конкретному объекту. На момент вызова в нашем примере это {}
.foo =
- присваивание значения самому идентификатору foo. Это может быть примитив, ссылка на объект или функцию. В нашем случае это объект { n: 2 }
. console.log
в рендер компонентов, и смотреть нет ли лишних перерисовок. Конечно, добавлять не нужно сразу везде, а можно постепенно покрывать (либо фичу, либо страницу, либо просто то - что кажется большим и ресурсоемким).render() {
const { data } = this.props;
if (!data) return null;
return (
<div>
<FilterModels />
</div>
)
}
}
render() {
const { filterData } = this.props;
return (
<Wrapper>
{filterData && <FilterForm data={filterData} />}
</Wrapper>
)
}
import { fetchInitialDataApi } from './api';
const FETCH_INITIAL_DATA_REQUEST = 'FETCH_INITIAL_DATA_REQUEST';
const FETCH_INITIAL_DATA_SUCCESS = 'FETCH_INITIAL_DATA_SUCCESS';
const FETCH_INITIAL_DATA_ERROR = 'FETCH_INITIAL_DATA_ERROR';
const fetchInitialDataRequest = () => ({ type: FETCH_INITIAL_DATA_REQUEST });
const fetchInitialDataSuccess = data => ({
type: FETCH_INITIAL_DATA_SUCCES,
payload: data,
});
const fetchInitialDataError = error => ({
type: FETCH_INITIAL_DATA_ERROR,
payload: error,
});
const fetchInitialData => async dispatch => {
try {
dispatch(fetchInitialDataRequest());
const { data } = await fetchInitialDataApi();
dispatch(fetchInitialDataSuccess(data));
} catch error {
dispatch(fetchInitialDataError(error));
}
};
const initialState = {
data: {},
isLoading: false,
isError: false,
error: null,
};
export default function(state = initialState, action) {
const { type, payload } = action;
switch (type) {
case FETCH_INITIAL_DATA_REQUEST:
return {
...state,
isLoading: true,
isError: false,
error: null,
};
case FETCH_INITIAL_DATA_SUCCESS:
return {
...state,
data: payload,
isLoading: false,
};
case FETCH_INITIAL_DATA_ERROR:
return {
...state,
isLoading: false,
isError: true,
error: payload,
};
default:
return state;
}
}
export default (state = window._data) => state;
function makeChildElementSelector() {
let lastChildProps, lastForwardRef, lastChildElement
return function selectChildElement(childProps, forwardRef) {
if (childProps !== lastChildProps || forwardRef !== lastForwardRef) {
lastChildProps = childProps
lastForwardRef = forwardRef
lastChildElement = (
<FinalWrappedComponent {...childProps} ref={forwardRef} />
)
}
return lastChildElement
}
}
data.goals[0].gs_id
export default class Forma extends React.Component {
constructor(props) {
super(props);
this.state ={ data: {}, isFetching: true, error: null };
}
componentDidMount() {
fetch('http://localhost:3001')
.then(response => response.json())
.then(result => this.setState({data: result, isFetching: false }));
.catch(e => {
console.log(e);
this.setState({data: result, isFetching: false, error: e }));
});
}
render() {
const { data, isFetching, error } = this.state;
if (isFetching) return <div>...Loading</div>;
if (error) return <div>{`Error: ${e.message}`}</div>;
return <h1>{data.goals[0].gs_id}</h1>;
}
}
const
вместо let
для определения переменных которые не переопределяются в коде. Это помогает снизить когнитивную нагрузку с человека читающего код и негласный стандарт в React разработке.{
isModal
? <Route path="/auth" component={AuthPopup} />
: null
}
{isModal && <Route path="/auth" component={AuthPopup} />}
function mapDispatchToProps(dispatch) {
return {
autoLogin: () => dispatch(autoLogin()),
getBrowser: () => dispatch(getBrowser()),
getMedia: () => dispatch(getMedia())
}
}
const mapDispatchToProps = {
autoLogin,
getBrowser,
getMedia,
};
& label {}
& input {}
& span {}
import {combineReducers} from 'redux';
import photoReducer from './photoReducer';
import authReducer from './authReducer';
import globalReducer from './globalReducer';
export default combineReducers({
photoReducer, authReducer, globalReducer
})
import {combineReducers} from 'redux';
import photo from './photoReducer';
import auth from './authReducer';
import global from './globalReducer';
export default combineReducers({
photo,
auth,
global,
});
return e === 'invalid-email' ? 'Неверно указан e-mail'
: e === 'user-not-found' ? 'Указанный e-mail на найден'
: e === 'wrong-password' ? 'Неверный пароль'
: e === 'email-already-in-use' ? 'Указанный e-mail уже используется'
: e === 'network-request-failed' ? 'Нет подключения к интернету'
: e === 'operation-not-allowed' ? 'Произошла ошибка, попробуйте снова'
: e === 'popup-closed-by-user' ? 'Окно авторизации закрыто пользователем'
: e === 'account-exists-with-different-credential' ? 'Аккаунт уже существует с другими данными, используйте другой способ авторизации'
: e
switch case
import {SET_ACTIVE, CHANGE_VALUE, SET_DEFAULT, UPLOAD, UPDATE_IMAGE, SET_IMAGE_ERROR, SET_LIKE, SET_COMMENT, ADD_ARTICLE_SUCCESS, FETCH_ARTICLES_START, FETCH_ARTICLES_SUCCESS, FETCH_ARTICLES_ERROR} from '../actions/actionTypes';
import {
SET_ACTIVE,
CHANGE_VALUE,
SET_DEFAULT, UPLOAD,
UPDATE_IMAGE,
SET_IMAGE_ERROR,
SET_LIKE,
SET_COMMENT,
ADD_ARTICLE_SUCCESS,
FETCH_ARTICLES_START,
FETCH_ARTICLES_SUCCESS,
FETCH_ARTICLES_ERROR,
} from '../actions/actionTypes';
function mapStateToProps(state) {
return {
browser: state.globalReducer.browser
}
}
const mapStateToProps = state => ({
browser: browserSelector(state),
});
class Flight extends Component {
getWeekDay = (date) => {
//..
}
// ....
}
const newDate = new Date (year, month, day, );
const monthName = ["дек", "янв", "фев", "мар", "апр", "мая", "июня", "июля", "авг", "сент", "окт", "ноя", "дек"];
const newMonth = monthName[newDate.getMonth()];
const newDate = new Date(year, month - 1, day)
const getStopsNumber = (stop) =>{
switch (stop) {
case 3:
return "3 пересадки"
case 2:
return "2 пересадки"
case 1:
return "1 пересадка"
case 0:
return "без пересадок"
default:
return // это не нужно делать, писать return. Если вы удалите эту (и строку выше), то результат будет такой же - undefined
}
}
<input onClick={() => this.props.stopsClick("allStops")} />
<input onClick={() => this.props.stopsClick("noStops")} />
if( this.state.stops.allStops === false && this.state.stops.noStops === true && this.state.stops.oneStop === true && this.state.stops.twoStop === true && this.state.stops.threeStop === true ){
newStops = {...this.state.stops, allStops: true}
}
import * as React from 'react';
import styled from 'styled-components';
const Wrapper = styled.label`
position: relative;
display: inline-block;
width: 40px;
height: 24px;
`;
const Input: any = styled.input`
display: none;
`;
const Slider = styled.div`
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
transition: .2s;
border-radius: 34px;
&:before {
position: absolute;
content: "";
height: 22px;
width: 22px;
left: 1px;
bottom: 1px;
background-color: white;
transition: .2s;
border-radius: 50%;
}
${Input}:checked + & {
background-color: ${props => props.theme.someColor1};
}
${Input}:focus + & {
box-shadow: 0 0 1px ${props => props.theme.someColor2};
}
${Input}:checked + &:before {
transform: translateX(16px);
}
`;
interface Props = {
name?: string
checked?: boolean
onChange?: Function
innerRef?: Function
className?: string
}
const ToggleSwitch = ({ innerRef, checked, onChange, className, name }: Props) => {
return (
<Wrapper className={className}>
<Input
innerRef={innerRef}
checked={checked}
onChange={onChange}
name={name}
type="checkbox"
/>
<Slider />
</Wrapper>
);
}
import Logo from 'images/Logo.png';
const StyledLogo = styled.img.attrs({
src: Logo,
alt: 'Aviasales'
})`
width: 60px;
height: 61px;
`;
const StyledLogo = styled.img`
width: 60px;
height: 61px;
`;
<StyledLogo src={logo} alt="Aviasales" />
const Error = ({ text }) => (
<StyledError dangerouslySetInnerHTML={{__html: text}} />
);
white-space: pre-line;
let element;
if (error && !isLoading) {
element = <Error text={error} />;
}
if (!error && isLoading) {
element = <Loader />;
}
if (!error && !isLoading) {
element = (
<>
<Heading />
<Main
isCurrencyExchanging={isCurrencyExchanging}
activeCurrency={activeCurrency}
handleCurrencyChange={this.handleCurrencyChange}
ticketsFilteredByStops={ticketsFilteredByStops}
stops={stops}
handleStopsChange={this.handleStopsChange}
handleUncheckOther={this.handleUncheckOther}
/>
</>
);
}
return element;
if (isLoading) return <Loader />;
if (error) return <Error text={error} />;
return (
<>
<Heading />
<Main
isCurrencyExchanging={isCurrencyExchanging}
activeCurrency={activeCurrency}
handleCurrencyChange={this.handleCurrencyChange}
ticketsFilteredByStops={ticketsFilteredByStops}
stops={stops}
handleStopsChange={this.handleStopsChange}
handleUncheckOther={this.handleUncheckOther}
/>
</>
);
filterTickets = (tickets, stops) => {
return tickets.filter((ticket) => {
return values(stops).indexOf(ticket.stops) !== -1;
});
};
filterTickets = (tickets, stops) => tickets.filter(
ticket => values(stops).includes(ticket.stops),
);
componentsDidMount() {
// много кода
}
componentsDidMount() {
this.fetchSomeData();
}
const Wrapper = styled.div`
// some styles
`;
const ChildElement = styled.div`
// some styles
`;
class MyComponent extends React.Component {
static ChildElement = ChildElement;
render() {
const { className } = this.props;
return (
<Wrapper className={className}>
<ChildElement>Some text</ChildElement>
</Wrapper>
)
}
}
export default MyComponent;
const SyledMyComponent = styled(MyComponent)`
// some styles
${MyComponent.ChildElement} {
// some styles for ChildElement
}
`;
const AbstractElement = styled.div`
// some styles
`;
const ConcreteElement = AbstractElement.extend`
// some styles
`;