• React + Redux, как начать правильно?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Как с этим работать, чтобы не сойти с ума?

    Не торопиться, если хочется вдумчиво разобраться =)

    Первая проблема, как принять данные?

    Использовать react lifecycle hooks: в момент componentDidMount (или в componentWillMount) вызвать actionCreator (AC = создатель действия) -> в AC вы генерируете событие с типом REQUEST (которое ловит ваш редьюсер), а затем производите "ajax запрос", скажем так. В случае удачного результата - генерируете событие SUCCESS и ваш редьюсер устанавливает данные. Далее, ваш компонент формы, видит, что есть новые "props" (свойства, которые изменились в редьюсере, о которых компонент узнал, так как он приконекчен с помощью функции "connect" из библиотеки react-redux) и запускается перерендер. Вуаля, после такой кучи действий ваша форма "приняла данные".

    Конечно, если просто сделать нативный xhr запрос, кода будет гораздо меньше и все в одном файле, но это уже нужно исходить из ваших пожеланий. Если вам нужно, чтобы данные были "прогнаны" через редьюсер и оказались в store, значит "много действий". Если не нужно - просто обычный xhr запрос, либо если угодно $.ajax и установка данных в state компонента.

    Например, на onchange селекта мне нужно брать данные с него, что-то считать и выводить в какой-то инпут... какая здесь цепочка действий, и главное в каких файлах?


    Если используется redux, то цепочка следующая: на onChange селекта вызывается обработчик, то есть функция в вашем компоненте, которая вызывает AC (создатель действия, который располагается в папке actions). Далее уходит запрос на сервер. Затем с сервера приходит успешный ответ - вы генерируете событие, типа "DATA_RESPONSE_SUCCESS" и ваш редьюсер его "ловит". Итак, вы оказываетесь в третьем файле - в файле с редьюсером. Там вы манипулируете данными, так как вместе с типом события, вы так же должны были передать из action'а и данные, которые пришли с сервера. После того, как вы установите новые данные в редьюсере - начинается магия (которая заключается в том, что ваш компонент слушает изменения в объекте стора, с помощью функции connect). Ваш компонент перерендеривается и в инпуте оказываются нужные данные, так как инпут в качестве value использует, например: this.props.myNewValueFromServerAfterSelectManipulation (имя переменной, конечно, шуточное).

    Итого: вы потрогали файл компонента, файл из папки actions и файл из папки reducers.

    Супер итого:
    1) вам нужно понять, как сделать форму без redux. Как в ней с помощью this.state и методов жизненого цикла устанавливать и изменять данные в зависимости от того, что выбрал/ввел пользователь. Сделать это не сложно, если начать с туториала на официальной странице, либо заглянуть в РУ туториал здесь.

    2) вам нужно понять, почему в actions располагаются асинхронные запросы, и как при этом работает redux-thunk (а так же middlewares в общем). Почему в reducers производится только изменение данных. И самое главное, почему компонент при этом перерисовывается. Опять же, ссылки на официальные руководства уже дали. Русский перевод там не закончен, поэтому, хоть и устаревают версии библиотек, этот туториал по редуксу до сих пор актуален.

    P.S. в туториалах есть примеры с кодом
    Ответ написан
    3 комментария
  • Зачем используются константные методы?

    AxisPod
    @AxisPod
    У константных объектов можно вызвать только константные методы, поэтому и требуется помечать все методы, которые не изменяют данные.

    UPD. Судя по ответам, половина вообще не понимает о чём вопрос. Дабы развеять все непонятки, чутка подробнее.

    class foo {
      int val;
      int get_counter;
    public:
      foo(int v) : val(v), get_counter(0) {}
      int get() { ++get_counter; return val; }
      int get() const { return val; }
      int get_counter() const { return get_counter; }
    };
    
    foo f(123141);
    const foo f2(f);
    
    f.get(); // вызывается нормально
    f.get_counter(); // вызывается нормально, даже с пометкой const, даже в случае, если нет не const версии
    
    f2.get(); // без const версии метода была бы ошибка компиляции
    f2.get_counter(); // вызывается без проблем


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

    Ну и если идти дальше, то стандартная библиотека активно использует const объекты. И без адекватного понимания работы модификатора const лезть в C++ вообще не следует.
    Ответ написан
    Комментировать
  • Почему невозможно сравнение?

    @BashkaMen
    C# программист
    Потому что под T могут быть не сравниваемые значения.
    Укажи что будет под T, на пример:
    class MyClass<T> where T :class
        {
    
        }
    Ответ написан
    2 комментария
  • Не работает @media на определенных страницах. Что делать?

    UnluckySerivelha
    @UnluckySerivelha
    Такое есть в head неправильно отображающейся страницы?
    <meta name="viewport" content="width=device-width, initial-scale=1">
    Ответ написан
    3 комментария
  • Можно ли отлавливать нажатие мыши не в update?

    GavriKos
    @GavriKos Куратор тега Unity
    Ответ написан
    Комментировать
  • Есть у кого инфо о продвинутом использовании анимации у персонажа?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Вам нужен Root Motion, в мануале про это есть статья. Ещё можете поискать презентации на их канале, не так давно было несколько для GDC. Инверсная кинематика нужна для правильной постановки стопы на землю, на скорость движения она не влияет.
    Ответ написан
    Комментировать
  • Все ли хостинги поддерживают PDO?

    Как правило, все хостинги поддерживают PDO.
    Ответ написан
    Комментировать
  • Все ли хостинги поддерживают PDO?

    AlexMaxTM
    @AlexMaxTM
    Поставить MySQL без PDO, это ещё нужно постараться. По дефолту вставится с поддержкой PDO. Отключать тем более бессмысленно, так как это может негативно сказаться на безопасности баз. Хотя и с PDO можно написать так, что останется уязвимость.
    Или нужно вообще делать что-то сверх, что бы pdo в скриптах работал?

    Просто подключайтесь и работайте с базой
    Ответ написан
    1 комментарий
  • Что ж, как начать кодить(на C#)?

    Nipheris
    @Nipheris Куратор тега C#
    Тот случай, когда не могу добавить что-либо к тому, что предлагал пару лет назад.

    Но как можно понять, это учит лишь правильно держать карандаш, когда я хочу уметь рисовать.

    Хорошо, что вы это понимаете.

    Знаю о существовании книг и прочего по паттернам, но как по мне до этого еще чутка рановато, и нужно набить руку.

    И это тоже хорошо, что понимаете. Сначала нужно столкнуться с проблемами, а потом искать решения в книгах - иначе это будет как для швеи книга по закаливанию стали.
    Ответ написан
    Комментировать
  • Если бы в интерфейсе можно было реализовывать желаемые методы без необходимости реализации в наследниках, то были бы тогда нужны абстрактные классы?

    qonand
    @qonand
    Software Engineer
    Что бы понять в чем разница между абстрактными классами и интерфейсами для начала стоит немного отойти от их реализации для конкретного языка программирования и понять их суть.
    Что такое интерфейс? это спецификация взаимодействия внешнего мира с объектом. Обратите внимание именно ВЗАИМОДЕЙСТВИЯ, а не реализации.
    Возьмем для примера обычный класс, описывающий какой нибудь выключатель (т.е. задача такого класса включать или выключать какое-то устройство):
    public class Switch 
    {
        public void On()
        {
            // тут предполагается куча кода для включения устройства
        }
    	
        public void Off()
        {
            // тут предполагается куча кода для выключения устройства
        }
    }

    Что входит в состав данного класса:
    1. РЕАЛИЗАЦИЯ функционала включения/выключения устройства (т.е. куча кода который управляет устройством)
    2. ИНТЕРФЕЙС (сигнатура методов On и Off), с помощью которого клиенты класса взаимодействуют с ним.
    Вы можете спокойно управлять объектом этого выключателя, опираясь на его интерфейс, зная что есть метод On отвечающий за включение и метод Off отвечающий за выключение. Но теперь представьте что у Вас десятки разных типов выключателей с разной реализацией и над классом для каждого типа работает отдельный разработчик. Как сделать Ваш алгоритм управления универсальным и независимым от конкретного типа выключателя? Для этого нужно что бы у выключателя в независимости от его типа был одинаковый интерфейс (грубо говоря присутствовал метод On и метод Off). Но как разработчикам классов-выключателей знать что Вам нужен именно такой интерфейс? а если они и знают как заставить их его в точности соблюсти? Согласитесь было бы удобно, если бы была возможность, где-то отдельно описать интерфейс (формализовать его), на который можно было бы опираться при взаимодействии с выключателями, а другие разработчики просто бы его подключали и реализовывали. Вот тут на помощь уже и приходить отдельная конструкция interface, которая позволяет этого добиться. Вы можете сделать так:
    public interface ISwithable
    {
        public void On()
    	
        public void Off()
    }

    это позволит Вам работать исключительно с интерфейсом, не парясь о конкретных реализациях, а так же сторонним разработчикам четко соблюдать необходимые Вам правила.
    Теперь давайте обсудим что же такое класс. Как видно из примера класс это реализация определенного интерфейса и непосредственно конкретного функционала. А чем отличается абстрактный класс от обычного? тем что он позволяет сделать отложенную реализацию части функционала, т.е. переложить ответственность за реализацию на своих потомков. Но тем не менее он по прежнему не только реализовывает интерфейс но описывает функционал. Конечно можно с помощью абстрактного класса сделать некую имитацию только интерфейса сделав все методы абстрактными, но это не совсем правильно т.к. задачи абстрактного класса в первую очередь - это создание возможностей отложенной реализации конкретного функционала.
    Ответ написан
    Комментировать
  • Если бы в интерфейсе можно было реализовывать желаемые методы без необходимости реализации в наследниках, то были бы тогда нужны абстрактные классы?

    Уже в общем-то даны подробные ответы, мне по этому вопросу когда-то запомнилось следующее утверждение:
    • Интерфейс описывает, что объект может сделать.
    • Абстрактный класс описывает, чем объект является.
    Ответ написан
    Комментировать
  • Разница стилей или в private есть смысл?

    @d-stream
    Готовые решения - не подаю, но...
    Завтра например в сеттере надо будет произвести какие-либо действия - вариант с приватным полем - элементарно дополнится.

    И будет что-то типа:
    private string _name;
    public string Name{
    get{return _name;}
    set{_name=value; OnPropertyChangedDoSomething();}
    }
    Ответ написан
    Комментировать
  • Как в sql выбрать записи, зная их id?

    anton_lazarev
    @anton_lazarev
    Если я конечно правильно понял вопрос, то Вам нужен JOIN, примерно так:
    SELECT `t2`.*  FROM `chosenlink` `t1` JOIN `table` `t2` ON `t1'.`targetid` = `t2`.`id` WHERE `type`=1 AND `userid`=".$userinfo['id']
    Ответ написан
    3 комментария
  • Как узнать путь программы из ее процесса?

    JohnnyGat
    @JohnnyGat
    Стараюсь писать код, понятный человеку.
    Комментировать
  • Как в sql выбрать записи, зная их id?

    EreminD
    @EreminD
    Кое-что умею
    Немного не понятен вопрос
    Пока точно можно сказать что поиск делается вот так. Вам остается подставлять свой набор idшников
    select * from table where id in (1, 2, 3, 4 ....)
    Ответ написан
    2 комментария
  • Какой стек технологий выбрать для онлайн конструктора а-ля Sims?

    Посмотрите в сторону Blend4Web, а если возможностей не хватит, то на three.js можно это всё сделать руками.
    Ответ написан
    2 комментария
  • Как средствами с++/с#/java обратиться к видеокарте, как это делает opengl?

    @vilgeforce
    Раздолбай и программист
    OpenCL/Cuda спасут отца русской демократии, не?
    Ответ написан
    5 комментариев
  • Стрельба из лука, как реализовать выброс стрелы?

    MrMureno
    @MrMureno Куратор тега Unity
    VR for all
    arrowPrefab у вас объект с Rigidbody ?
    Отлично работает AddForce в случае наличия физического тела. Просто не забыть что тип силы бывает разный, для случая стрелы отлично подходит импульс.

    как то так
    arrow.AddForce(arrow.transform.forward * forcePower, ForceMode.Impulse);
    Ответ написан
    4 комментария