Задать вопрос
  • Можете оценить уровень кода?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Навскидку:
    1. В проектах по-хорошему использовать типизацию TypeScript, Flow. PropTypes в таком случае использовать не надо.

    2. Тут в коде бессмысленное условие:
    render() {
        const { report = {} } = this.props;
        return (
          <Fragment>
            <Head>
              <title>Doctor problem with {report.doctor.name}</title>
            </Head>
            {report && <ReportDetail showDetailButton={false} data={report} />}
          </Fragment>
        );
      }

    report у вас существует всегда. Надеюсь понимаете, что пустой объект кастуется в true.

    3. Про ESLint/TSLint уже писали.

    4. Ваши редьюсеры не имеют ключей состояния. Какой-то запрос может быть в процессе, а ваши компоненты об этом не знают.

    5. Логику работы с куками лучше вынести в actions.

    6. Нет смысла разделять импорты отступами, просто соблюдайте очередность и смотрите пункт 3.

    7. Компонент __app можно декомпозировать.

    8. Неясно зачем тут геттер
    get renderReports() { /* ... */ }

    9. Для сортировки можно использовать меморизацию.

    10.
    handleChange = (e, key) => {
        const value = e.target.value;
        this.setState({
          [key]: value,
        });
      };

    <Input
      id="outlined-name" //  зачем?
      placeholder="Problem Summary"
      value={reportTitle}
      onChange={e => handleChange(e, "reportTitle")}
    />

    Можно заменить на:
    handleChange = e => {
        const { name, value } = e.target;
        this.setState({
          [name]: value,
        });
      };

    <Input
      id="outlined-name" //  зачем?
      placeholder="Problem Summary"
      name="reportTitle"
      value={reportTitle}
      onChange={handleChange}
    />


    11. /components/ReportDetail/constants.js зачем?

    12. Где-то запросы в экшенах, где-то в компонентах.

    Не знаком с next.js поэтому ничего объективного по организации кода сказать не могу, так как не до конца понимаю как этот фреймворк работает. Вижу, что авторизованных запросов пока нет. Запросы к API у вас будут происходить только на стороне клиента?
    Ответ написан
    Комментировать
  • Можете оценить уровень кода?

    @curious-101
    Frontend developer
    Пробежался очень быстро аки гепард, так что вот, что бросилось в глаза:
    1. Раз уж используете prop-types, то используйте их для всех компонентов, а ещё лучше в линтере это правило
      пропишите

    2. Инлайновые стили надо переписать с помощью styled-components. Таких мест много кстати.

    3. Зачем этот файл тут? классы отлично себя чувствуют в styled-components.

    4. Неиспользуемый код. Тож линтер должен ругаться. Кстати плагин Eslint в IDE подключен?

    5. В одних местах Fragment, в других <>, имхо лучше выработать единую стилистику.

    6. вот тут и тут, возможно ещё где-нибудь, при рендере сработает экшен, оно надо?


    Зачем вам фриланс? Вам бы поднаточить навыки на хороших проектах, посмотреть архитектурные решения и если очень повезёт чистый код "старших" товарищей.
    Ответ написан
    Комментировать
  • Как создать новый массив на основе вложенного массива объектов?

    rockon404
    @rockon404
    Frontend Developer
    function mapData(data) {
      return data.map((el) => {
        const override = {
          newProp: 'value',
        };
      
        if (el.children) {
          override.children = mapData(el.children);
        }
      
        return { ...el, ...override };
      });
    }
    Ответ написан
    Комментировать
  • Почему после запуска js кода не срабатывает медиа-запроc?

    vadimkot
    @vadimkot Куратор тега CSS
    Чтобы избежать проблем со специфичностью (а у инлайновых стилей специфичность больше), лучше добавляйте и убирайте элементам классы с помощью classList https://developer.mozilla.org/ru/docs/Web/API/Elem...
    А для классов в стилях прописывайте нужные css правила. Возьмите это за правило и избавитесь от таких проблем в будущем.
    Ответ написан
    Комментировать
  • Как подружить forEach с массивом?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    forEach не возвращает массив, это делает map. Но также, в вашем callback'е вы должны вернуть обработанное значение элемента массива.
    function toCapitalize(str) {
      return str.split(‘ ‘).map(function(elem) {
        return elem.charAt(0).toUpperCase();
      }).join(‘’);
    }
    console.log(toCapitalize(‘some text’));
    Ответ написан
    Комментировать
  • Как исправить ошибку ( JavaScript )?

    Stalker_RED
    @Stalker_RED
    Просто удалите весь блок else, он ведь не делает ничего полезного.
    Ответ написан
    Комментировать
  • Есть ли смысл использовать link[rel="preload"]?

    @BorisKorobkov
    Web developer
    rel="preload" имеет смысл использовать только для файлов (css, js, fonts, video, img), которые загружаются не из html-кода, а позже из других css/js-файлов или по ajax/socket. Чтобы браузер не ждал, когда обнаружится потребность в этом файле, а заранее загрузил его.
    Для обычных style.css/main.js используйте обычную загрузку.

    ведь скрипты потому и в подвале сайта, чтобы отложить их загрузку?

    Они в подвале, чтобы не блокировали построение DOM (так юзер быстрее увидит страницу в браузере).
    Ответ написан
    Комментировать
  • Где найти готовую разметку страницы?

    JRK_DV
    @JRK_DV
    Рецепты https://codepen.io/jrkdv/full/LKLXdq
    Если у кого есть ссылочка, буду признателен!

    есть, держите
    https://codepen.io/anon/pen/JzgNJX
    Ответ написан
    Комментировать
  • Как прокинуть пропсы в emotion (аналог стайлед компонентс)?

    0xD34F
    @0xD34F Куратор тега React
    Так же, как и в любой другой компонент. А примеры использования пропсов можете посмотреть в документации.

    UPD. Глянул код - так у вас же часть работы уже сделана. Некоторые из компонентов уже принимает пропсы - Container, например, или Wrapper. Возьмём Wrapper - у него есть itemWidth и itemHeight. Ну и отлично:

    <Wrapper itemHeight="300px">

    Говорите, дефолтное значение надо? Ну так пусть вместо height: ${p => p.itemHeight}; будет height: ${p => p.itemHeight || '200px'};, например. Или можно переписать компонент так:

    export const Wrapper = styled.article(({
      itemWidth,
      itemHeight = '200px',
    }) => ({
      backgroundColor: '#efefef',
      margin: '5px',
      height: itemHeight,
      width: itemWidth,
    }));
    Ответ написан
    2 комментария
  • Почему при вызове двух функций через onClick не передается event?

    @scanerrr
    I am a doctor
    Сделай через хендлер

    onClick={(e) => handleClick(e, idx)}

    handleClick(e, idx) {
       onClickFunc(idx, e);
       handlerChangeTab(idx);
    }
    Ответ написан
    Комментировать
  • Как зарабатывать 1000$ на фрилансе верстальщику?

    HamSter007
    @HamSter007
    HTML/CSS верстальщик
    3 года верстаете на фрилансе и до сих пор не поняли, что верстка бесперспективное направление?! 3 года уже точно как!

    Для развития и большего заработка нужно учить js --> js фреймворки (angular, react, vue, ... ).
    + Чтобы что-то заработать нужно знать английский и выходить на иностранные биржи (на upwork посадка на wp весьма актуальный заказ).
    + Научиться работать по часам, сейчас и отечественные уже переходят на такой формат работы.
    + Если 30 отзывов уже есть, то и сами понимаете что умение предложить свои услуги на приличный проект тоже немаловажный аспект.

    Посмотрите на требования в вакансиях, посмотрите какие заказы более оплачиваемы на фрилансе и поймете что еще нужно подтянуть.
    Ответ написан
    2 комментария
  • Как зарабатывать 1000$ на фрилансе верстальщику?

    Sanes
    @Sanes
    Найти покупателей на $1000. Фриланс это предпринимательская деятельность.
    Ответ написан
    Комментировать
  • Как правильно добавлять классы при выборе меню?

    hzzzzl
    @hzzzzl
    так чуть короче

    className={ `type-display-list__item type-display-item ${ typeDisplay === "map" ? 'type-display-list__item_active' : '' }`}
    Ответ написан
    Комментировать
  • Как правильно добавлять классы при выборе меню?

    tsepen
    @tsepen
    Frontend developer
    Для работы с классами рекомендую использовать classnames
    Ответ написан
    Комментировать
  • Как пофиксить баг с раскладкой в Ubuntu 18.04?

    lioncub
    @lioncub
    По этому багу есть обновление с февраля, но в proposed. Временное решение (думаю со следующим обновлением уже будет в stable):
    echo deb http://archive.ubuntu.com/ubuntu/ bionic-proposed restricted main multiverse universe | sudo tee /etc/apt/sources.list.d/proposed.list
    sudo apt update
    sudo apt install gnome-shell
    sudo rm /etc/apt/sources.list.d/proposed.list
    nohup gnome-shell --replace &


    Если потребуется откатиться, то:
    sudo apt install gnome-shell/bionic
    nohup gnome-shell --replace &
    Ответ написан
    1 комментарий
  • Как пофиксить баг с раскладкой в Ubuntu 18.04?

    @Melonom
    Системный администратор
    Баг пофиксили в gnome-shell 3.30.2-0ubuntu. Для версии 18.04 еще в работе. Как временное решение перезапускать оболочку.
    -Alt+F2, в открывшимся окне вести R и нажать Enter
    Ответ написан
    Комментировать
  • Почему .filter() возвращает true а элемент в результат не попадает?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    В чем моя ошибка?

    Вы изобретаете Array.slice:
    function getPaginatedProducts(products, page) {
        const productsPerPage = 3;
        const begin = page * productsPerPage;
        const end = begin + productsPerPage;
        
        return products.slice(begin, end);
    }
    
    console.log(getPaginatedProducts(products, 0)); // 1,2,3
    console.log(getPaginatedProducts(products, 1)); // 4,5,6
    console.log(getPaginatedProducts(products, 2)); // 7,8,9
    Ответ написан
    1 комментарий
  • If в конце с else не работают?

    @StockholmSyndrome
    значит, не выполняются
    !users.includes(message.senderId) возвращает true, когда у пользователя нет прав
    то есть правильно будет так:
    if (users.includes(message.senderId)) {
      await rcon.connect();
      const response = await rcon.send(`${message.$match[1]}`);
      return Promise.all([
        message.send(` Ответ от сервера:`),
        message.send(response),
        rcon.disconnect()
      ]);
    } else {
      message.send('⚠ У вас нет прав!');
    }
    Ответ написан
    Комментировать
  • Как устранить ошибку Uncaught TypeError: _this.props.change is not a function в проекте React-Redux?

    @NepeinAndrey
    Проблема в том, что на вход в функцию ReactDOM.render вы даёте сам компонент Container, в который не передаются никакие параметры, в частности change. Параметр change появляется только после выполнения connect для этого компонента, следовательно и в ReactDOM.render нужно передавать то, что возвращает вышеупомянутый connect.
    Ответ написан
    1 комментарий
  • Как устранить ошибку Uncaught TypeError: _this.props.change is not a function в проекте React-Redux?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Как вариант решения, перенести Provider выше по древу:
    const ConnectedContainer =  connect(mapStateToProps, mapDispatchToProps)(Container);
    
    ReactDOM.render(
      <Provider store={store}>
        <ConnectedContainer />
      </Provider>,
      document.getElementById("params"),
    );
    Ответ написан
    3 комментария