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

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

在 Reactjs 中的 setState() 之后未定義(使用鉤子)

在 Reactjs 中的 setState() 之后未定義(使用鉤子)

慕神8447489 2022-06-09 18:56:18
我自己學習 react 和 js。請解釋為什么會出現這種情況。PS:請原諒我的大文本,我試圖盡可能清楚地解釋問題。謝謝。事情的本質:通過鉤子設置初始狀態:  const [pokemon, setPokemon] = useState({    img: "",    name: "",    types: [],    abilities: [],    moveList: [],    weight: "",    height: "",    description: "",    genus: "",    chanceToCatch: "",    evolutionURL: ""  });此外,我發出 api 請求以從 useEffect 內部獲取信息:useEffect(() => {    const fetchData = async () => {      await Axios({        method: "GET",        url: urlPokemonAPI      })        .then(result => {          const pokemonResponse = result.data;          /* Pokemon Information */          const img = pokemonResponse.sprites.front_default;          const name = pokemonResponse.name;          const weight = Math.round(pokemonResponse.weight / 10);          const height = pokemonResponse.height / 10;          const types = pokemonResponse.types.map(type => type.type.name);          const abilities = pokemonResponse.abilities.map(            ability => ability.ability.name          );          const moveList = pokemonResponse.moves.map(move => move.move.name);          setPokemon(() => {            return {              img: img,              name: name,              weight: weight,              types: types,              abilities: abilities,              moveList: moveList,              height: height            };          });        })問題特別出現eggGroups(具有相同的處理abilities并且types沒有這樣的問題)。這就是當我想<div> Egg Group: {pokemon.eggGroups} </div>在數據正常顯示時將數據輸出到頁面時發生的情況,但只要我想輸出eggGroups以及abilities用types逗號(join ( ','))分隔 - 錯誤:TypeError: pokemon.eggGroups is undefined。我決定通過控制臺檢查這件事,并將這個eggGroups密鑰塞進超時:在某些時候,eggGroups變得未定義......為什么,我無法理解。但是如果我單獨設置狀態,const [egg, setEgg] = useState ([]); setEgg (eggGroups);就不會觀察到這樣的問題。為什么會這樣?一切都很好types和abilities。先感謝您。
查看完整描述

2 回答

?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

來自鉤子的狀態更新器在更新狀態時不會合并狀態值,而是用新值替換舊值


由于您使用狀態更新器,例如


 setPokemon(() => {

        return {

          img: img,

          name: name,

          weight: weight,

          types: types,

          abilities: abilities,

          moveList: moveList,

          height: height

        };

      });

eggGroups屬性丟失,因此它變得未定義。您需要通過傳播從回調獲得的先前狀態值來更新它


setPokemon((prev) => {

        return {

          ...prev

          img: img,

          name: name,

          weight: weight,

          types: types,

          abilities: abilities,

          moveList: moveList,

          height: height

        };

      });


查看完整回答
反對 回復 2022-06-09
?
犯罪嫌疑人X

TA貢獻2080條經驗 獲得超4個贊

您的代碼有問題,這是使用 axios 等待的正確方法,您需要像這樣導入 axios


import axios from 'axios';

await應該用一個promise調用,然后它從api返回數據,如下所示:


const result = await axios.get(urlPokemonAPI);

這是與您的代碼具有相同邏輯的代碼片段


useEffect(() => {

    const fetchData = async () => {

        // import axios from 'axios';

        try {

            const result = await axios.get(urlPokemonAPI);

            const pokemon = result.data;

            setPokemon({

                img: pokemon.sprites.front_default,

                name: pokemon.name,

                weight: Math.round(pokemon.weight / 10),

                types: pokemon.types.map(i => i.type.name),

                abilities: pokemon.abilities.map(i => i.ability.name),

                moveList: pokemon.moves.map(i => i.move.name),

                height: pokemon.height / 10

            });


            const result2 = await axios.get(urlPokemonSpecies);

            const data = result2.data;

            let description = "";

            data.flavor_text_entries.forEach(i => {

                const lang = i.language.name

                if (lang === "en") {

                    description = i.flavor_text;

                }

            });

            let genus = "";

            data.genera.forEach(i => {

                const lang = i.language.name;

                if (lang === "en") {

                    genus = i.genus;

                }

            });

            setPokemon(pokemon => {

                return {

                    ...pokemon,

                    description,

                    genus,

                    chanceToCatch: Math.round((data.capture_rate * 100) / 255),

                    evolutionURL,

                    eggGroups: data.egg_groups.map(g => g.name)

                };

            });

        } catch (e) {

            console.log(e);

        }

    };

    fetchData();

}, [urlPokemonAPI, urlPokemonSpecies]);

你看到另一個問題了嗎:你調用了兩次 setPokemon,讓我們再重寫一次:


useEffect(() => {

    const fetchData = async () => {

        // import axios from 'axios';

        try {

            const result = await axios.get(urlPokemonAPI);

            const data1 = result.data;

            const result2 = await axios.get(urlPokemonSpecies);

            const data2 = result2.data;

            function resolveDescription(data) {

                let description = "";

                data.flavor_text_entries.forEach(i => {

                    const lang = i.language.name

                    if (lang === "en") {

                        description = i.flavor_text;

                    }

                });

                return description;

            }

            function resolveGenus(data) {

                let genus = "";

                data.genera.forEach(i => {

                    const lang = i.language.name;

                    if (lang === "en") {

                        genus = i.genus;

                    }

                });

                return genus;

            }


            setPokemon({

                img: data1.sprites.front_default,

                name: data1.name,

                weight: Math.round(data1.weight / 10),

                types: data1.types.map(i => i.type.name),

                abilities: data1.abilities.map(i => i.ability.name),

                moveList: data1.moves.map(i => i.move.name),

                height: data1.height / 10,

                description: resolveDescription(data2),

                genus: resolveGenus(data2),

                chanceToCatch: Math.round((data2.capture_rate * 100) / 255),

                evolutionURL: data2.evolution_chain.url,

                eggGroups: data2.egg_groups.map(g => g.name)

            });

        } catch (e) {

            console.log(e);

        }

    };

    fetchData();

}, [urlPokemonAPI, urlPokemonSpecies]);


查看完整回答
反對 回復 2022-06-09
  • 2 回答
  • 0 關注
  • 235 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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