亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

每次執行函數并且我的反應狀態發生變化時過濾數組

每次執行函數并且我的反應狀態發生變化時過濾數組

牛魔王的故事 2023-11-12 15:37:00
我正在開發一個與播放列表有關的項目,所以我想要執行的是,每當單擊播放列表中的一首歌曲時,就應該查看附加到該歌曲的圖像。所以,我的代碼是這樣的......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]);};所以,這段代碼的作用是返回包含圖片的數組,但問題是它只過濾一次,即使我點擊另一首歌曲,它也只會重復返回相同的值,而且我每次點擊時都需要它進行過濾在歌曲上(即執行該函數)。我嘗試同時過濾和映射,但沒有成功。或者也許我的語法寫得不夠好。
查看完整描述

2 回答

?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

將這些行移至新的 useEffect 掛鉤。設置數據后會觸發


useEffect(() => {

  const currentDatafile = data?.filter((item) => {

    return item.assets[0].audio === value;

  });

  setCurrentData(currentDatafile)},[data])


查看完整回答
反對 回復 2023-11-12
?
人到中年有點甜

TA貢獻1895條經驗 獲得超7個贊

您不應該每次都從遠程源重新獲取數據。我已將其包裝在自定義掛鉤中,在這里(以及自定義獲取器函數以使測試/模擬更容易)。


然后,您不應該將選定的對象保持在狀態中,除非您需要在內部修改它(在這種情況下,無論如何您都應該將其復制到狀態原子中);相反,只需持有 ID 即可。


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>


查看完整回答
反對 回復 2023-11-12
  • 2 回答
  • 0 關注
  • 179 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號