Ответы пользователя по тегу JavaScript
  • Как добавить к переменной данные, полученные из массива JSON, полученный через API?

    const [News, setNews] = useState(null);
    Эта строка создает состояние, или переменную, с начальным значением null.
    kkey=News.launches[0].id;
    Почти сразу же после этого вы пытаетесь получить свойство "launches" из "News", но вы же только что сказали, что "News" - это null. У null не может быть свойств.
    Позже в useEffect вы записываете в News данные, но это происходит именно после.
    Перенесите строку
    kkey=News.launches[0].id;
    в такую конструкцию
    const [kkey, setKkey] = useState(null);
    useEffect(() => {
      if (News !== null) {
        kkey = News.launches[0].id;
      }
    }, [News]);

    В любом случае, гарантирую, что всплывут другие ошибки. Официальный Getting Started у React в помощь.
    Ответ написан
    Комментировать
  • Какая библиотеку для определения кода страны по номеру телефона?

    Библиотека избыточна. Возьмите этот JSON, спарсите его с помощью JSON.parse() и найдите в нем код с помощью arr.find(item => item.dial_code === search_value), где search_value - это одна, две, три или четыре первых цифры номера.
    Итоговый алгоритм может выглядеть так:
    let result = null;
    [1, 2, 3, 4].forEach(pos => {
      const num = phone_number.slice(1, pos + 1);
      result = our_json.find(item => item.dial_code === num) ?? null;
    });
    console.log(result?.name);
    Ответ написан
    Комментировать
  • Надо ли дожидаться загрузки документа, если скрипт подключается перед закрывающим тегом body?

    Упрощенно, DOM-дерево строится следущим образом:
    HTML-документ просматривается от начала до конца, попутно на основе тегов строя DOM-дерево. Как только будет найден тег <script></script>, просмотр приостановится до завершения этого скрипта. Вы спрашиваете, что плохого может случится, если этот тег находится перед </body>. Тут можно рассмотреть ситуацию чуть сложнее: что, если у нас есть два тега со скриптами? И что, если тот скрипт, что расположен ниже, достраивает DOM-дерево, а первый должен обратиться к новым элементам? Тогда и пригождается DOMContentLoaded. Если обернуть в
    document.addEventListener('DOMContentLoaded', ...);
    логику первого скрипта, он дождется, пока второй скрипт закончит работу, после чего запустится сам. Та же ситуация, когда вторым скриптом идет подключаемая библиотека. Если первый скрипт использует ее, сценарий завершится ошибкой.
    Ну а если мы говорим про страницу с одним скриптом - разницы нет. Но кто гарантирует, что вы позже не подключите библиотеку или не решите добавить еще один скрипт? Лучше продумывать такие тонкости заранее, чтобы часами не искать ошибку.
    Ответ написан
    Комментировать
  • Как тут использовать React.memo?

    Сам компонент необходимо обернуть в memo. Этот HOC предотвращает ре-рендер компонента, если не изменились пропсы.
    export default React.memo(Button);
    Если пропсы меняются, компонент в любом случае перерендерится (если только не подставлен второй аргумент - сравнивающая пропсы функция). onClick, по идее, менятся не должен. Если же в текущем коде он все-таки меняется, попробуйте обернуть этот callback в React.useCallback, где первый аргумент - функция, а второй - при изменении каких переменных она перезаписывается.
    const handleMyButtonClick = React.useCallback(
      ([arg1, [arg2,..]]) => {...}, 
    [[dep1, [dep2,..]]]);

    В итоге должно получится что-то вроде этого:
    const onClick = React.useCallback(() => {
      setJokes(prevValue => prevValue + 5);
    },
    []);

    useCallback
    memo
    Ответ написан
    4 комментария