reactjs - 当我从列表中选择新链接时,反应子功能类不会重新呈现
问题描述
当我尝试单击新级别的新链接时,口袋妖怪名称将更新,但关联能力组件不会更新。注意到在第二次链接点击时不会触发 fetch 方法。
这是子类
import React, { useState, useEffect } from "react";
import { Link, useLocation} from "react-router-dom";
import "./Abilities.scss"
let Ability = () => {
useEffect(()=> {fetchAbilities().then(r =>
console.log("got getting ability"))
;},[])
let props = useLocation();
// @ts-ignore
let url = props.state.item.url;
let [abilities, setAbilities] = useState([]);
let fetchAbilities= async () => {
let data = await fetch(url);
let items = await data.json();
let abilities1 = items.abilities;
let denormalized = {
"name":"",
"abilities": []
}
for(let i = 0; i< abilities1.length; i++){
let abilityUrl = abilities1[i].ability.url
let response = await fetch(abilityUrl);
let promise = await response.json();
denormalized.name = promise.names;
// @ts-ignore
denormalized.abilities.push(promise)
}
// @ts-ignore
setAbilities(denormalized);
}
// @ts-ignore
let getAbilities =(ability)=> {
let a =<div>
<div>
{ability.name}
</div>
</div>
return a;
}
// @ts-ignore
let getAbiltiesFromPokeom = (poke) => {
let abilities = poke.pokemon.abilities;
console.log(abilities);
let li =
<li className="listItems">
{(abilities|| []).map((a : any)=>getAbilities(a))}
</li>
return li;
};
// @ts-ignore
let abilityName = <>{abilities.name}</>;
// @ts-ignore
let effectEntries = <>{abilities.effect_entries}</>;
let getAbilitInfo =(a: any)=> {
let div = <div>{a.name}</div>
//a.abilities[0].effect_changes[0].effect_entries[1]
let col = [];
let ab = 0;
if(a.abilities != undefined ) {
if(a.abilities.length>0 ) {
for (let i = 0; i < a.abilities.length; i++) {
try {
let effectEntry = a.abilities[i].effect_entries[0].effect;
let name = a.abilities[1].name
let items =
<div>
<div>
<p>{name}</p>
</div>
<div>{effectEntry}</div>
</div>
col.push(items);
}
catch (e){
}
}
}
}
let div1 = <div>
<div>
{col}
</div>
</div>;
return div1
}
return <div className="abilities">
{getAbilitInfo(abilities)}
</div>
}
export default Ability;
桥牌班
import React, {Component, useState, useEffect } from "react";
import "./Pokemon.scss"
import {BrowserRouter as Router, Link, Route, useLocation, useHistory} from "react-router-dom";
import Ability from "../abilities/Ability";
let Pokemon = () => {
useEffect(()=> {fetchItems().then(r =>
console.log("got pokemon details"))
;},[])
let props = useLocation();
// @ts-ignore
let url = props.state.item.url;
let [pokemon, setPokemon] = useState([]);
let fetchItems = async () => {
let data = await fetch(url);
let items = await data.json();
setPokemon(items);
}
// @ts-ignore
let getAbilities =(ability)=> {
setPokemon(ability)
let a =
<Link id={ability.name + "-"}
to={{pathname :"/component/abilities/Ability",
state: {ability}}}>
</Link>
// <Ability ability = {ability}/>
return a;
}
// @ts-ignore
let getAbiltiesFromPokeom = (poke) => {
let abilities = poke.pokemon.abilities;
console.log(abilities);
let li =
<li className="listItems">
{(abilities|| []).map((a : any)=>getAbilities(a))}
</li>
return li;
};
// @ts-ignore
let p = <>{props.state.item.name}</>;
let div = <div >
<div id="a" >
<div>
<p className="poke">{p}</p>
</div>
<p className="poke">
<ul>
{getAbiltiesFromPokeom({pokemon})}
<Route path="/components/:repo" component={Ability} />
</ul>
</p>
</div>
</div>;
return div
};
export default Pokemon;
专利类
import React, {Component, useState, useEffect} from "react";
import "./LeftHandNav.scss"
import {BrowserRouter as Router, Route, Link , useHistory} from "react-router-dom";
import Pokemon from "./pokemon/Pokemon";
import Ability from "./abilities/Ability";
function LeftHandNav() {
useEffect(()=> {fetchItems();},[]);
// @ts-ignore
let url = "https://pokeapi.co/api/v2/pokemon/";
let [items, setItems] = useState([])
let fetchItems= async ()=> {
let data = await fetch(url);
let items = await data.json();
setItems(items.results);
}
function getLi(item:any, id:number) {
let li =
<Link id={item.name + "-" + id}
to={{pathname :"/components/pokemon/Pokemon/"+item.name,
state: {item}}}
>
<li className="listItems" key={id}>
<div className="listItems">
{item.name}
</div>
</li>
</Link>
return li;
}
let id = 0;
let div =
<div>
<div className="hbox">
<Router>
<div id="pokemonNav" >
<ul className="listItems">
<div>
<p>Pokemon</p>
</div>
{items.map(item =>getLi(item, ++id))}
</ul>
</div>
<div>
<Route path="/components/pokemon/" component={Pokemon} />
</div>
</Router>;
</div>;
</div>
return div
}
export default LeftHandNav;
我如何强制它再次调用它?我添加了 onBlur 以再次异步调用 fetch 以更新状态,但到目前为止还没有运气
解决方案
推荐阅读
- android - 从 Room DB 返回项目数
- css - 有没有办法在特色产品上添加悬停效果?
- f# - ODataService Type Provider 还存在吗?
- mysql - java jetty 应用程序以一种方式连接到 kubernetes 中的 mysql
- sql - Postgresql - 根据第一个子查询的结果运行第二个子查询
- html - 为什么我的 HTML 表单是水平堆叠的?
- r - 如何在ggplot上的点上添加标记?
- r - 将坐标映射到世界地图并标记它们
- svn - 是什么导致 SVN 错误“修订 xxx 与现有修订 yyy 不匹配...”
- spring-cloud - Spring Cloud Gateway uri解码失败