• Как рендерится массив в react при передаче его в value?

    @historydev
    Острая аллергия на анимешников
    Ты при клике изменяешь состояние squares, заменяешь массив на "X", все твои компоненты Square слушают состояние squares через пропсы, соответственно он везде и будет "X".

    Если тебе нужно инкапсулировать состояние squares, перенеси его в компонент Square как и обработчик клика.
    Ответ написан
    1 комментарий
  • Как приручить событие "keydown" в браузере?

    @alexalexes
    Чтобы вовремя удалить обработчики, нужно их методы деанонимизировать - присвоить имена или иметь где-то указатели на оригинал обработчика, чтобы внутри обработчика он смог снять сам себя с события.
    let setSpeedToUpHandler = function(e)
    {
      if(e.key === " "){
          document.removeEventListener("keydown", setSpeedToUpHandler); // удаляем текущий обработчик с этого типа события 
         setMovementSpeedToSpeedUp(); // увеличиваем скорость персонажа
      };
    };
    let setMovementSpeedToNormalHandler = function(e)
    {
      if(e.key === " "){
         document.removeEventListener("keyup", setMovementSpeedToNormalHandler); // удаляем текущий обработчик с этого типа события 
         setMovementSpeedToNormal(); // устанавливаем скорость на нормальное значение
      };
    };
    document.addEventListener("keydown", setSpeedToUpHandler);
    document.addEventListener("keyup", setMovementSpeedToNormalHandler);
    Ответ написан
    Комментировать
  • Как приручить событие "keydown" в браузере?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    1. вешаем на keydown одноразовый обработчик {once: true}
    2. в обработчике на keyup повторяем навешивание одноразового хэндлера на keydown


    Будет срабатывать один раз при нажатии.

    А вообще, если требуется одноразовое срабатывание за одно нажатие, то почему не использовать keypress?
    Ответ написан
    1 комментарий
  • Почему именно так рассчитывается в данном случае ширина элемента?

    CoDeR2006
    @CoDeR2006
    TypeScript
    Я посмотрел твой код, прикол в том что родительский элемент у тебя flex по этому это не так работает как ты думал, а именно - text питается занять всю ширину. У тебя несколько выходов:
    1. Задавать ширину картинке не как width а как min-width.
    2. Задать элементу text flex 1.

    Ну конечно все зависит от того эффекта который ты хочешь получить. Но решение твой проблемы я написал.
    Ответ написан
    2 комментария
  • Как сверстать шапку наиболее грамотно в данном примере?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    .header {
      display:grid;
      grid-template-columns: 1fr min-content 1fr;
    }


    <header>
      <left/>
      <logo/>
      <right/>
    </header>
    Ответ написан
    3 комментария
  • По какой причине в данном случае появляется переполнение контента?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    потому что 100vw != 100%

    100vw - это ширина окна вместе с полосой прокрутки
    100% - это ширина окна без учета полосы прокрутки

    Как только появляется вертикальный скролл 100vw у body становится больше 100% контентной части

    Поменяйте у body ширину на 100%
    Ответ написан
    4 комментария
  • Как реализовать логику расчета смен в приложении для графика сменности?

    Stalker_RED
    @Stalker_RED
    Остаток от деления номера дня в году на число дней в одном цикле - это смещение графика от начала года.
    Ответ написан
    2 комментария
  • Есть ли примеры отличного наполнения систем обучения?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Я разрабатывал точно такую систему для нашей компании. Это правда не Web.
    Клиентская часть

    6489538a493ab522540657.png
    64895382dc0cf824077907.png
    6489539351d69019959145.png
    648953a64fa26831083970.png
    648953b064870262050339.png
    648953b961667582881625.png
    648953c1115c1856586918.png
    648953c75a18f697626525.png
    648953cde38be306008175.png
    648953d46e71e731504484.png

    Админская часть ещё сложнее
    Ответ написан
    2 комментария
  • Как правильно подходить к возвращаемым типам функциях php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Хорошие вопросы.
    Разумеется, увеличивать количество запросов к БД ради красивой типизации - это абсолютно не вариант.

    Как можно увидеть, в приведенной цитате написано не однозначно, а "скорее всего".
    И поэтому надо конечно стараться, чтобы функция возвращала какое-то одно значение, но не делать этого любой ценой. Поэтому getUserDataFromDatabase вполне может возвращать array|false, а getUserIdFromDatabase - int|false, хотя я бы с ней не заморочивался, первой вполне достаточно. А userIsPresentInDb вообще не нужна, вместо неё можно использовать одну их предыдущих.

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

    return $result ?: []; // дёшево и сердито

    Но это будет всё равно не очень красиво. В одной стороны - да, для проверки, вернула ли функция непустое значение, такой вариант вполне сгодится. Но с другой стороны все равно как-то неаккуратненько. Ведь мы на самом деле ждём не абы какой массив, а вполне определённый, с конкретным набором полей. То есть, если эта функция вернет массив вида [0, 42, 100500], то это будет явно не то, что нам нужно, но при этом типизация и слова поперёк не скажет.

    Если думать от типизации, то функция getUserDataFromDatabase, возвращающая какой-то абстрактный массив - это нонсенс, бессмыслица. Эта функция должна возвращать юзера. Поэтому в идеале надо придумать способ указать, что функция возвращает не абстрактный, а конкретный массив определенного формата. Тем более, что такой способ как раз есть, ведь типизованный массив - это же объект! И для данного случая даже специальный паттерн есть - ValueObject (хотя в случае с пользователем лучше будет все-таки делать полноценный класс, содержащий не только данные, но и методы, например auth(), который сравнивает хэш пароля с введенным).

    Соответственно, в идеале функция должна возвращать объект, представляющий пользователя.

    И уже в этом объекте поле id может либо либо быть нулём, либо иметь какое-то положительное значение. Или даже объект может содержать отдельное свойство, заполнен/не заполнен.

    И вот в этом случае типизация заиграет совсем новыми красками, и будет использоваться на 100%
    function getUserFromDb( int $userId ) : UserObject {
            return $result ? UserObject::fillFromArray($result) : new UserObject();
    };
    $user = getUserFromDb();
    if (!$user->id) {
        // нинашли :'(
    }


    Но опять же, как пишет ниже Сергей delphinpro, зависит от задачи.
    И решив проблему правильной типизации значения, которое функция вернет, если нашла пользователя, можно вернуться к вопросу о том, что возвращать, если функция ничего не нашла. И в этом случае вполне подходящим вариантом будет вернуть null
    function getUserFromDb( int $userId ) : ?UserObject {
        return $result ? UserObject::fillFromArray($result) : null;
    };
    
    if ($user = getUserFromDb()) {
        // нашли :)
    }
    Ответ написан
    6 комментариев
  • Как грамотно сделать обработку ислючений в php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Структура проекта какая-то странная, в нем, судя по всему, контроллером называется роутер, но на этом я останавливаться не буду, обработка исключений от этого не зависит.

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

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

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

    2. Системные ошибки обрабатывает глобальный обработчик исключений, логируя саму ошибку, а на клиент отправляя статус 500 и какое-нибудь абстрактное сообщение о проблеме на сервере. Это самое важное в системных исключениях - текст ошибки никогда, не при каких обстоятельствах не уходит наружу.

    Пример такого исключения - когда запрос в БД порождает ошибку.

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

    Для информирования можно действительно ловить исключение через try..catch и писать какое-то свое сообщение.
    Но можно и автоматизировать этот процесс, вот две статьи, которые показывают примеры, как это можно сделать:
    https://angelovdejan.me/2022/11/24/centralized-exc...
    https://habr.com/ru/articles/688202/
    Ответ написан
    Комментировать
  • Как можно в Js реализовать доступ к полям родительского "класса"?

    Starina_js
    @Starina_js
    full-stack web dev
    В вашем примере obj является простым объектом и не связан с прототипом класса.
    Поэтому, если вы измените obj в одном экземпляре класса, это не отразится на других экземплярах.

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

    class A {
      constructor() {
        if (!A.prototype.hasOwnProperty('obj')) {
          A.prototype.obj = { 'b': 1, 'c': 2 };
        }
      }
    }
    
    class B extends A {
      constructor() {
        super();
        this.nvmProp = 'zZzz';
      }
      changeObj() {
        this.obj.b = 10;
      }
    }
    
    class C extends A {
      constructor() {
        super();
        this.nvmProp = 'zZzzZz';
      }
      changeObj() {
        this.obj.c = 20;
      }
    }
    
    let a = new A();
    let b = new B();
    let c = new C();
    
    b.changeObj();
    c.changeObj();
    
    console.log(b.obj); // {b: 10, c: 20}
    Ответ написан
    1 комментарий
  • Как правильно валидировать данные пользователя?

    sharp97
    @sharp97
    не фонтан но брызги есть
    Ты сам решаешь какая валидация тебе нужна , реализовать можно на js , получаешь response пароля , смотришь совпадает ли , если да то авторизоваться, если нет, то выводить мол пароль не совпадает, длину символов и т д все что душа пожелает
    Ответ написан
    Комментировать
  • Как правильно валидировать данные пользователя?

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

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Да всё очень просто.
    Приватное свойство доступно только в том классе, в котором оно объявлено. Оно не наследуется.
    Вас смущает тот факт, что $this указывает на второй класс, но по факту вызывается метод класса А, и у него не будет доступа к приватным свойствам других классов.
    Ответ написан
    1 комментарий
  • Как в данном случае составить регулярное выражение?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Если дело в браузере, где доступен DOM API, можно так:
    const tr = document.createElement('tr');
    tr.innerHTML = '<td>Продукт</td><td>24</td><td>A</td>' 
    tr.querySelector('td:nth-child(2)').textContent // "24"
    Ответ написан
    5 комментариев
  • Как в данном случае составить регулярное выражение?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    <td>Продукт<\/td><td>([^<]+)<\/td>
    Ответ написан
    1 комментарий
  • Как в шаблон php вставить два класса?

    Fragster
    @Fragster
    помогло? отметь решением!
    <div 
           name="<?php echo $value['nothing_matter'] ; ?>"
           class="<?php echo $value['priority'] === "1" ? "task priority" : 'task'; ?>"
    >
    Ответ написан
    2 комментария
  • Как сформировать запрос к базе данных?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    Вам надо две вещи, первое это инструмент для разбора данных с фронта, хотя бы превращение в обычный массив, второе это какой нибудь query builder
    Первое решается элементарно, это обычный массив объектов, второе можно поискать на гитхаб
    пишем простой свой билдер на примере запроса
    допилить напильником
    <?php
    
    $builder = new Builder();
    $query = $builder
            ->table('test')
            ->select(['*'])
            ->where(['field1', 'in', [1,2,3]], ['field2', 'like', '%ab%'])
            ->limit(10, 20)
            ->get();
    $placeholders = $builder->getPlaceholders();
    
    $result = $pdo->prepare($query)->execute($placeholders);
    /* фетч результата */


    <?php
    
    namespace Compolomus\Builder;
    
    use RuntimeException;
    
    final class Builder
    {
        private ?string $table = null;
    
        private array $where = [];
    
        private array $columns = ['*'];
    
        private array $placeholders = [];
    
        private ?string $queryType = null;
    
        public function __construct(?string $table = null)
        {
            if (!is_null($table)) {
                $this->table = $table;
            }
        }
    
        public function table(string $table): Builder
        {
            $this->table = $table;
    
            return $this;
        }
    
        public function count(): Builder
        {
            $this->queryType = 'select count(*)';
    
            return $this;
        }
    
        public function select(?array $columns = null): Builder
        {
            if (!is_null($columns)) {
                $this->columns = $columns;
            }
    
            return $this;
        }
    
        public function limit(int $limit, int $offset = 0): Builder
        {
            /*
             тут собираем строку с лимит и куда нибудь сохраняем
             */
            return $this;
        }
    
        public function where(array $conditions, string $type = 'and'): Builder
        {
            foreach ($conditions as [$field, $condition, $value]) {
                /* тут собираем строку из поля, значения и типа */
                /* вместо значения подставляем плейсхолдер ? для подготовленных выражений */
                $this->placeholders[] = $value;
            }
    
            /* куда то сохраняем собранную строку,
             по типу собираем массив с типом обьединения,
             тут на самом деле всё сложно,
             возможно проще будет создать Where класс и отдать туда обработку
            */
    
            return $this;
        }
    
        /**
         * @throws RuntimeException
         */
        public function get(): string
        {
            if (is_null($this->queryType)) {
                throw new RuntimeException('Undefined query type');
            }
    
            $query = strtoupper($this->queryType);
            /* тут собираем весь запрос из кусочков */
    
            return $query;
        }
    
        public function getPlaceholders(): array
        {
            $placeholders = $this->placeholders;
    
            $this->placeholders = [];
            /* обязательно обнуляем, возможно и весь билдер для следующего запроса */
    
            return $placeholders;
        }
    
    }
    Ответ написан
    Комментировать
  • Как правильно реализовать форму авторизации и доступ к приложению?

    sslion
    @sslion
    Да, именно скрипт php должен формировать твою страницу, а передача данных пользователя - элементарная задача, и выполняется через сессии, также как и перенаправление- всего одна команда...
    Ответ написан
    3 комментария
  • Не работает функция beforeEach фрэймворка Mocha?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    А у вас же, по идее, всё падает ещё на этапе ${provinceAsia.shortfall}, разве нет? В переменной не определено значение, а вы у неё пытаетесь свойство получить. И это происходит ещё до исполнения beforeEach, вот до неё и не доходит даже.

    получается описание блока It(...) срабатывает даже до beforeEach( fn )?
    Давайте будем пользоваться корректной терминологией. У вас есть две функции: beforeEachи it. Эти функции принимают аргументы. Аргументы вычисляются первыми, потом происходит вызов самих функций.
    Поэтому поток исполнения выглядит так:
    1. Вы передаёте в beforeEach в качестве аргумента свою функцию.
    2. Исполняется функция beforeEach, но не ваша функция-аргумент. Функция beforeEach только регистрирует ваш колбэк.
    3. Вычисляются аргументы для функций it. Здесь происходит падение.
    4. Фреймворк вызывает колбэки, которые вы передали в функцию it, перед этим каждый раз вызывая колбэк, который вы передали в beforeEach. Таки образом переменная provinceAsia имеет значение внутри колбэков it, но не имеет значения на момент выполнения колбэка функции describe.
    Ответ написан
    Комментировать