• Варианты менеджмента обработки состояний запросов в Redux?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    В плане так их надо передать в редюсер для ошибок, а в компоненте следить за изменением этого редюсера...

    Не надо. Ошибку и состояние загрузки можно обрабатывать в том же редьюсере, что и токен.
    const initialState = {
      isFetching: false,
      token: null,
      error: null,
    };
    
    function auth(initialState, action) {
      switch(action.type) {
        case LOGIN_REQUEST:
          return {
            ...state,
            isFetching: true,
            error: null,
          };
    
        case LOGIN_SUCCEEDED:
          return {
            ...state,
            isFetching: false,
            token: action.payload,
          };
    
        case LOGIN_FAILED:
          return {
            ...state,
            isFetching: false,
            error: action.payload,
          };
    
        default:
          return state;
      }
    }


    Будет ли правильным делать запросы из компонента?

    Не будет.

    Ведь так при ошибке мы может её сразу добавить в стейт errors компонента и всё.

    Не ясно зачем вам вообще добавлять ошибку в state.

    const mapStateToProps = state => ({
      error: loginErrorSelector(state),
    });


    render() {
      const { error } = this.props;
    
      if (error) return <TryAgain error={error} action={login} />;
      
      return ( /* ... */ );
    }
    Ответ написан
    Комментировать
  • Как выполнить ПОСТ запрос с параметрами бади и хэдер?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    const form = new FormData();
    form.append('key', 'ecmdecmedmjrjekrkl');
    
    fetch('/some-path', {
      method: 'POST',
      headers: "Content-Type: application/x-www-form-urlencoded",
      body: form,
    }).then(assets => this.setState({assets}, () => console.log('Fetched!')));


    По-хорошему, ваше приложение должно взаимодействовать с сервером по REST API, данные передаваться в формате JSON.

    Захардкоженный ключ доступа не лучшее решение.
    Ответ написан
    Комментировать
  • React, функциональные компоненты, компоненты-классы, хуки?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Хуки, по сути, решают всего лишь одну проблему - проблему переиспользования логики состояния компонентов. Если это вам не надо используйте классы, если они больше нравятся. На случай если не видели хороших примеров использования хуков, оцените возможности кастомных хуков.

    useCallback предотвращает обновление дочернего компонента, при передаче ему хандлера. Вызов useCallback(fn, deps) эквивалентен useMemo(() => fn, deps). При каждом обновлении родительского компонента без этой обертки возвращалась бы новая ссылка на функцию и инициировала бы обновление дочернего компонента. С useCallback будет возвращаться старая ссылка, пока не изменится хотя бы один из элементов массива deps.
    Ответ написан
  • Сжатые и не сжатые версии js,css webpack?

    rockon404
    @rockon404
    Frontend Developer
    Я надеюсь вы понимаете, что сгенерированные файлы и "исходники" это разные вещи. И "последующим разработчикам" стоит передавать именно исходники, а не то, что вы нагенерировали.

    Вариант с настройкой гит репо на сервере не подойдёт.

    Неужели это так сложно - выполнить пять команд в консоли и предоставить исходный код в виде репозитория со всеми пояснениями по установке и сборке на одной из популярных площадок вроде bitbucket, github?
    На крайняк передавайте исходники архивом.
    Ответ написан
  • Как запретить передачу параметров в компонент в зависимости от условий?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    const { param1, param2 } = this.props;
    
    const props = param === 'none' ? {} : { param1, param2 };
    
    return (
      <Component {...props} />
    );
    Ответ написан
    Комментировать
  • Как передать изменённые данные в хранилище redux другой компоненте если используется routing?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    1. Для инициации перехода на новый роут без перезагрузки страницы, следует вызывать:
    this.props.history.push('/user');
    2. И справьте первый route на:
    <Route exact path="/" component={Form} />
    Если используете свойство render(в вашем случае в этом нет смысла), то передавайте аргументом свойства роутера:
    <Route exact path="/" render={routeProps => <Form {...rotueProps} />} />

    3. Никакой redux-router вам не нужен.
    4. Не ленитесь изучать возможности библиотек с которыми работаете. Нативные ссылки не имеют никакого отношения к роутеру вашего приложения. Советую изучить исходный код всех компонентов библиотеки react-router-dom. Так у вас хоть будет понимание того как он работает.
    5. Вы закомментили вызов const state = createStore();. Верните обратно.
    6. Уберите из проекта JQuery. Для AJAX запросов используйте axios/superagent/fetch.
    7. Запросы к API по-хорошему выполнять в redux middleware. Советую использовать redux-thunk
    Ответ написан
    2 комментария
  • Как можно стать сеньором за 3-3.5 года?

    rockon404
    @rockon404
    Frontend Developer
    В современном фронтенде можно как-то так:

    1-ый год: вы пришли в компанию с хорошими фундаментальными знаниями, знаете базовые API инструментов с которыми будете работать. На github лежит красивый ToDo List или WeatherApp на любимом фреймворке, а к его коду особо и не придерешься. Вас взяли на вашу первую работу в хорошую компанию, выбрали из нескольких кандидатов. Вы Junior. Компания занимается разработкой серьезных проектов(социальные сети, e-commerce, финтех и пр.). Команда очень сильная. Тут используют линтеры, прекоммиты, типизацию, строгий workflow и code-review. В первый год вы успеваете поучаствовать в паре проектов. Набираетесь опыта, упорно работаете над собой, читаете статьи, смотрите конференции. Умеете успешно находить решения типовых задач. Выбираете лучшие и без труда перепишите их под текущую задачу, если они не совсем подходят.

    2-ой год: вы в хорошо знаете все инструменты с которыми работаете, знаете весь инструментарий web разработчика, умеете решать многие типовые задачи, изучаете исходные коды библиотек, которые используете, знаете как лучше спроектировать ту или иную часть в конкретном случае и можете ответить на вопрос "почему так будет лучше?", влегкую развернете новый проект, что вам в итоге и доверяют. Вы уверенный Middle.

    3-ий год: вы понимаете, что в первую очередь вы решаете задачи бизнеса, умеете делать это эффективно, понимаете, что в принципе нет задач, которые нельзя решить. У вас есть опыт в поддержке живых проектов(исправление багов, расширение функционала, миграции, рефакторинг, онбоардинг для новичков). Вы собеседуете новых членов команды. Начинаете очередной проект, возможно уже в другой компании, на этот раз все гораздо серьезней и ваша роль в проекте гораздо важней, тут уже все зависит от ваших решений. Проект дошел до релиза. Поддержка, новые фичи, рефакторинг.

    4-ый год: Начали еще один. В вашем портфолио несколько проектов, в каких-то вы просто участвовали и внесли тот или иной вклад, но хотя бы один дошедший до релиза можно назвать вашим. Вы Senior.

    Все ИМХО, конечно.
    Ответ написан
    Комментировать
  • Как изменить код, чтобы не появлялась ошибка?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Вы по приходу свойства error обновляете компонент в бесконечном цикле. Сам метод componentWillReceiveProps не рекомендован к использованию.
    Не ясно зачем вам писать каждое новое значение свойства в одноименный state, если можно использовать напрямую?
    Решение:
    static getDerivedStateFromProps(props, state) {
      if (props.message) {
        return { message: props.message };
      }
    }
    Ответ написан
  • Как сделать фильтрацию массива?

    rockon404
    @rockon404
    Frontend Developer
    const filteredUsers = users.filter(user => user.id !== targetId);

    где targetId - id пользователя которого хотите убрать из результатов.
    Ответ написан
    Комментировать
  • Куда мне писать токен при авторизации и получать данные?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    1. Бессмысленно это делать при создании store. Только запутаете код. Делать это стоит в async action. При создании store разве уместно положить инстанс axios дополнительным аргументом в redux-thunk, но только если используете SSR.
    2. Так же в async action.

    Создайте действие init и проверяйте там наличие токена, и загружайте нужные для инициализации данные:
    export function init() {
      return async (dispatch, getState) => {
        const token =  Cookies.get('token');
    
        if (token) {
          axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
          await dispatch(fetchUserData());
          // some other code
        } else {
          // else case code
        }
      };
    }


    Вызывайте init сразу после создания store:
    const store = configureStore();
    store.dispatch.(init());
    
    const Root = () => (
      <Provider store={store}>
        <Router>
          <App />
        </Router>
      </Provider>
    );
    Ответ написан
    1 комментарий
  • Как правильно "привинтить" React к Laravel?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    - Я уже привык к шаблонам Blade - циклы, условия, особенно понравился пэйджинг(пагинация) - но если я решу выводить все это при помощи React - это мне придется отказаться от Blade или как?

    Странный вопрос. Если вы хотите переписать какой-то компонент с Blade на React, то естественно вам придется отказаться от использования Blade в его реализации.

    То есть, я правильно понял, что если использовать React - про встроенный постраничный вывод можно забыть? :)

    Вам уже отвечали на этот вопрос.

    Что посоветуете?

    Устроиться на работу, где вы сможете пощупать реальные проекты, написанные опытными программистами и получить боевой опыт.
    Ответ написан
    Комментировать
  • Как правильно адапттировать single page application под маленькие экраны?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Можно использовать react-responsive или что-то наподобие.
    Ответ написан
    Комментировать
  • Зачем нужно использовать styled-components вместо обычного css-файлы?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    На официальном сайте есть раздел Motivation. Это и есть ответ на ваш вопрос.

    почему нельзя просто все стили для блоков компонентов написать в одном файле и просто инлайново в index.html их подключить?

    Как минимум, вам чтобы изолировать стили придется использовать BEM, либо подобный велосипед. StyledComponets позволяет вообще не использовать селекторы в исходном коде(имхо - пятое колесо в компонентной архитектуре). Библиотека генерирует изолированные селекторы сама.

    StyledComponents - не панацея, лишь один из подходов в решении насущных задач со своими преимуществами и недостатками.
    Ответ написан
    Комментировать
  • Как правильно сделать выборку ref (React)?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Зачем вам ref каждого элемента списка? Работайте с состоянием. Большинство задач в React-разработке решаются без прямого обращения к DOM-элементам.

    Уберите this.init() из render и никогда так не делайте. Почитайте о жизненном цикле компонента.
    Ответ написан
  • Как перенести и встроить созданное в локальном Node.js React-приложение (простую кнопку) на работающий сайт?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    1. Не ясно зачем вы переместили index.css и index.js в public. Попробуйте почитать про create-react-app - что это, зачем и как работает.
    2. Чтобы собрать билд достаточно выполнить в директории проекта:
    npm run build
    билд будет собран в директории my-app/build
    Ответ написан
    6 комментариев
  • Как подсчитать количество элементов?

    rockon404
    @rockon404
    Frontend Developer
    Ответ написан
    Комментировать
  • Как преобразовать функцию в класс React?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Как преобразовать ее в класс, чтобы добавить state с параметром загрузки, который потом можно было бы получать в других частях приложения?

    Срочно изучайте теорию.

    Пример решения:
    export const getResourcesAction = () => async (dispatch, getState) => {
      const { resources } = getState();
      if (isEmpty(resources)) {
        try {
          dispatch({ type: LOAD_RESOURCES_REQUEST });
    
          const res = await fetch('/api/resources/all', { credentials: 'include' });
          const data = await res.json();
          dispatch({
            type: LOAD_RESOURCES_SUCCEEDED,
            payload: {
              resources: data,
            },
          });
        } catch (error) {
          dispatch({
            type: LOAD_RESOURCES_FAILED,
            payload: {
              error,
            },
          });
        }
      }
    };
    
    const initialState = {
      isFetching: false,
      data: [],
      error: null,
    };
    
    export default function resourcesState(state = initialState, action) {
      switch (action.type) {
        case LOAD_RESOURCES_REQUEST:
          return {
            ...state,
            isFetching: true,
            error: null,
          };
        case LOAD_RESOURCES_SUCCEEDED:
          return {
           data: action.payload.resources,
            isFetching: false,
          };
       case LOAD_RESOURCES_FAILED:
          return {
            ...state,
            isFetching: false,
            error: action.payload.error,
          };
        default:
          return state;
      }
    }
    Ответ написан
    Комментировать
  • Как правильно сохранить ref?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    В state сохранять не надо, достаточно добавить ссылку в свойство класса:
    class Parent extends React.Component {
      childRef = React.createRef();
    
      render() {
        return <Child childRef={this.childRef} />;
      }
    }
    Ответ написан
    Комментировать
  • Проблемы с setInterval, в чём проблема?

    rockon404
    @rockon404
    Frontend Developer
    class MyImage {
      constructor({
        speed,
        left,
        right,
        top,
        bottom,
        id,
      }) {
        this.speed = speed;
        this.top = top || 0;
        /* ... */
      }
      moveDown() {  /* ... */ }
      moveUp() {  /* ... */ }
      moveRight() {  /* ... */ }
      moveLeft() {  /* ... */ }
      positionF() {  /* ... */ }
    }
    
    const img = new MyImage({
      id: '#2',
      speed: 1,
      left : 666,
      top : 400,
    });
    Ответ написан