• Какую IDE выбрать для React?

    @Coder321
    VS Code, легкий, быстрый, кросплатформенный. Мне для всего хватает.
    Ответ написан
    Комментировать
  • Какие стратегии повышения зарплаты существуют?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Центральный показатель для бизнеса, а следовательно и руководителей, как людей представляющих интересы этого самого бизнеса - это коэффициент возврата инвестиций (ROI). Соответственно, сотрудник должен приносить компании больше денег, чем потребляет. Естественно, что чем выше разрыв между затратами и прибылью, тем лучше, поэтому фонд оплаты труда руководитель должен держать на том минимальном уровне, который гарантирует бесперебойную работу сотрудников. Один из факторов этой бесперебойности - низкая текучка. Сотрудников терять нежелательно. И чем ценнее для компании сотрудник, чем более он профессионален и/или чем больше на него завязано, тем дороже обходится его потеря. Натурально в деньгах. Придётся затратить больше, чем обычно, денег на поддержание работы без него. Придётся затратить деньги и время (те же деньги) на поиск, найм, введение в работу, возможно, обучение нового сотрудника. При этом он может оказаться совсем неподходящих и цикл придётся повторить. Или может оказаться просто хуже прошлого и эффективность отдела снизится. Поэтому, когда сотрудник приходит просить прибавку, руководитель оценивает может ли этот сотрудник уйти или только блефует, насколько легко его будет заменить, какой урон компании будет нанесён его уходом. Потом руководитель оценивает стоимость расширения ФОТ - есть ли резервы, какой сейчас ROI, будет ли больший ROI от реинвестиции этих средств во что-то другое? Если уход сотрудника будет стоить меньше, чем увеличение ФОТа, сотруднику откажут.

    Естественно, всё описанное справедливо для случая, когда руководитель - профессиональный менеджер. А то часто на месте руководителя сидит человек руководствующийся эмоциями и мутными соображениями вычитанными в сомнительной бизнес-литературе.

    Из этого вывод, стратегия проста - увеличивайте собственный профессиональный уровень на столько, чтобы свободно менять компанию, как только вас что-то перестало устраивать.
    Ответ написан
    4 комментария
  • Почему не получается запросить пользователя из состояния?

    0xD34F
    @0xD34F Куратор тега React
    return state["users"].entities.forEach(user => {
      if (user.email === state["auth"].user.email) {
        return user;
      }
    });

    Серьёзно? А вы в курсе, что forEach возвращает undefined? Наверное, стоит использовать find:

    return state.users.entities.find(user => user.email === state.auth.user.email);
    Ответ написан
    1 комментарий
  • Как сделать запрос на сервер в React?

    RomReed
    @RomReed
    JavaScript, Flutter, ReactNative, Redux, Firebase
    можно в функцию handleSubmit используя fetch или axios засунуть post с вашими данными на сервер
    Ответ написан
    2 комментария
  • Какие инструменты для разработки мобильного приложения на базе веб-технологий сейчас есть?

    k12th
    @k12th
    console.log(`You're pulling my leg, right?`);
    Есть несколько вариантов.

    js-to-native, нативное приложение с бизнес-логикой на js и нативными виджетами:
    • react-native
    • NativeScript — на выбор angular, с недавних пор vue, чистый js
    • weex — аналог react-native для vue.js, из коробки так же работает под веб. С документацией пока грустновато, но народ работает.

    Вроде как из этого react-native самый проработанный и стабильный. Имел дело только с ним, если это стабильно и проработанно, то в остальное даже страшно заглядывать (хотя NativeScript+ionic мне хвалили). Выглядит нативно на каждой платформе. Знания html и css по большей части не пригодятся: тэги/компоненты свои, css-свойства работают не все и не во всех сочетаниях.

    webview, гибридное приложение, браузер на весь экран:
    • cordova, старейшее живое решение

    Вроде как взял html, завернул и готово. Иногда полученное приложение несколько притормаживает, хотя я думаю что если это каталог товаров или меню ресторана, то проблем быть не должно. Выглядит одинаково на каждой платформе.

    прочее:
    • *.webmanifest и PWA, нечто среднее между установкой приложения и добавлением сайта в закладки.

    По идее идеал, часто юзаешь сайт — типа ставишь приложение, редко — открываешь из браузера. У разработчика голова не болит как подружить веб, iOS и Android: везде выглядит и работает одинаково. На практике поддержка пока что пятнистая.
    Ответ написан
    5 комментариев
  • Почему ошибка при установке prettier?

    rockon404
    @rockon404
    Frontend Developer
    ставьте плагин eslint-plugin-react. Дополнительно если не установлены:
    eslint
    babel-eslint
    eslint-plugin-jsx-a11y
    eslint-plugin-import
    eslint-config-prettier
    eslint-config-airbnb
    eslint-plugin-prettier
    Добавляйте так:
    {
      "extends": [
        "airbnb",
        "prettier",
        "prettier/react"
      ],
      "plugins": [
        "prettier"
      ],
      "parser": "babel-eslint",
      "parserOptions": {
        "ecmaFeatures": {
          "jsx": true
        }
      },
      "env": {
        "browser": true,
        "node": true
      },
      "rules": {
        "no-plusplus": 0,
        "no-confusing-arrow": 0,
        "no-restricted-syntax": 0,
        "guard-for-in": 0,
        "class-methods-use-this": 0,
        "jsx-a11y/no-static-element-interactions": 0,
        "jsx-a11y/anchor-is-valid": 0,
        "react/no-danger": 0,
        "react/prop-types": 0,
        "react/jsx-filename-extension": 0,
        "react/jsx-curly-brace-presence": ["error", { "props": "never", "children": "never" }],
        "import/no-unresolved": ["error", { "commonjs": true }],
        "import/extensions": 0,
        "import/no-extraneous-dependencies": ["error", {"devDependencies": true}],
        "import/prefer-default-export": 0,
        "prettier/prettier": ["error", {
          "singleQuote": true,
          "trailingComma": "all"
        }]
      }
    }


    Правила настройте под себя.

    Если хотите precommit проверку, то поставьте lint-stаged и husky, и добавьте следующие строки в package.json:
    "scripts": {
        // ваши скрипты
        "precommit": "./node_modules/.bin/lint-staged",
      },
      "lint-staged": {
        "**/*.js": [
          "./node_modules/.bin/prettier --write",
          "./node_modules/.bin/eslint --fix",
          "./node_modules/.bin/stylelint './app/**/*.js'", // если используете  css in js
          "git add"
        ]
      },

    Теперь перед каждым вашим коммитом код будет приводиться в порядок на автомате если это возможно. И прерывать коммит ошибкой если нарушены правила.
    Ответ написан
  • Почему вылетает ошибка при использовании if?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Потому что это JSX. Можно исправить так:
    render() {
      const { _sharedData: { auth_user } } =  this.props;
    
      const shouldShowIconMenu = +auth_user === 1;
    
      return (
        <AppBar>
          {shouldShowIconMenu && (
            <IconMenu>
              ...
            </IconMenu>
          )}
        </AppBar>
      );
    }


    JSX это все-таки синтаксический сахар над React.createElement. Вызов if-else, как и for внутри JSX транслировался бы в нерабочий код. Пример:
    JSX:
    <div id={if (condition) { 'msg' }}>Hello World!</div>

    В результате трансляции получаем невалидный код:
    React.createElement("div", { id: if (condition) { 'msg' } }, "Hello World!");
    Ответ написан
    2 комментария
  • Как изменить данные из одной "утки" в другой?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Зачем вообще в товаре свойство addedToCart?
    Представьте, что у вас в приложении есть или будет пагинация. Вы перешли вперед-назад и загрузили товары заново. Ключи при этом будут потеряны.

    Сделайте селекторы checkIsProductAddedToCartSelector и isProductAddedToCartSelector. Первый пусть возвращает функцию принимающую id товара и возвращающую true если товар найден в store корзины. Второй пусть принимает id товара и возвращает булево значение, если товар найден или не найден в store корзины. Используйте для этого reselect.
    И добавляйте их в mapStateToProps в connect.
    В списке можно вызывать так:
    const ProductsList = ({
      productsList,
      checkIsProductAddedToCart,
    }) => (
      <ul>
        {productsList.map(product => (
          <Product
            addedToCart={checkIsProductAddedToCart(product.id)}
            product={product}
          />
        ))}
      </ul>
    );
    
    const mapStateToProps(state => ({
      productsList: productListSelector(state),
      checkIsProductAddedToCart: checkIsProductAddedToCartSelector(state),
    }));
    
    export default connect(mapStateToProps)(ProductsList);

    В детализации так:
    const mapStateToProps((state, ownProps) => ({
      isAddedToCart: isProductAddedToCartSelector(state, ownProps),
    }));
    
    export default connect(mapStateToProps)(ProductDetails);


    Примерные реализации селекторов:
    import { createSelector } from 'reselect';
    
    const cartSelector = state => state.cart;
    
    const cartProductsSelector = createSelector(
      cartSelector,
      cart => cart.products,
    );
    
    // возвращает функцию, принимающую id, которую можно использовать при построении списков
    const checkIsProductAddedToCartSelector = createSelector(
      cartProductsSelector,
      products => id => products.some(product => product.id === id),
    );
    
    const productIdSelector = (_, props) => props.product.id;
    
    // возвращает булево значение, важно чтобы в компоненте было свойство product
    const isProductAddedToCartSelector = createSelector(
      cartProductsSelector,
      productIdSelector,
      (products, id) => products.some(product => product.id === id),
    );
    Ответ написан
    7 комментариев
  • Можно ли понести ответственность за распространение исходных кодов проприетарной программы?

    BBmike
    @BBmike
    Слушай, вы вот такие незамутненные приходите сюда и вываливаете какие-то хитрые комбинации своих выдуманных условий, которые по-вашему мнению должны как-то изменить обычный и общепринятый порядок вещей.
    Нет, ваши хитросплетения не изменят этого порядка и он таков:

    - любое ПО имеет своего обладателя исключительного права;
    - этот обладатель исключительного права устанавливает режим и порядок использования соответствующего объекта интеллектуальной собственности;
    - если этот режим нарушен путем неправомерного использования, то наступает ответственность;
    - всем наплевать, при каких обстоятельствах Вы нарушили чужое право;
    Ответ написан
    2 комментария
  • Как в IE11 background-image поставить?

    rework
    @rework
    Помог ответ? В благодарность отметь его решением
    В IE11 background-image ставится точно так же как и во всех нормальных браузерах. Более того background-image нормально работал и в IE6. По всей видимости у вас проблема из-за чего-то другого.
    Ответ написан
    1 комментарий
  • Как связать компоненты?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Такие задачи легко решаются через родителя:
    class Parent extends Component {
      state = {
        text: 'some text',
      };
    
      handleClick = () => {
        this.setState({ text: 'some other text'});
      };
    
      render() {
        const { text } = this.state;
    
        return (
          <Wrapper>
            <Button onClick={this.handleClick} />
            <Text>{text}</Text>
          </Wrapper>
        );
      }
    }

    В компонентной структуре , как и в любой другой древовидной, физически невозможно расположить два компонента, чтобы они не находились в одном общем родителе. Это факт.
    Если вы не используете redux и задача носит частный характер, то передача колбека через родителя и даже через несколько компонентов, может быть простым и эффективным решением.
    Другое дело, что в более менее сложном react приложении хорошо использовать redux или аналоги.
    Ответ написан
    Комментировать
  • React + Redux, почему не передаются данные?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Исправьте:
    const mapStateToProps = (state) => {
      projects: state.projects
    }

    на:
    const mapStateToProps = (state) => ({
      projects: state.projects
    });

    JavaScript парсер, в вашем случае, распознает фигурные скобки ни как возвращаемый функцией объект, а как тело блока функции, которая ничего не возвращает. Чтобы возвращать объект в короткой записи его необходимо заключать в скобки.
    Ответ написан
    6 комментариев
  • Что выбрать для server side rendering react?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Лучше сразу писать изоморфный проект, так как есть множество ньюансов которые стоит учитывать при разработке таких приложений. На github можно найти готовые боилерплейты. На написание своего может уйти от пары часов до пары дней, в зависимости от требуемого набора инструментов. Так же вы можете посмотреть в сторону таких инструментов как next.js, razzle, after . Но точно не знаю, насколько легко, при необходимости, мигрировать с таких решений.
    Ответ написан
    6 комментариев
  • Можно ли при обработке события submit формы, узнать введённые данные?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    class Example extends Component {
      state = {
        inputValue: '',
      };
    
      handleChange = e => { 
        const { name, value } = e.target;
        
        this.setState({
          [name]: value,
        });
      };
    
      handleSubmit = e => {
        e.preventDefault();
        //  получить состояние формы можно обратившись к this.state
      };
    
      render() {
        const { inputValue } = this.state;
    
        return (
          <form onSubmit={this.handleSubmit}>
            <input
              name="inputValue"
              value={inputValue}
              onChange={this.handleChange}
            />
            ...
          </form>
        );
      }
    Ответ написан
    Комментировать
  • Почему состояние должен быть иммутабельным?

    @undefined_title
    если reducer изменит состояние и вернет его, то подписчики(компоненты) не будут уведомлены про его изменение, так как redux будет думать что состояние не изменилось, потому что сравнение предыдущего и следующего состояния не глубокое, а сравнивается только ссылка, и вообще в ФП рекомендуют использовать чистые функции и работать со всем иммутабельно, это облегчает дебаг и упрощает тестирование.
    Ответ написан
    Комментировать
  • Как передать хтмл-атрибут в reactjs-приложение?

    RomReed
    @RomReed
    JavaScript, Flutter, ReactNative, Redux, Firebase
    var x = document.getElementById("root").getAttribute("some-param");
    Ответ написан
    Комментировать
  • Как импортировать Swiper при помощи Webpack?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Всё правильно. Css нужно импортировать отдельно. В js.

    import Swiper from 'swiper';
    import '../node_modules/swiper/dist/css/swiper.css';

    Css-loader у вас вроде подключен

    Можно алиас прописать в конфиге

    'swiper.css' : 'node_modules/swiper/dist/css/swiper.css'


    и импортировать покороче

    import 'swiper.css';

    Но вряд ли стоит заморачиваться ради единственного импорта
    Ответ написан
  • В чем ошибка при переключении года?

    RomReed
    @RomReed
    JavaScript, Flutter, ReactNative, Redux, Firebase
    https://codesandbox.io/s/mopx1nzpkj
    у вас куча маленьких ошибок
    1 вы не поключили connect и следовательно компонент не знает о функции setYear
    2 вы выводите год как {year} но как только жмете на 1 из кнопок года то в редусер вы ложете не число а обьект
    return { ...state, year: action.payload } это вернет вам {year:2017} и в компоненте уже к нему обращаться нужно вот так {year.year}

    вот в этом моменте const { year, photos} = this.props вы получате ваши данные в компоненте. Выведите их в консоль и тогда вам станет немного понятнее в чем у вас ошибки
    Ответ написан
    8 комментариев
  • Yarn как альтернатива Bower?

    edli007
    @edli007
    full stack, team lead
    Скорее npm. У npm в определенных версиях были проблемы с оптимизацией процеса, решением которых был yarn. npm свои проблемы тогда весьма быстро решил и какогото такого прямо перевеса yarn набрать не успел. Я не думаю что будущее за ним. Это хороший пакетный менеджер, но поскольку это не встроенная технология, то существовать ей долго, но не так долго как нативной технологии. Мы получили еше один пакетный менеджер на энное количество лет с равнозначными возможностями и выбор в данный момент это вопрос вкуса и желания.
    Со временем, нишу yarn вытеснит что-то другое, а npm останеться.

    Что до самого npm\yarn vs bower - это все для разного, но две технологии на одном проекте в данном технологическом русле создает кучу неудобств. Например, тотже вебпак, девопс точно кого-то убъет за настройку сразу двух пакетных менеджеров, которые по сути делают вещи очень похожие и уникальностью репозиториев не блещут.

    Как говорили в другом топике
    npm - пакетный менеджер, нужен для установки пакетов вашего приложения
    bower пакетный менеджер, для установки сторонних js библиотек. Также есть технические особенности того как он устанавливает пакеты.

    с этого становиться ясно что каждый из этих пакетных менеджеров свою работу делает лучше, но если предствоит из двух оставить один, то npm с чужой работой справляеться намного лучше, чем если попробовать подключать bower в аналогичном качестве.

    Отсюда и вывод - использовать npm, что все собствено и делают.
    А учитывая что npm существовал задолго до различных баверы\компосеры, так как импорт на них существующих библиотек обычно идет на несколько репозиториев сразу, в том числе и на npm, то на репозиториях его есть все тоже самое что и на других. А вот вещи изначально с npm на репу bower могут и не попасть.
    Ответ написан
    Комментировать
  • Для чего react server side rendering?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    1. SSR нужен в проектах для которых важна индексация поисковиками.
    2. Такие приложения называют не SPA, а изоморфными.
    3. SSR в изоморфных приложениях используется с REST API, так что проблем с мобильным клиентом у вас не возникнет.
    4. Рендерится все тоже самое, что и в SPA только на стороне сервера, после передачи клиенту приложение работает как обычное SPA и взамодействует с сервером по REST API.
    Ответ написан
    Комментировать