• Как правильно получить данные из Redux store?

    @arishaYako_14 Автор вопроса
    Все сработало после того, как вместо объекта, я сделала entries массивом, то есть так:
    const initialState:InitialStateType = {
        entries: [],
        loading: false,
    };
    Ответ написан
    Комментировать
  • Как заменить цикл for на forEach?

    NeiroNx
    @NeiroNx
    Программист
    idz = idz.map(i=>str[i]||i)
    Ответ написан
    Комментировать
  • Почему не получается подключить шрифты в create-react-app?

    @AlexSND
    Я делаю так: в папке fonts лежит файл fonts.css, и этот файл импортируется в App

    import “./fonts/fonts.css”
    Ответ написан
    1 комментарий
  • Как сделать(с генерировать) sitemap.xml для opencart 2.0?

    @SergeTkach
    OpenCart Forever
    Ни в коем случае не используйте встроенный Google Sitemap на магазинах с кол-вом товара более 10 000. Получите ошибку Fatal error: Maximum execution time of 30 seconds exceeded in.... Лучше использовать платный модуль, к примеру, мой Branched Sitemap.

    Для мелких магазинов, которым подойдет встроенный Google Sitemap, также необходимо использовать еще одно бесплатное расширение Yandex Sitemap opencart для генерации карты сайта под Яндекс (которые не принимает теги картинок).

    Соответственно, лучше не прописывать адрес карты сайта в robots.txt, а отправить в инструменты для вебмастеров Google и Яндекса по отдельности.
    Ответ написан
    4 комментария
  • Как сделать(с генерировать) sitemap.xml для opencart 2.0?

    @Vetrinaelx
    Вот самый простой способ https://k-gayduk.ru/seo-wiki/sitemap.html , подходит для любых сайтов.
    Ответ написан
    Комментировать
  • Что нужно иметь и знать в фреймворке React джуну?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Хороший кандидат на должность Junior React Developer, по моему мнению, должен соответствовать следующему перечню требований:
    1. Хорошее знание JavaScript. В React разработке используется ES6 и большинство экспериментальных фич еще не вошедших в стандарт.
    2. Хорошее знание HTML и CSS. Кроссбраузерная верстка. Так же, хорошо иметь представление о том, что такое css-in-js.
    3. Web APIs. Умение работать с объектной моделью документа(DOM) и все эти XMLHttpRequest, localstorage, cookie, history и прочее.
    4. Хорошее знание API React. Вы должны хорошо знать React, знать его возможности, понимать основные концепции и уметь ответить на большинство типовых вопросов. Для этого достаточно хорошо изучить документацию, разобрать пару типовых проектов на github и попрактиковаться. Много полезной информации, приёмов и идей можно подчерпнуть из тематических статей и докладов. Так же, на просторах интернета можно найти подборки типовых вопросов, часто задаваемых на собеседованиях. В англоязычном сегменте их больше.
    5. Redux. Уверенное знание API. API библиотеки до боли пост. Знать, что такое промежуточное ПО и зачем оно. Понимать базовые концепции архитектуры Flux. Все это есть в документации и многочисленных курсах.
    6. Умение работать с менеджером пакетов npm на базовом уровне.
    7. Node.js. Хотя бы уметь написать простейший express/koa сервер, который будет отдавать ваше приложение и статику.
    8. Webpack. Базовые знания.
    9. Умение работать с git. Хотя бы знать и уметь примерять команды: init, clone, add, commit, push, pull, merge, checkout.
    10. Иммутабельность. Четкое понимание зачем это надо. Знание приемов иммутабельного изменения структур данных. Это есть в официальном туториале React.
    11. Статическая типизация TypeScrpt/Flow. Для начала хватит самых основ и способности понимать чужой код.
    12. Функциональное программирование. Хватит знаний полученных в процессе изучения JavaScript, а так же не помешает знать, что такое каррирование, чистые функции и рекурсия.
    13. Базовые концепции ООП. Хватит знаний полученных в рамках изучения JavaScript.
    14. Асинхронный код. Понимать как его правильно организовывать. Promise, async/await.
    15. Сетевые протоколы передачи данных. Вполне хватит базовых знаний о http/https, о том, что такое заголовки и какие они бывают. Хорошо знать о том, что такое websocket.
    16. За плечами должен быть хотя бы один учебный проект на React. Хватит типового тестового задания.
    Примеры таких заданий: 1, 2, 3(сайт может быть не доступен на территории РФ, советую отрыть через VPN и посмотреть), 4, 5. Если подобного проекта у вас нет, то будьте готовы, что потенциальный работодатель предложит вам выполнить тестовое задание и только по его результату вас, может быть, пригласят на техническое интервью. Если напишите хорошо, вас скорей всего пригласят.
    17. Желателен опыт создания типовых UI элементов. Например, чтобы не вызывало трудностей написать простой кастомный чекбокс. Куча примеров реализаций типовых элементов есть на codepen.

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

    Похожий вопрос.
    Ответ написан
    18 комментариев
  • Как сделать динамический вывод данных при вводе данных в input?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Можно написать простой хелпер withLatest вроде этого:

    export const withLatest = request => {
      let last = 0;
    
      return (...args) =>
        new Promise((resolve, reject) => {
          const current = ++last;
          request(...args)
            .then(res => resolve({ isLatest: current === last, res }))
            .catch(err => reject({ isLatest: current === last, err }));
        });
    };

    async/await вариант
    export const withLatest = request => {
      let last = 0;
    
      return async (...params) => {
        const current = ++last;
        try {
          const res = await request(...params);
          return { isLatest: current === last, res };
        } catch (err) {
          throw { isLatest: current === last, err };
        }
      };
    };



    Использование:
    import Api from '../api';
    import { withLatest } from '../utils';
    
    const withLatestFetchData = withLatest(Api.fetchData);
    
    export const fetchData = query => async (dispatch, state) => {
      dispatch({ type: "LOADING_DATA" });
      try {
        const { isLatest, res } = await withLatestFetchData(query);
        if (isLatest) {
          dispatch({ type: "DATA_SUCCESS", payload: res });
        }
      } catch ({ isLatest, err }) {
        if (isLatest) {
          console.log(err);
        }
      }
    };


    Демо.
    В демо так же добавил debounce и небольшую вероятность завершения фейкового запроса ошибкой.
    Ответ написан
    Комментировать
  • Оценка своего уровня. Как улучшить код?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    1. Используйте const вместо let для определения переменных которые не переопределяются в коде. Это помогает снизить когнитивную нагрузку с человека читающего код и негласный стандарт в React разработке.

    2. Такие вещи как globalStyles и конфигурацию store лучше вынести в отдельные файлы. Они могут со временем хорошо разрастись.
    По поводу globalStyles, вы вообще можете вынести их в отдельный css файл.

    3. Вместо:
    {
      isModal
      ? <Route path="/auth" component={AuthPopup} />
      : null
    }

    лучше:
    {isModal && <Route path="/auth" component={AuthPopup} />}


    4. Вместо:
    function mapDispatchToProps(dispatch) {
        return {
            autoLogin: () => dispatch(autoLogin()),
            getBrowser: () => dispatch(getBrowser()),
            getMedia: () => dispatch(getMedia())
        }
    }


    лучше:
    const mapDispatchToProps = {
      autoLogin,
      getBrowser,
      getMedia,
    };


    5. Точки с запятыми в конце то есть, то нет. Определитесь и приведите код к одному виду.

    6.
    & label {}
    & input {}
    & span {}

    Это не очень хороший подход. Во-первых ваши стили не изолированные, что может приводить к неожиданным результатам. Во-вторых у вас очень много дублирования стилей. Определите Input и Label как базовые компоненты и используйте в разных местах, то же с остальным если есть.

    7. Почему папка со страницами называется Containers? Дань бойлерплейтам?

    8. Использование trailing comma является хорошей практикой.

    9.
    import {combineReducers} from 'redux';
    import photoReducer from './photoReducer';
    import authReducer from './authReducer';
    import globalReducer from './globalReducer';
    
    export default combineReducers({
        photoReducer, authReducer, globalReducer
    })


    Все таки приятней работать с хранилищем в котором ключи не имеют в названии слова reducer:
    import {combineReducers} from 'redux';
    import photo from './photoReducer';
    import auth from './authReducer';
    import global from './globalReducer';
    
    export default combineReducers({
      photo, 
      auth,
      global,
    });


    10. Забудьте вообще, что в языке есть возможность использовать вложенный тернарный оператор:
    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

    Это одна из самых худших практик в JavaScript разработке. Тут лучше подойдет конструкция switch case

    11. Константы actionTypes лучше вынести в папку constants и разложить по разным файлам, иначе со временем у вас там будет свалка.

    12. Вместо:
    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';


    13. Попробуйте внедрить библиотеку reselect. И для получения значения из store вместо записи вида:
    function mapStateToProps(state) {
        return {
            browser: state.globalReducer.browser
        }
    }


    использовать селектор:
    const mapStateToProps = state => ({
      browser: browserSelector(state),
    });
    Ответ написан
    12 комментариев
  • Как на одной из страниц убрать footer?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Условный рендеринг.

    Оберните App в withRouter:
    export default withRouter(App);

    Добавьте условие:
    const shouldShowFooter = this.props.location.pathname !== '/basket';

    Отображайте футер по условию:
    {shouldShowFooter && <Footer />}
    Ответ написан
    Комментировать
  • Как сделать так, чтобы этот код повторился?

    teknik2008
    @teknik2008
    Расскажите про GOLANG. Мне интересно
    $('body').on('click', '#getContent', function(){/*ajax funct  */ })
    Ответ написан
    7 комментариев
  • Какова суть генерации своих событий в JavaScript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Попробую на пальцах объяснить.

    Событие – это конверт, на котором написано его название. Внутрь конверта можете вложить что-нибудь, а можете оставить конверт пустым.

    Элемент – это столик. Кто угодно может подойти и положить на столик свой конверт.

    Слушатель – это мужик, который топчется около столика и смотрит, нет ли чего с интересующим его названием. Может несколько человек поджидать конвертики с определённым названием – прочтут все, если только в конверте не написано «по прочтении съесть» – тогда кто-то съест и дальше не передаст.

    Как создать/отправить конверт. В любом месте кода создайте конверт и дайте ему название: var myEvent = new Event('teaTime'); Остается положить конверт на нужный столик:
    document.getElementById('stolik').dispatchEvent(myEvent);


    Чтобы в событие вложить какие-то данные, нужно использовать другой конструктор и передать нагрузку в поле detail:
    var event = new CustomEvent('saySomething', { detail: "Hello there!" });


    Для чего нужно создавать свои события? Чтобы развязать куски кода. Например, в разных местах документа можно нажать на кнопку повторяющегося виджета. Виджет создаст на document событие "widgetClicked". А ещё несколько одинаковых компонентов в странице, слушающих document на предмет события "widgetClicked", получат пинок и что-нибудь вытворят.
    Ответ написан
    2 комментария
  • Взял первый заказ на UpWORK от индуса. Как разрулить проблемы?

    yetanothercoder
    @yetanothercoder
    java(script) coder
    Печальная ситуация, вызванная видимо прежде всего недостатком опыта в подобных доработках да и в целом, поэтому на будущее несколько правил:
    1) не связываться с индусами (ну только если на хлеб не хватает и кроме индусов работы/заказов нет).
    2) выяснять заранее максимальные подробности заказа перед его принятием (тут очевидно этот ад можно было заранее предвидеть)
    3) не лезть сразу на боевые сервера (production), если у клиента только боевой сервер или он предлагает делать сразу на нем - то учитывая п. 2) посылать лесом.

    По вариантам выхода из ситуации - если первоначальный дамп остался то пытаться все вернуть назад, в том числе и эти 10$, т.е. отменить заказ вообще чтобы у индуса не было возможности оставить еще плохой отзыв (они это любят делать).
    Если дампа нет и вернуть нельзя - ну как бы придется пытаться восстанавливать обратно как он хочет насколько это возможно, но потом все равно отменить нафиг этот копеечный заказ, т.к. в приватном отзыве вряд ли индус поставит все хорошо, даже если это все удасться починить.
    Ответ написан
    5 комментариев
  • Заказчик сует доработки очень маленькими порциями, как брать оплату?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988
    поставить минимальную стоимость как за полчаса работы.
    объяснять, что вы сейчас заняты и поправите через 1-23 часа.
    Брать деньги за все время от прихода первого сообщения до сдачи последней правки.
    так как вы в режиме оперативного сопровождения.
    Ответ написан
    20 комментариев
  • Высота блока на весь экран?

    Morpheus_God
    @Morpheus_God
    Смею предположить, что стоит попробовать в процентах задавать такое.
    Скажем header и footer по 20 процентов а 60 процентов нужный вам контейнер.
    Такое?
    Ответ написан
    2 комментария
  • Для чего дизайнеры шаблонов WP делают такие огромные шапки (слайдеры)?

    ivan99
    @ivan99
    Изучаю web-стек, бомблю вопросами ;)
    Это мода такая, мол сразу в лоб картинку главную, а вообще не юзабельно как то, согласен.
    Картинки возможно не сжаты.
    Ответ написан
    7 комментариев
  • Для чего дизайнеры шаблонов WP делают такие огромные шапки (слайдеры)?

    Sanes
    @Sanes
    Заняться нечем.
    Ответ написан
    Комментировать
  • Какая программа лучше для подготовки макета сайта?

    alex-1917
    @alex-1917
    Если ответ помог, отметь решением
    Судя по вопросу, вы студия.
    Обычному человеку не нужно максимально просто и быстро делать макеты, он спокойно за недельку-вторую нарисует на салфеточке карандашом то, что ему нужно, отдаст салфеточку на биржу и найдется с десяток толковых верстальщиков и главное НИКАКОЙ БОЛИ, как в вашем вопросе...
    А студии стыдно тут выспрашивать...
    Ответ написан
    Комментировать
  • По URL запросу "/sitemap" открывается файл "/sitemap.xml" как исправить, чтобы открывался "/sitemap"?

    @xpaco Автор вопроса
    решилось путём добавления строчки
    Options -MultiViews
    в .htaccess
    Ответ написан
    Комментировать
  • Какую free CMS выбрать для маленького интернет-магазина?

    artem90
    @artem90
    TeamLead, Developer
    Я бы предложил использовать сервисы-конструкторы.
    Они позволяют быстро и дёшево прощупать отдачу магазина.

    А позже при недостатке средств конструктора переезжать уже на другие решения.

    В деньгах это ~10-15 тысяч в год, вместо разработки «своего» за 30-50-200-500 тысяч.
    Ответ написан
    Комментировать