• Как в react-select передать массив для свойства isOptionDisabled?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Вы должны передавать в isOptionDisabled функцию, которая принимает первым аргументом опцию и возвращает Boolean.

    createIsOptionDisabled = disOptions => option =>
      disOptions.some(({ value }) => value === option.value);


    return (
      <Select
        options={options}
        isOptionDisabled={this.createIsOptionDisabled(disOptions)}
      />
    );
    Ответ написан
    Комментировать
  • Как добавить значение в store redux?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Например
    import React, { useCallback, useRef } from 'react';
    import ReactDOM from 'react-dom';
    import { combineReducers, createStore } from 'redux';
    import { Provider, connect } from 'react-redux';
    
    // action type
    const ADD_MESSAGE = 'ADD_MESSAGE';
    
    // action creator
    const addMessage = payload => ({
      type: ADD_MESSAGE,
      payload,
    });
    
    // reducer
    const messages = (state = [], action) => {
      switch (action.type) {
        case ADD_MESSAGE:
          return [...state, action.payload];
        default:
          return state;
      }
    };
    
    // root reducer
    const rootReducer = combineReducers({
      messages,
    });
    
    // store
    const store = createStore(rootReducer);
    
    const App = ({ addMessage, messages }) => {
      const inputRef = useRef(null);
    
      const handler = useCallback(() => {
        addMessage(inputRef.current.value);
        inputRef.current.value = '';
      }, [inputRef, addMessage]);
    
      return (
        <div>
          <ul>
            {messages.map((message, i) => (
              <li key={i}>{message}</li>
            ))}
          </ul>
          <input ref={inputRef} />
          <button onClick={handler}>Add Message</button>
        </div>
      );
    };
    
    const mapStateToProps = state => ({
      messages: state.messages,
    });
    
    const mapDispatchToProps = {
      addMessage,
    };
    
    const ConnectedApp = connect(
      mapStateToProps,
      mapDispatchToProps
    )(App);
    
    const root = (
      <Provider store={store}>
        <ConnectedApp />
      </Provider>
    );
    
    const rootElement = document.getElementById('root');
    ReactDOM.render(root, rootElement);

    Пример с использованием redux-act
    import React, { useCallback, useRef } from 'react';
    import ReactDOM from 'react-dom';
    import { combineReducers, createStore } from 'redux';
    import { Provider, connect } from 'react-redux';
    import { createAction, createReducer } from 'redux-act';
    
    // action creator
    const addMessage = createAction('ADD_MESSAGE');
    
    // reducer
    const messages = createReducer({}, []);
    messages.on(addMessage, (state, message) => [...state, message]);
    
    // root reducer
    const rootReducer = combineReducers({
      messages,
    });
    
    // store
    const store = createStore(rootReducer);
    
    const App = ({ addMessage, messages }) => {
      const inputRef = useRef(null);
    
      const handler = useCallback(() => {
        addMessage(inputRef.current.value);
        inputRef.current.value = '';
      }, [inputRef, addMessage]);
    
      return (
        <div>
          <ul>
            {messages.map((message, i) => (
              <li key={i}>{message}</li>
            ))}
          </ul>
          <input ref={inputRef} />
          <button onClick={handler}>Add Message</button>
        </div>
      );
    };
    
    const mapStateToProps = state => ({
      messages: state.messages,
    });
    
    const mapDispatchToProps = {
      addMessage,
    };
    
    const ConnectedApp = connect(
      mapStateToProps,
      mapDispatchToProps,
    )(App);
    
    const root = (
      <Provider store={store}>
        <ConnectedApp />
      </Provider>
    );
    
    const rootElement = document.getElementById('root');
    ReactDOM.render(root, rootElement);
    Ответ написан
    Комментировать
  • Правда ли, что сейчас так сложно найти работу?

    rockon404
    @rockon404
    Frontend Developer
    Правда ли, что сейчас так сложно найти работу?

    Не правда. Сильных специалистов как не хватало, так и будет не хватать.

    Другое дело люди которые мечтают протиснуться с минимальными знаниями куда-угодно, где поменьше конкуренция. Последние мало где нужны, а где нужны на одно место сотни таких же почти ничего не умеющих, не знающих и не подающих особых надежд.

    Печально, что вы совсем не поняли посыл статьи. Возможно, вы из той массы, кому найти работу будет сложно.
    Ответ написан
    Комментировать
  • Styled components и className?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Или лучше так

    Почему так делать не стоит:
    1. Страдает изоляция. Любая сторонняя библиотека с ccs может поломать ваш код в самых неожиданных местах.
    2. Возможные проблемы при изменении структуры.
    3. Возможные проблемы при добавлении свойств состояния, от которых будет зависеть верстка. Придется по-старинке плодить селекторы состояния или прокидывать свойства через родителя.

    Если больше нравится второй подход, то стоит посмотреть в сторону css модулей.
    Ответ написан
    Комментировать
  • Как правильно сообщить компоненту Movie, что тот или иной фильм рекомендован?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Суть:
    const recommendation = recommendations.find(({ movieId }) => movieId === movie.id);


    Поиск можно выполнять в селекторе, в колбеке movies.map, при необходимости меморизировать и тд.
    Ответ написан
    2 комментария
  • Как решить данные вопросы по реакту?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    так как вк ведь тоже на react-е

    VK написан не на React. Там может и есть новые React модули, но весь основной функционал написан на ванильном JS.

    но при этом в local storage нет токенов

    VK на web-клиенте хранят токены в HTTP Only Cookie. А ключ для запросов к бэкенду возвращают в коде авторизованной страницы.

    нет данных пользователя

    Что касается данных пользователя, то хранить их в localStorage нет особого смысла. Их можно запрашивать при инициализации приложения.

    Где хранить данные полученные от сервера после авторизации

    Ваше решение должно учитывать требования к безопасности конкретного приложения. Безопасней всего ничего нигде не хранить. На втором месте использование HTTP Only Cookie.

    Как разрешить указывать уникальный url для страницы профиля

    Добавить уникальное поле, например, userName.

    Что бы хотел получить в ответ на вопросы:
    1) Правильно ли у меня сейчас сделано.
    2) Если не правильно, то как сделать правильно.
    3) Литературу, которая бы помогла приблизиться к вк по реализации этого вопроса.
    4) Так же очень сильно хотелось бы узнать, где можно найти литературу, которая бы помогла сделать приложение максимально безопасным.

    1) Ну в теории данные легко украсть, например, с помощью, браузерного расширения, вредоносной библиотеки или если будет дыра, позволяющая выполнить XSS. Если не ошибаюсь, то простые XSS атаки вроде:
    https://site.net/?name=<script>alert(document.cookie)</script>

    давно не работают.
    2) Сложный вопрос и у разных разработчиков на него разные ответы. Изучайте чужой опыт и обсуждения.
    3) Тут разве ждать когда разработчики VK решат написать об этом статью или рассказать о своем опыте на конференции. Еще вы можете самостоятельно заняться реверс инжинирингом их клиента или поискать статьи/посты людей которые им занимались.
    4) Начните с чек-листа по безопасности web-приложения.
    Ответ написан
  • Поведение useMemo между компонентами?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Результат вычислений useMemo привязан к конкретному экземпляру компонента.
    У вас два варианта:
    1. перенести вычисления вверх по древу.
    2. использовать другие инструменты для меморизации.
    Ответ написан
    Комментировать
  • Как запретить перерисовывать компонент при переходе по роутам?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Тут все зависит от ряда факторов:
    1. Если Header находится на страницах, отрисовываемых по определенным маршрутам, то только переносом компонента за пределы Route.

    2. Если он находится за пределами Route и ваше приложение полностью перерисовывается при смене маршрутов, то компонент можно обернуть в React.memo.
    Ответ написан
    Комментировать
  • В чем минусы установки React через подключение скриптов?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Если загружать React и ReactDOM с CDN, а для своего кода использовать бандл собранный Webpack, то вы, возможно, получите такие плюсы, как: уменьшенный размер бандла и повышенную скорость загрузки, так как React и ReactDOM у пользователей возможно будет закеширован. С другой стороны существуют риски попасть в ситуацию, когда CDN по какой-либо причине может быть недоступен.

    Писать приложение в скрипте text/babel лучше не стоит, так как webpack позволяет автоматизировать множество процессов, которые вам придется контролировать самостоятельно, имеет очень удобный инструментарий для разработки, ну и писать поддерживаемый, расширяемый код с ним гораздо проще.
    Ответ написан
    Комментировать
  • Что лучше изучить начинающему vue или react?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Попробуйте обе библиотеки и выберите для изучения ту, которая больше понравится. Написать два Todo List много времени не займет.
    Ответ написан
    Комментировать
  • Как правильно и красиво обновлять states для вложенных объектов в React?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    1. map - метод для преобразования данных, а не для перебора.
    2. Если изменяемые только два свойства, то не ясно зачем вам вообще иметь сложную вложенную структуру и держать ее в state.
    Ответ написан
    Комментировать
  • Понимание жизненного цикла React вкупе с получением данных от сервера?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    В данном примере curPrice - это props получаемые от сервера

    Метод жизненного цикла componentDidMount вызывается после render.
    Ничего удивительного в том, что при первой отрисовке вместо данных вы получаете undefined нет. К этому моменту еще даже не инициирован ваш запрос на сервер.

    Поэтому чтобы записать State - приходится делать дополнительную проверку,
    которую я нигде в примерах не встречал - это правильно?..

    Тут не ясно для чего вам вообще использовать состояние. Если вы никак не изменяете это значение в своем компоненте, то используйте его напрямую из props.
    Ответ написан
  • Как уйти от использования async в js?

    rockon404
    @rockon404
    Frontend Developer
    Учитесь писать асинхронный код. Синхронная отправка запроса блокирует страницу до получения ответа и имеет ряд ограничений.
    Ответ написан
    Комментировать
  • Как правильно вставить тэги, не нарушив структуру html?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Как вариант, анализировать строку на парные теги и перед открывающими тегами без пары закрывать span и открывать сразу после.

    Например, исходная строка:
    %%START<strong>Lorem ipsum</strong> <i>dolor <u>sit amet%%END

    обработанная:
    <span><strong>Lorem ipsum</strong> </span><i><span>dolor </span><u><span>sit amet</span>

    В итоге, три тега span покрывают весь необходимый текст не нарушая структуру документа.
    Ответ написан
    Комментировать
  • Почему не подключаются нужные изображения?

    rockon404
    @rockon404
    Frontend Developer
    {
      test: /\.(jpg|png|gif|ico|svg)$/,
      use: [{
        loader: 'file-loader',
        options: {
          name: 'images/[name]-[hash:base64:5].[ext]'
        }
      }]
    },
    Ответ написан
    Комментировать
  • Как с js сделать отсчет от 1 до 0?

    rockon404
    @rockon404
    Frontend Developer
    Ответ написан
    Комментировать
  • Как совместить React JS + D3?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Возможно, вам подойдет готовое решение вроде recharts и подобных библиотек.
    Ответ написан
    Комментировать