• Как объявлять компоненты в React?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Классовые компоненты никуда не уходят. Для них осталось несколько удобных кейсов. Например:
    1. Удобное получение предыдущих значений свойств и состояний в componentDidUpdate.
    2. Доступ к экземпляру компонента в хандлерах, передаваемых в браузерные API.
    3. Сложные компоненты с большим количеством методов. Например VideoPlayer.

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

    Оптимизация это отдельный вопрос, которому стоит посвятить время. Сейчас разве стоит предупредить вас, что преждевременная оптимизация - зло.

    Попробуйте использовать в коде преимущественно функциональные компоненты и хуки. Сейчас почти все популярные библиотеки имеют в API довольно удобные в использовании хуки. Там, где покажется, что будет удобней использовать класс, не бойтесь использовать классы.
    Ответ написан
    1 комментарий
  • Как получить доступ к store из редьюсера?

    rockon404
    @rockon404 Куратор тега Redux
    Frontend Developer
    Вам надо использовать middleware. Например redux-thunk
    const action = value => (dispatch, getState) => {
      const otherValue = otherValueSelector(getState());
      
      const payload = calculate(value, otherValue);
    
      dispatch(otherAction(payload));
    };
    Ответ написан
    Комментировать
  • Kаким лучшим способом обрабатывать error ,loading и ответить из сервера?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Логику можно вынести в собственный хук. Как-то так:
    const useFetch = (url, options) => {
    
      const [data, setData] = useState(null);
      const [error, setError] = useState(null);
      const [isLoading, setIsLoading] = useState(true);
    
      const fetchData = async () => {
        try {
          setIsLoading(true);
          const res = await fetch(url, options);
          const json = await res.json();
          setData(json);
          setIsLoading(false);
        } catch (error) {
          setError(error);
          setIsLoading(false);
        }
      };  
    
      useEffect(() => {
        fetchData();
      });
    
      return [
        data,
        isLoading,
        error,
        fetchData,
      ];
    };


    const Example = ({ slug }) => {
      const [ product, isLoading, error, fetchFn ] = useFetch(`/api/product/${slug}`);
      
      if (isLoading) return <Preloader />;
    
      if (error) return <Error error={error} tryAgainFn={fetchFn} />;
    
      if (!product) return <NotFound />;
      
      return <Product product={product} />
    };
    Ответ написан
    Комментировать
  • Как правильно обрабатывать контролируемый компонент реакт?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Синтетические события нельзя использовать асинхронно, e.persist() освобождает событие из пула и оно не очищается, поэтому все значения сохраняются на момент выполнения асинхронного вызова.

    Ваша задача решалась так:
    onChange={(e) => this.limitSwitchHandler(e, row.id)}


    В вашем решении правильней назвать хандлер:
    createLimitPerDayHandler = (rowId) => (e) => { ... };

    так как технически вызов не является хандлером, а возвращает его.
    Ответ написан
    Комментировать
  • Vue.js, React или Angular? Express на Electron JS будет работать?

    @PavelPikat
    На Electron будут работать все фрейморки.
    Но мне кажется вам сначала нужно разобраться с чем, что и куда. Express - это веб сервер который крутится на удаленной машине и обрабатывает запросы пользователей по протоколу (например HTTP).
    Vue/React/Angular - в общем случае, это клиентские приложение которые работают локально в браузере пользователя.
    Electron - это обертка Хромиума, т.е. это десктопное приложение в основе которого лежит браузер.
    Соответвенно запускать веб-сервер внутри Electron это полнейшая глупость и не имеет никакого смысла.

    Имеет смысл резделить приложение на UI с Vue/React/Angular, которые могут работать на десктопе в Electron-приложении, и веб-сервер на Express, который должен работать на удаленной машине. Соответвенно клиентское Electron приложение может делать запросы к серверу и получать/отсылать данные и отображать их в своем UI.
    Ответ написан
    Комментировать
  • Выдает ошибку потока, при применении tab.getId().equals(). Кто подскажет в чем проблема?

    jamakasi666
    @jamakasi666 Куратор тега Java
    Просто IT'шник.
    1) напрягает "Exception in thread "Thread-4" java.lang.NullPointerException", часом не из другого ли потока все работает?
    2) Я так предполагаю что (Response response) летит из друго потока? Случаем не подтирается ли к моменту проверки String id?
    3) Точно ли существет Tab tab = tabPane.getTabs().get(i)?

    Рекомендации
    - самое, вот самое САМОЕ, важное, любые операции с ui проводить ТОЛЬКО в потоке javafx.
    - просто tab.getId() не вызывает npe? На всякий случай почитай как работает а лучше глянь исходники\доки, возможно что если id не установлен то вернется null а у null нет метода equals и отсюда npe.
    -возьми в руки дебаггер, поставь бряк на нужную строку и пошагово смотри что в какой переменной лежит.
    - очень критичный момент, не делай кашу в виде приема-обработки-отрисовки в одном месте, это какраз рождает проблемы с потоками. Подсказка, возьми коллекцию которая может многопоток, к примеру сетевой поток получил пакет и закинул ее в коллекцию после чего работает дальше, из этой коллекции 2й поток взял пакет и обрабатывает и по результату уже ,к примеру, отвечает обратно клиенту или отправляет обработанные данные в еще одну коллекцию из которой эти данные подхватит поток javafxui и отрисует. Т.е. сетевой поток получил и положил в коллекцию вообще не думая что там, зачем и куда. Поток бизнеслогики уже переваривает эти данные и решает что куда и как, ui поток не делает собственно ничего а только отрисовывает новые данные.

    На самом деле вангую что накосячил с потоками и отсюда такие приколы.
    Ответ написан
    1 комментарий
  • Чат на Java (Интерфейс клиента на JavaFX), как сделать?

    jamakasi666
    @jamakasi666 Куратор тега Java
    Просто IT'шник.
    Вот уже второй вопрос задаете и все такойже бестолковый.
    Во первых причем тут javafx вообще? Это вообще ui и никаким боком и уж темболее сложностей просто по определению быть не может ну вообще никак и никаким боком.
    Во вторых, абсолютно, подчеркиваю АБСОЛЮТНО, все что должно волновать на данный момент это архитектура. И начать НУЖНО именно с нее, сядьте, возьмите просто клочок бумаги и напишите пунктами в столбик что необходимо от чата, вот прям все что вы от него хотите, отчертите линию и справа также столбиком сгрупируйте хотелки по их смыслу, дальше уже для полученных групп справа написать псевдокод , что будет использоваться для этой фичи и какие типы данных будут ходить. Подобное я приводил уже в предудщем вашем вопросе но так и быть накидаю еще и тут пример.
    В третих, на тостер приходить надо уже с конкретной проблемой да еще и с которой нагуглить ничего не удалось, что то типа вот у меня сериализация, вот метод сериализация, вот десериализации, а вот ошибка и немогу понять почему.

    По второму пункту пример
    Хочу | Объединение схожего | Как сделать
    ----------------------------------------------------------------------------------------------------------------
    1 чат с другом | 1 | Формат (кому, откого, сообщение)
    2 история | 2 | Хранить в sql бд форматом сообщений
    3 чат со всеми | 1 | Формат (от кого, сообщение)
    4 чат со всеми но в комнате | 1 | Формат (от кого, комната, сообщение)
    5 авторизация | 3 | хранить в sql базе, передавать Форматом(логин, пароль)
    6 общение клиент сервер | | Текстовый вид, Json
    7 регистрация | 3 | хранить в sql , передавать Форматом(логин, пароль)
    n

    По результату берешь и систематизируешь уже конкретнее типа такого:
    1) Нарисовалось много разных форматов сообщений и надо их както отличать а значит сделаю класс родителя с полем int которое будет хранить тип сообщения. Проблема обмена информацией между клиентом и сервером решена полностью с обеих сторон.
    abstract class AMessage{
    int messType;
    }

    2) Необходим универсальный метод сериализации и десериализации объектов из\в json. Возьму библиотеку gson, почитав ее доки получился вот такой простой способ без колхоза. Проблема полностью решена.
    public <T> T fromJson(String json, Class<T> classOfT){
            Gson gson = new GsonBuilder().create();
            try{
                return gson.fromJson(json, classOfT);
            }catch(JsonSyntaxException jse){
                return null;
            }
        }
        public String toJson(Object obj){
            Gson gson = new GsonBuilder().setPrettyPrinting().create();
            try{
                return gson.toJson(obj);
            }catch(JsonSyntaxException jse){
                return null;
            }
        }

    3) Надо назначить и написать классы для каждого сообщения
    Для сообщения в комнату будет так
    //от кого, комната, сообщение
    class RoomMessage extends AMessage{
    String from;
    String roomName;
    String message;
    RoomMessage(String from, String roomName, String message){
     this.messType = 10;
     this.from = from;
     this.roomName = roomName;
     this.message = message;
    }
    }

    n - такой будет класс регистрации и т.д.

    Шаг n.

    Вот только теперь начинаешь писать код. Причем при написании идешь по всем шагам и только так как описал это ранее, даже если в процессе реализации это оказалось сложно\криво\глупо\неправильно.

    Программирование на самом деле состоит процентов на 90 из вот такой волокиты с написанием на бумаге всего и вся и только из 10% реализации. Кроме того таким способом все получится сделать очень быстро, логично и понятно, будет очень легко искать ошибки в программе и дебажить ее. Кроме того еще и получишь сразу почти готовую документацию которую останется только причесать и можно будет показать другому кодеру и он сразу въедет что тут и как работает. А вот заниматься написанием кода "эмпирическим" путем всегда тупиковое дело в котором будешь буксовать на месте, постоянно забывать что тут и как а главное зачем и почему неработает.

    ps еслибы я был преподавателем, а Вы студентом, надавал бы по заднице и вообще заставил вместо такой работы при мне писать от и до всю логику програмки на бумаге а затем рассказывать зачем и почему так сделал.
    Ответ написан
    Комментировать
  • Авторизация и регистрация для desktop приложения на Java, как лучше сделать?

    jamakasi666
    @jamakasi666 Куратор тега Java
    Просто IT'шник.
    Если по простому,а судя по вопросу это именно так, то как то так.
    Для начала вникаем что такое авторизация и регистрация и из чего состоит. Получится что есть клиент и сервер.
    Клиент для регистрации должен сказать желаемый логин и пароль. Для авторизации можно чуть усложнить и работать по 2м схемам, Первый когда клиент скажет серверу логин и пароль. Во втором логин и токен.
    *Токен тут получается после авторизации, его генерирует сервер и сообщает клиенту. Используется для минимальной защиты потому как на клиенте можно не хранить пароль а хранить только логин и токен.
    Сервер в свою очередь ждет от клиентов логин и пароль, после получения которых проверяет в своем хранилище(бд например) и отвечает клиенту сообщением состояния(ок, логин занят,ошибка, пароль простой и т.д.). Дальше он ждет от этого клиента авторизацию по одному из двух способов которая может быть по логину и паролю, тут сервер ответит также сообщением(сгенерирует токен, ошибка пароль\логин не верный). 2й вариант что ожидается логин и токен , ответ будет (ок, ошибка токен не верный).

    Общаться клиент и сервер естественно будет по сети а вот как решать уже вам. Это может быть:
    1) Голые сокеты, проще для понимания т.к. никаких библиотек уже не будет и собственно весь протокол будет ваш.
    2) Использовать какую нибудь rest подобную систему. К примеру тупо взяв сервер с php и сделать нечто похожее(понимаете смысл надеюсь) на register.php и auth.php. Соответсвенно запросы с клиента уже будут идти тупо по http
    3) Взять че покруче и на порядок сложнее, к примеру netty. Круче сокетов но сложнее в пару сотен раз хотя сделать придется по сути тоже что и на сокетах.
    4) Какой нибудь сетевой движек, к примеру kryonet. Тут конечно уже ближе к играм но почему нет? Придется читать доки и следовать принципам библиотеки, ниразу не узнав что такое сериализации и зачем она нужна.

    Для практики потом можно усложнять схему, к примеру чтобы сервер уже не просто смотрел на логин и токен клиента но и еще на его ip чтобы он совпадал. Можно обернуть все это шифрованием, реализовываться будет по разному в зависимости от того каким путем пойдете. Реализовать еще и временный токен этой сессии или же тупо еще одним параметром от клиента типа что за устройство, тогда клиент под одним логином сможет авторизоваться одновременно с нескольких устройств и никто никому мешать не будет.

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

    Конкретно для javafx я тут вообще в этой теме ничего не вижу да и вообще быть ничего не может т.к. это всеголишь библиотека для отрисовки интерфейса программы с коллекциями предназначенными помочь это сделать еще удобнее. Аналогично ей существуют еще ее предшественники awt и swing которые посложнее но темнеменее работают и легче по ресурсам.
    Ответ написан
    4 комментария
  • Java - с чего начать?

    Kuznetsov
    @Kuznetsov
    Java-developer
    Дальше необходимо нарабатывать практические навыки. Попробуйте придумать себе задачу и решить её. Если не хочется ломать голову над задачами, можно приобрести подписку на https://javarush.ru, там их много по всем темам.
    Что касается тем для дальнейшего изучения: посмотрите коллекции, многопоточность и популярные фреймворки (Spring, Hibernate).
    Ответ написан
    Комментировать
  • Java - с чего начать?

    sejak1983
    @sejak1983
    Программист-фрилансер
    Лучший ресурс всех времён и народов это intuit.Вот ссылка: https://www.intuit.ru/studies/courses/569/425/info
    Ответ написан
    2 комментария