Я работаю над проектом, который связан со списком воспроизведения, поэтому я хочу выполнить каждый раз, когда щелкается одна из песен в списке воспроизведения, изображение, прикрепленное к песне, должно быть просмотрено. Итак, у меня есть мой код таким образом...
const Component = () => {
const value = useContext(DataContext);
const [data, setData] = useState(null);
const [currentData, setCurrentData] = useState(null);
useEffect(() => {
const url =
"https://52-90-82-235.maverickmaven.com/geotourdata/json.cfm?h=-107,37,s,en,3A771765";
const currentValue = value;
axios({
method: "get",
url,
responseType: "stream",
}).then((response) => {
let features = response.data.features.filter((elem) => {
return elem.type === "Feature";
});
setData(features);
const currentDatafile = data?.filter((data) => {
return data?.assets[0].audio === value;
});
setCurrentData(currentDatafile);
});
}, [setCurrentData]);
};
Итак, что делает этот код, так это то, что он возвращает массив с изображением, но проблема в том, что он фильтрует только один раз и многократно возвращает одно и то же значение, даже если я нажимаю на другую песню, и мне нужно фильтровать каждый раз, когда я нажимаю на песни(т.е. функция выполняется).
Я пробовал фильтровать и отображать одновременно, но это не сработало. или, может быть, я недостаточно хорошо написал синтаксис.
Пожалуйста, мне нужна помощь.
Он возвращает массив, содержащий данные, которые я хочу просмотреть.
Итак, я сохранил значение данных с помощью setData(feature), поэтому затем я могу использовать данные для перехода туда, где я хочу в массиве, но на этот раз я хочу его отфильтровать..
Вы не должны каждый раз повторно получать данные из удаленного источника. Вместо этого я завернул это в собственный хук здесь (и пользовательскую функцию извлечения, чтобы упростить тестирование/насмешку).
Затем вы не должны удерживать выбранный объект в состоянии, если вам не нужно его внутренне изменить (в этом случае вы все равно должны скопировать его в атом состояния); вместо этого просто держите идентификатор.
function fetchTourData() {
return fetch('https://52-90-82-235.maverickmaven.com/geotourdata/json.cfm?h=-107,37,s,en,3A771765')
.then(response => response.json())
.then(data => data.features.filter((elem) => elem.type === 'Feature'));
}
function useTourData() {
const [data, setData] = React.useState(null);
React.useEffect(() => {
fetchTourData().then(setData);
}, [setData]);
return data;
}
const Component = () => {
const tourData = useTourData();
const [selectedId, setSelectedId] = React.useState(null);
const selectedTour = (tourData || []).find(t => t.id === selectedId);
if (tourData === null) {
return <div>Loading</div>
}
return (
<div>
<div>
Selected: {JSON.stringify(selectedTour || "nothing")}
</div>
<ul>
{tourData.map(t => <li key = {t.id}><a href = "#" onClick = {() => setSelectedId(t.id)}>{t.name}</a></li>)}
</ul>
</div>
);
};
ReactDOM.render(<Component />, document.getElementById("root"));
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/17.0.0/umd/react.production.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.0/umd/react-dom.production.min.js"></script>
<div id = "root"></div>
что происходит, когда ваш find()
разрешился, но tourData по-прежнему равен нулю. Отображение состояния загрузки в этом случае было бы неправильным
@Aquib задание selectedTour
можно переместить после if - это вообще не имеет значения.
Переместите эти строки в новый хук useEffect. Будет срабатывать после того, как вы установите данные
useEffect(() => {
const currentDatafile = data?.filter((item) => {
return item.assets[0].audio === value;
});
setCurrentData(currentDatafile)},[data])
Я попробовал это, это то же самое, функция работает, но только один раз, даже если я снова нажму на песню, все равно будет отображаться один и тот же файл снова и снова, что означает, что он не был обновлен, вот в чем проблема ..
Что содержит
features
, когда выconsole.info()
это?