0

я получаю данные через axios, мне возвращается массив данных и по моей логике, я должен этот ответ присвоить какому-нибудь массиву и там найти то единственное значение, которое мне требуется, у меня нет специального get запроса на получение одного item из массива, поэтому я придумал такую логику, получаю по api все items затем по id ищу нужного мне и отрисовываю на странице

const getOneApi = async (id) => {
    const response = await axios.get('http://localhost:3000/db.json')
    .catch((err) => {
        console.log(('Err', err));
    })
    return response.data.weapon;
}

useEffect( async (id) => { let a = getOneApi() .then(response => response.id == id); console.log(a);

}, [])

в качестве бд у меня просто файл в папке public, чисто тренеровочный вариант. Я пробовал пройтись с map по этому массиву response.data.weapon, пробовал использовать filter, подскажите что и как здесь я в промисах ещё не разобрался

  • я получаю весь массив здесь, но когда я фильрую массив я не получаю один item getOneApi(id) .then(res => {arr = res}) .then(()=>console.log(arr)) .then(()=> console.log(arr.filter(a => a.id = 0))) – Алексей Мелентьев Sep 11 '21 at 09:54
  • 1
    a => a.id = 0 ? или a => a.id === 0 – NeedH8 Sep 11 '21 at 09:56
  • а почему в одной функции используется await для получения значения, а в другой нет? – Grundy Sep 13 '21 at 09:57
  • вы имеете ввиду в useEffect нужно использовать await? – Алексей Мелентьев Sep 13 '21 at 10:26
  • я имею ввиду await нужно использовать внутри async. Стоит также посмотреть что именно принимает useEffect и что может возвращать callback https://reactjs.org/docs/hooks-effect.html – Grundy Sep 13 '21 at 10:45

1 Answers1

1

Можно получать весь массив элементов и далее отрисовывать нужный элемент из массива. получается примерно так:

import React from "react";

const testData = [ { id: 1, name: "name_1", description: "description_1" }, { id: 2, name: "name_2", description: "description_2" }, { id: 3, name: "name_3", description: "description_3" }, { id: 4, name: "name_4", description: "description_4" }, { id: 5, name: "name_5", description: "description_5" }, ];

const App = () => { const [list, setList] = React.useState([]); const [selectedItem, setSelectedItem] = React.useState(null);

React.useEffect(() => { const getData = async () => { // const response = await axios.get('http://localhost:3000/db.json') const response = await Promise.resolve(testData); setList(response); }; getData(); }, []);

return ( <div> <div> {list.map((item) => { return ( <button key={item.id} onClick={() => setSelectedItem(item)}> Name: {item.name} </button> ); })} </div> <div> {selectedItem ? Selected item is: ${selectedItem.name} : "Please select some item ..."} </div> </div> ); };

export default App;

Или можно дополнительно снова получать все данные при смене ID и также отображать выбранный элемент:

import React from "react";

const testData = [ { id: 1, name: "name_1", description: "description_1" }, { id: 2, name: "name_2", description: "description_2" }, { id: 3, name: "name_3", description: "description_3" }, { id: 4, name: "name_4", description: "description_4" }, { id: 5, name: "name_5", description: "description_5" }, ];

const App = () => { const [list, setList] = React.useState([]); const [selectedItemId, setSelectedItemId] = React.useState(null);

React.useEffect(() => { const getData = async () => { // const response = await axios.get('http://localhost:3000/db.json') const response = await Promise.resolve(testData); setList(response); }; getData(); }, []);

return ( <div> <div> {list.map((item) => { return ( <button key={item.id} onClick={() => setSelectedItemId(item.id)}> Name: {item.name} </button> ); })} </div> <SelectedItem id={selectedItemId} /> </div> ); };

export default App;

export const SelectedItem = ({ id }) => { const [currentItem, setCurrentItem] = React.useState();

React.useEffect(() => { const getData = async () => { const response = await Promise.resolve(testData); setCurrentItem(response.find((item) => item.id === id)); }; getData(); }, [id]);

return ( <div> {currentItem ? Selected item is: ${currentItem.name} : "Please selectsome item ..."} </div> ); };

  • Константин, а каким образом данные передадутся в массив testData, если они у меня на сервере, я их получаю при помощи axios.get... Получается мнне их нужно передать как пропсы? Зачем этот массив если есть const [list, setList] = React.useState([]); У меня основная цель взаимодействовать с redux – Алексей Мелентьев Sep 13 '21 at 10:24
  • 1
    Я не имею доступа к твоему localhost:3000/db.json поэтому чтобы убедиться что всё работает создал testData. Его можно удалить. И написать setList(response.data.weapon) вместо setList(response) – Konstantin Modin Sep 13 '21 at 11:00
  • а, понял, спасибо – Алексей Мелентьев Sep 13 '21 at 11:50