Задать вопрос
  • Почему при перезагрузке страницы мои данные пропадают?

    @webjun Автор вопроса
    0xD34F, я опубликовал решение к которому смог дойти, действительно можно и без строгого режима как вы и советовали. Отмечу ваш ответ решением, может это принесет вам спокойствие)
  • Почему при перезагрузке страницы мои данные пропадают?

    @webjun Автор вопроса
    , я по-прежнему не понимаю, что вы говорите.
    - я не говорю, а печатаю.
  • Почему при перезагрузке страницы мои данные пропадают?

    @webjun Автор вопроса
    0xD34F, вы достаточно поздно начали меня не понимать. Начинать свое непонимание можно было гораздо раньше, а именно со слова "разьяснение" которое я написал с мягким знаком, а не твердым.
  • Почему при перезагрузке страницы мои данные пропадают?

    @webjun Автор вопроса
    0xD34F, ранее вы посоветовали сделать сохранение данных через useEffect, я так и сделал но по-прежнему свою проблему не решил. Мне нужно было сохранить мои todos таким образом чтоб при перезагрузке страницы они не исчезали.. Вероятно я где-то допустил ошибку, поэтому и скинул код выше..
  • Почему при перезагрузке страницы мои данные пропадают?

    @webjun Автор вопроса
    Спасибо за разьяснение, вот я написал вот так но по-прежнему при перезагрузке все стирается..
    React.useEffect(() => {
        if (inputRef.current) {
          inputRef.current.focus();
        }
        const data = localStorage.getItem("todos");
      }, []);
    
      useEffect(() => {
        localStorage.setItem("todos", JSON.stringify(todos));
      }, [todos]);
  • Как определить тип события?

    @webjun Автор вопроса
    HealSpirit, ваши варианты правильные и работают если импортировать(Я по невнимательности забыл импортировать). Просто я привык писать напрямую без импортов, тот же стейт пишу так:
    const [state, setState] = React.useState()

    Дело вкуса, спасибо за разьяснение
  • Как определить тип события?

    @webjun Автор вопроса
    У меня сработал только такой вариант:
    const updateSearch = (event: React.ChangeEvent<HTMLInputElement>) => {
        setSearch(event.target.value);
      };
  • Почему я получаю undefined?

    @webjun Автор вопроса
    Aetae, странно, компонент я типизировал. Вот даже если банально проверить вывод данных без компонента с пропсами - я так же получаю ошибки:

    function App() {
    
      const [search, setSearch] = React.useState("");
      const [query, setQuery] = React.useState<string>("steak");
      const [recipes, setRecipes] = React.useState<Welcome["hits"]>([]);
    
      async function fetchApi() {
        try {
          const response = await axios.get<Welcome>(
            `https://api.edamam.com/search?q=${query}&app_id=${ID}&app_key=${KEY}`
          );
          setRecipes(response.data.hits);
        } catch (e: unknown) {
          console.warn(e);
        }
      }
    
      console.log(recipes);
      React.useEffect(() => {
        fetchApi();
      }, [query]);
    
      const gainSearch = (event: React.FormEvent) => {
        event.preventDefault();
        setQuery(search);
        setSearch("");
      };
    
      const updateSearch = (event: any) => {
        setSearch(event.target.value);
      };
      return (
        <div className="App">
          {recipes.map((recipe) => {
            <h2>{recipe.recipe.calories}</h2>;  //не отображается
          })}
        </div>
      );
    }
    
    export default App;

    Ошибка:

    const recipes: Hit[]
    Type 'void[]' is not assignable to type 'ReactNode'.
    Type 'void[]' is not assignable to type 'ReactFragment'.
    The types returned by '[Symbol.iterator]().next(...)' are incompatible between these types.
    Type 'IteratorResult' is not assignable to type 'IteratorResult'.
    Type 'IteratorYieldResult' is not assignable to type 'IteratorResult'.
    Type 'IteratorYieldResult' is not assignable to type 'IteratorYieldResult'.
    Type 'void' is not assignable to type 'ReactNode'.


    К примеру я типизирую "recipe" как any - все ошибки исчезают но на странице ничего не отображается:
    <div className="App">
          {recipes.map((recipe): any => {
            <h2>{recipe.recipe.calories}</h2>;
          })}
        </div>


    Вариант с пропсом:
    <div className="App">
          {recipes.map((recipe) => {
            <Recipe
              key={recipe.recipe.label}
              image={recipe.recipe.image}
              calories={recipe.recipe.calories}
              ingredients={recipe.recipe.ingredients}
            />;
          })}
        </div>


    Сам компонент:
    import React from "react";
    
    interface IProps {
      label: string;
      image: string;
      calories: number;
      ingredients: Array<any>;
    }
    
    export default function Recipe({
      label,
      image,
      calories,
      ingredients,
    }: IProps) {
      return <h1>{calories}</h1>;
    }
  • Как сделать чтобы js применялись только к определенному диву?

    @webjun
    Danya Wyse, так даже если дивы будут с одинаковыми классами все равно применяться ко всем элементам не будет, для этого нужно форичом пробегатьтся. В нодлисте мы дейтвительно получим все элементы с классом но чтоб применить к ним что-либо это уже forEach
  • Как сделать чтобы js применялись только к определенному диву?

    @webjun
    masterwen, нет ко всем дивам оно применяться не будет, айди он и нужен чтоб обозначить уникальность.

    К примеру у вас на странице есть три дива и вам нужно в каждом из них сделать текст красным, обычно делается так :

    <div class="test">TEST</div>
    <div class="test">TEST</div>
    <div class="test">TEST</div>
    
    const test = document.querySelectorAll('.test');
    
    test.forEach((element) => {
    	element.style.color = "red"
    })
  • Почему я получаю undefined?

    @webjun Автор вопроса
    Aetae, сделал как вы и сказали:
    function App() {
    
      const [search, setSearch] = React.useState("");
      const [query, setQuery] = React.useState<string>("steak");
      const [recipes, setRecipes] = React.useState<Welcome["hits"]>([]);
    
      async function fetchApi() {
        try {
          const response = await axios.get<Welcome>(
            `https://api.edamam.com/search?q=${query}&app_id=${ID}&app_key=${KEY}`
          );
          setRecipes(response.data.hits);
        } catch (e: unknown) {
          console.warn(e);
        }
      }
    
      console.log(recipes);
      React.useEffect(() => {
        fetchApi();
      }, [query]);
    
      const gainSearch = (event: React.FormEvent) => {
        event.preventDefault();
        setQuery(search);
        setSearch("");
      };
    
      const updateSearch = (event: any) => {
        setSearch(event.target.value);
      };
      return (
        <div className="App">
          {recipes.map((recipe) => (
            <Recipe
              key={recipe.recipe.label}
              title={recipe.recipe.label}
              image={recipe.recipe.image}
              calories={recipe.recipe.calories}
              ingredients={recipe.recipe.ingredients}
            />
          ))}
        </div>
      );
    }


    Получаю ошибки:

    (property) title: any
    Type '{ key: any; title: any; image: any; calories: any; ingredients: any; }' is not assignable to type 'IntrinsicAttributes'.
    Property 'title' does not exist on type 'IntrinsicAttributes'.


    6325e5b69eca2784809349.png

    Странно что в консоли мой массив рецептов есть а отобразить в разметке не могу..
  • Почему я получаю undefined?

    @webjun Автор вопроса
    Aetae, я сейчас на этапе изучения тайпсрипта и стараюсь делать пет-проекты в двух вариантах - на обычном js и переписывать на тс)
    Честно говоря впервые так долго решаю проблему вывода данных с сервера..

    Решил ради интереса попробовать без аксиоса:
    const [recipes, setRecipes] = React.useState<Welcome["hits"]>([]);
    
      const fetchApi = () => {
        try {
          fetch(
            `https://api.edamam.com/search?q=${query}&app_id=${ID}&app_key=${KEY}`
          )
            .then((res) => res.json())
            .then((data) => setRecipes(data.hits));
        } catch (e) {
          console.log(e);
        }
      };
      console.log(recipes);


    Теперь я в коносоли имею доступ к массиву
    hits
    который состоит из нескольких обьектов но я не могу по-нему пробежаться мапом..

    Теперь с аксиосом (я понимаю что от способа получения данных мало что меняется но все же)
    const [recipes, setRecipes] = React.useState<Welcome["hits"]>([]);
    
      async function fetchApi() {
        try {
          const response = await axios.get<Welcome["hits"]>(
            `https://api.edamam.com/search?q=${query}&app_id=${ID}&app_key=${KEY}`
          );
          setRecipes(response.data);  //hits не дает записать, <blockquote>Property 'hits' does not exist on type 'Hit[]'</blockquote>
          console.log(recipes);
        } catch (e: unknown) {
          console.warn(e);
        }
      }


    только если ты сам напишешь вот так await axios.get.... Т.е. ты прямым текстом говоришь typescript'у, что в ответе сервера ждёшь МАССИВ Ingredient[], а не объект, имеющий поле hits, а потом удивляешься, что он тебе об этом прямо говорит.
    - выходит что моя новая запись
    const [recipes, setRecipes] = React.useState<Welcome["hits"]>([]);
    
    const response = await axios.get<Welcome["hits"]>(
            `https://api.edamam.com/search?q=${query}&app_id=${ID}&app_key=${KEY}`
          );
    тоже неверная тк как я тут тоже ожидаю массив а должен ожидать обьект. Смотрел документацию и некоторые туториалы и там получение данных происходит примерно так же как я и написал. Может дело в типах ?
    https://codepen.io/IvaLu/pen/bGMqVKj?editors=0010
  • Почему я получаю undefined?

    @webjun Автор вопроса
    Aetae, я понимаю что мне в responce.data приходит корневой объект ответа.

    Если ты хочешь положить в setRecipes массив hits, то и клади туда, блин, массив hits: setRecipes(response.data.hits).

    Я бы и рад получить массив hits в переменную recipes но тс не дает мне этого сделать, когда я пишу setRecipes(response.data.hits). то сразу же получаю ошибку
    Property 'hits' does not exist on type 'Ingredient[]'
    , подставлял абсолютно все интерфейсы и везде одни и та же ошибка.
    Я переписал проект на обычном реакте и все работает.
  • Почему я получаю undefined?

    @webjun Автор вопроса
    Aetae, заранее сори за отнятое время, просто хочется разобраться..

    Я уже пробовал положить пустой массив в обьект
    const[recipes, setRecipes] = React.useState<Welcome>([]);

    Сразу же ловлю ошибку
    Argument of type 'never[]' is not assignable to parameter of type 'Welcome | (() => Welcome)'


    Затем вроде исправил ошибку и дописал массив в дженерик:
    const[recipes, setRecipes] = React.useState<Welcome[]>([]);
    
    
      async function fetchApi(){
        try{
          const response = await axios.get<Welcome[]>(`https://api.edamam.com/search?q=${query}&app_id=${ID}&app_key=${KEY}`);
          setRecipes(response.data);
          console.log(recipes)
        }catch(e: unknown){
          console.warn(e);
        }
      }

    В консоли получаю пустой массив - значит данные с сервера я не получаю.

    Далее я пробую дженерик
    const[recipes, setRecipes] = React.useState<Irecipe[]>([]);
    
    
      async function fetchApi(){
        try{
          const response = await axios.get<Irecipe[]>(`https://api.edamam.com/search?q=${query}&app_id=${ID}&app_key=${KEY}`);
          setRecipes(response.data);
          console.log(recipes)
        }catch(e: unknown){
          console.warn(e);
        }
      }

    Тут уже я получаю все тот же обьект в консоль (почему-то выводится через раз) , думал что выйдет присвоить setRecipes(response.hits);
    но увы не могу присвоить переменной recipes что-либо другое кроме setRecipes(response.data);

    Вот такая трясина, где-то же есть моя ошибка..
  • Почему я получаю undefined?

    @webjun Автор вопроса
    Aetae, Спасибо большое, буду разбираться)
  • Почему я получаю undefined?

    @webjun Автор вопроса
    Aetae, хорошо, а почему я не могу дальше полученный обьект пройти мапом чтоб далее вывести данные динамически ?

    const[recipes, setRecipes] = React.useState<Welcome>();
    
    
      async function fetchApi(){
        try{
          const response = await axios.get<Welcome>(`https://api.edamam.com/search?q=${query}&app_id=${ID}&app_key=${KEY}`);
          setRecipes(response.data);
          console.log(recipes?.hits[0].recipe.calories) //Тут данные с обьекта выводятся
        }catch(e: unknown){
          console.warn(e);
        }
      }
    
      
      
      React.useEffect(()=> {
        fetchApi()
      }, [query]);
    
      const gainSearch = (event: React.FormEvent) => {
        event.preventDefault();
        setQuery(search);
        setSearch('');
      }
    
      const updateSearch = (event: any)=>{
        setSearch(event.target.value);
      }
      return (
        <div className="App">
          {recipes.map((recipe:Welcome) => {
            <Recipe key={recipe.hits}/> //Здесь уже получаю ошибку <blockquote>Object is possibly 'undefined'.</blockquote>
          })}
        </div>
      );
    }
    
    export default App;


    Я уже в ступоре от этого тайпскрипта, данные описаны валидно (раз в консоли получаю значение) но теперь я их не могу вывести мапом в карточки ..
  • Почему я получаю undefined?

    @webjun Автор вопроса
    Aetae, большое спасибо за прояснение
  • Почему я получаю undefined?

    @webjun Автор вопроса
    Опять же, если мои типы были описаны с ошибками то почему тс давал подсказки к ключам? После конвертера тоже самое, обращаюсь к ключам а их значение - undefined..)
  • Почему я получаю undefined?

    @webjun Автор вопроса
    Да, действительно, конвертеры сильно облегчают жизнь, спасибо. Но даже с готовыми из конвертера интерфейсами - я получаю undefined