• Для чего react server side rendering?

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

    amux
    @amux
    alp.ac
    https://cloudcannon.com/deconstructions/2014/11/15...

    Смысл в том что рисуется такая заглушка, а потом ее заменяет контент при загрузке
    Ответ написан
    Комментировать
  • Как в webpack-dev-server можно просматривать сайт и с других устройств при разработке?

    rockon404
    @rockon404
    Frontend Developer
    добавьте в скрипт запуска сервера ключи host и port:
    "scripts": {
      "dev": "webpack-dev-server --inline --content-base dev-build/ --host xxx.xxx.xxx.xxx --port xxxx --open"
    }
    Ответ написан
    Комментировать
  • Как получать данные с сервера для компонентов?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Во-первых метод componentWillMount скоро будет deprecated. Не надо его использовать.
    Лучшее место для запроса к серверу componentDidMount, пока не пришел ответ показывайте прелоадер.
    Если используете redux то добавьте ключи isLoading и isError для каждой сущности/списка.
    Ответ написан
    Комментировать
  • Почему у меня при перезагрузки страницы store пропадает?

    vicodin
    @vicodin
    Имею некоторый опыт
    Давайте поставим вопрос иначе, почему вы решили, что перезагрузка страницы не должна обнулять стор?
    Ответ написан
    2 комментария
  • Как работает этот AC с async/await?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Нет. В первом случае вы возвращаете из AC функцию c аргументом dispatch.
    Во втором случае вы не возвращаете ничего и убрали аргумент dispatch, заменив названием.
    А сама функция dispatch, которая передается в аргумент, как раз синхронная.

    Добавьте return и будет аналогично первому варианту:
    export const addComponent = data => {
      return async function(dispatch) {     //  тут добавлен return и аргумент
        let comps = await fire.database().ref("components");
        comps.push({
          name: data.component,
          comp: data.component_name
        });
    
         //так же в любое время вы можете вызвать dispatch
         dispatch({ type: 'someAction', payload: 'someValue' });
      };
    }

    Еще пример:
    const foo = x => y => x + y;
    аналогично:
    const foo = x => {
      return  y => {
        return x + y;
      }
    };

    Как это работает:
    const foo = x => y => x + y;
    
    const a = x(5);
    const b = a(6);
    
    console.log(b);
    // => 11

    Значение а можно представить так:
    y => 5 + y;

    Функция у вас асинхронная и пока не зарезолвится comps ее выполнение не продолжится, так как перед вызовом возвращающим значение comps стоит ключевое слово await.
    export const addComponent = data => async dispatch => {
      let comps = await fire.database().ref("components");
      // функция продолжит выполнение только когда вернется значение присвамваемое comps
      comps.push({
        name: data.component,
        comp: data.component_name
      });
    };


    Как я понимаю у вас возникли проблемы при работе с firebase?
    Могу порекомендовать использовать готовую библиотеку, вроде https://github.com/prescottprue/react-redux-firebase
    или разобраться с отличной библиотекой redux-saga и написать с помощью нее удобную реализацию взаимодействия с firebase.
    Ответ написан
    2 комментария
  • Как привести доказательства авторства продукта?

    @sunblossom
    Вы меняли файлы игры, которые изначально были не вашими. О каком авторском праве может быть речь? К тому же, в лицензионном соглашении игры скорее всего будет пункт про запрет использования читов.
    Ответ написан
    1 комментарий
  • Намного ли webpack сложнее чем gulp?

    bingo347
    @bingo347
    Crazy on performance...
    Во-первых, это разные вещи, webpack - это бандлер (сборщик если по-русски), gulp - таскраннер (запускалка задач)
    Во-вторых, их можно использовать как совместно так и раздельно
    В-третьих, gulp потихой теряет актуальность, ибо npm вполне умеет быть таскраннером

    Что проще? все же webpack, тут почти всегда все задается декларативным конфигом в виде js объекта, а в gulp надо писать код в функционально-императивном стиле
    Ответ написан
    1 комментарий
  • Как в React проверить, что дочерний компонент загружен и отрисован?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Так:
    class Child extends Component {
      componentDidMount() {
        this.props.callback();
      }
    
      render() {
        return (
          <div>Child</div>
        );
      }
    }
    
    class Parent extends Component {
      onChildDidMount = () => {
        console.log('Child component was mounted!');
        // do something else
      };
    
      render() {
        return(
           <Wrapper>
             <Child callback={this.onChildDidMount} />
           </Wrapper>
        );
      }
    }
    Ответ написан
    Комментировать
  • Почему выдаёт ошибку при добавлении нового элемента в Array?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    state в react нельзя менять напрямую, надо использовать асинхронный метод setState.
    createCheckboxes = () => {
      const data = this.props.pets[0] || {};
      const newAnimals = Object.values(data).map(el => el.animal);
     
      this.setState(({ animals }) => ({
        animals: [ ...animals, ...newAnimals ],
      }));
    };


    Ошибка из-за того, что вы используете к колбеке map не стрелочную функцию, а обычную и в ее контексте this в strict режиме ссылается на undefined. Со стрелочной функцией такой ошибки бы не было.

    PS. Я вам советовал писать в state состояния фильтра и фильтровать массив при рендере. А вы все делаете наоборот. Неправильно используете библиотеку и функции массива. Вам надо документацию по react хорошо изучить и основы js подтянуть. Особенно возможности ES6 и экспериментальных фич используемых в react разработке.

    Советую перед тем как будете отправлять работодателю свое тестовое задание, сбросить его сюда попинать.
    Ответ написан
    4 комментария
  • Как задать отображение spinner до ответа от сервера reactJS?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Идеальный вариант, создать для этих задач компонент:
    function Block({ 
      children,
      isLoading, 
      isError, 
      isEmpty, 
      emptyText, 
      fetch,
    }) {
      const showPreloader = isLoading && !isError;
      const allDataIsReady = !isLoading && !isError;
      const showEmptyText = allDataIsReady && isEmpty && emptyText;
    
      return (
        <Wrapper>
          {showPreloader && <Preloader />}
          {isError && <TryAgain fetch={fetch} />}
          {showEmptyText && <Empty>{emptyText}</Empty>}
          {allDataIsReady && children}
        </Wrapper>
      );
    }


    И использовать его в коде так:
    render() {
      const { isLoading, isError, orderList } = this.props;
    
      return (
        <Block
          isLoading={isLoading}
          isError={isError}
          isEmpty={!ordersList.length}
          fetch={this.fetchOrdersList}
          emptyText="You don't have any orders."
        >
          {ordersList.map(order => <Order key={order.id} order={order} />}
        </Block>
      )
    }


    Название служебных дочерних компонентов компонента Block условные, но думаю суть их задач передают.
    Ответ написан
    4 комментария
  • Где удобно хранить куски кода?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Ответ написан
    Комментировать
  • Иностранный заказчик не хочет подписывать акт выполненных работ. Есть ли альтернатива?

    begemot_sun
    @begemot_sun
    Программист в душе.
    В договоре пишите: Факт оплаты инвойса свидетельсвует, что заказчик принял работу (по этапу) в полном объеме и претензий не имеет. Данная формулировка принимается валютным контролем. Т.о. вы освобождаетесь от написания всяких актов и их заверения со стороны заказчика.

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

    @Z1odeypnd
    Здравствуйте.
    Технологий взлома уйма.
    В зависимости от того, какие привелегии получил "хакер" при вломе вашей БД - зависит очень много.
    Если он получил доступ только на чтение, то захешированные в MD5 пароли ему мало чем помогут, т.к. MD5 не имеет алгоритма обратной расшифровки и хэширование спасёт тем, что взломщик получивший доступ на чтение паролей - самих паролей не получит (есть конечно словарь MD5 хешей, то это другая история).
    Вообще для защиты любой БД есть несколько золотых правил:
    0. Переименовать дефолтного админа и защитить его сложным паролем.
    1. Для каждой БД должен создаваться свой владелец и несколько пользователей с разными наборами привелегий.
    2. Ни у одного из пользователей, созданных в п.1 не должно быть прав на изменение таблиц в соседней БД.
    Если есть необходимость обновлять соседние БД - делайте это триггером в соседней БД.
    3. Каждый внешний веб-сервис должен ходить в БД только с тем набором прав, которых ему достаточно для работы. Т.е. не нужно везде прописывать root и надеяться на лучшее.
    В этом случае, если взломщик получит привелегии этого пользователя, то сможет сделать только то, что разрешено этому пользователю. Тогда не выйдет "удалить все и сразу".
    Например, для наполнения католога товаров в интернет-магазине может быть отдельный пользователь, с правами на SELECT, INSERT, UPDATE, DELETE в таблице SHOP_PRODUCTS, например. И ничего более.
    А пользователи, приходящие в магазин за покупками могут делать SELECT, INSERT, UPDATE, DELETE только в таблицу CUSTOMER_CART. В коде веб-сервиса, естественно должна быть проверка, что покупатель редактирует СВОЮ корзину.
    Для показа каталога товаров - отдельный пользователь, имеющий право только на SELECT из таблицы SHOP_PRODUCTS.
    А продажу товара может делать отдельный пользователь, с правом только на UPDATE колонки AMOUNT в таблице SHOP_PRODUCTS. Пример:
    GRANT SELECT ON shopdb.SHOP_PRODUCTS TO 'trader_bot'@'shophost';
    GRANT UPDATE (AMOUNT) ON shopdb.SHOP_PRODUCTS TO 'trader_bot'@'shophost';

    И т.п. По принципу "Разделяй и властвуй."
    4. Писать запросы с использованием placeholder'ов (подстановку данных), что убережёт от SQL-инъекций.
    Пример:
    $DB->select('SELECT * FROM tbl WHERE a=? AND b=?', $a, $b);

    5. Если и БД и приложение, используещее БД установлены на одном сервере - отключить удалённый доступ к БД и работать через сокеты.
    6. Последний, но самый важный - БЕКАПЫ. При удалении всего и вся - нужно откуда-то восстановиться. Делайте бекапы и храните на отдельном сервере (не выставленном наружу).
    Ответ написан
    3 комментария
  • Как передать массив с данными от одного компонента к другому?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    По-хорошему redux.
    Но вы так же можете передавать список из App в Items с колбек функцией, которая запишет в state компонента App id выбранного продукта, ее надо прокинуть через Items в каждый Item и там по клику вызывать:
    class App extends Component {
      state = {
        activeItemId: -1,
      };
      
      selectItem = id => {
        this.setState({
           activeItemId: id,
        });
      };
    
      render() {
        const { items } = this.props;
        const { activeItemId } = this.state;
       
        const activeItem = items.find(item => item.id === selectedItemId);
    
        return (
          <Wrapper>
            <More item={activeItem} />
            <Items 
              items={items}
              onSelectItemCalback={this.selectItem}
            />
          </Wrapper>
        );
      }
    }
    Ответ написан
    Комментировать
  • Deploy react приложения, рекомендации?

    miraage
    @miraage
    Старый прогер
    1. Как грузить другой вебпак кофиг на продакшне? (Пока у меня просто в packege.json "build": "webpack -p"

    scripts: {
      "dev": "webpack-dev-server --env.dev",
      "build": "webpack -p --env.prod"
    }

    webpack docs

    2. Что использовать в этом кофиге(например как командой убрать все console.log() )?

    UglifyJSPlugin + drop_console

    3. Как сделать, чтобы sass компилировался в отдельный файл?

    ExtractTextWebpackPlugin + sass-loader

    А вообще, посмотрите в сторону create-react-app.
    Ответ написан
    1 комментарий
  • Насколько всё должно быть компонентом при построении приложения на React?

    @BookerDeWitt
    все приложение нужно рендерить в один тег.
    Компонент который ты будешь в него рендерить будет содержать в себе дочерние компоненты :
    id="header", id="content", id="sidebar"
    Ответ написан
    Комментировать
  • Redux-Store Best practice: как лучше в store разделять данные от состояния UI?

    alvvi
    @alvvi
    export default apathy;
    Если это глобальные состояния, которые влияют на несколько компонентов сразу, можете хранить их например так
    store: {
      ui: {
        sidebar:  true   
      }
      entitites: {
         //...
      }
    }

    если же это состояние компонента, типа

    - показать/скрыть тот или иной компонент
    - поменять вид компонента
    - показать скрыть диалог,

    лучше использовать нативный реактовский стейт.
    А так в целом, структура Store зависит от приложения, строгих правил кроме рекомендаций типа "сущности лучше хранить в нормализованном виде", я лично не встречал.
    Ответ написан
    Комментировать
  • Как работать с виджетами ВК в react spa?

    gadfi
    @gadfi
    https://gamega.org
    Вставка кода в компонент приводит к ошибке сборки(в принципе понятно почему):
    'VK' is not defined no-undef

    скорее всего eslint ругается попробуйте добавить в начало файла
    /* global VK */
    Ответ написан
    1 комментарий
  • Фактор возраста (ageism) при поиске работы в ИТ -так ли важен возраст?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Во-первых, набивать такое резюме, чтобы тебя со слезами умоляли выйти к ним, соглашаясь на любые твои условия.
    Во-вторых, выбирать адекватных работодателей, которых интересует твой профессионализм, а не возраст, пол, религия и т.п.
    Ответ написан
    2 комментария