如何删除功能组件中的所有旧元素
How to delete all old elements in functional component
我需要在获取后删除所有带有 h1 的旧 div:
export default function SearchSong() {
const [topSongs, setTopSongs] = useState([]);
let inputEl = useRef(null);
const fetchData = async () => {
更新。这是 fetch(returns 正确的数据):
let sTrack = inputEl.current.value;
sTrack = sTrack.replace(/ /g,"+");
try {
const response = await fetch(
`http://ws.audioscrobbler.com/2.0/?method=track.search&track=${sTrack}&api_key=a3c9fd095f275f4139c33345e78741ed&format=json`
);
const data = await response.json();
setTopSongs(data);
} catch (error) {
console.log(error.message);
}
};
return (
<div>
<div className="inner-input">
<div className="container">
<h1 className="search" >Search for song:
</h1>
有输入:
<input ref={inputEl} size="50" type="text"/>
<button class="btn btn-primary" onClick={fetchData} >Fetch</button>
</div>
</div>
{topSongs?.results?.trackmatches?.track.length &&
topSongs.results.trackmatches.track.map((datumn) => {
return (
<div key={datumn.name}>
<h1 className='heading'>{datumn.name}</h1>
</div>
);
})}
</div>
)
}
我已经尝试使用 useRef 并删除父元素
Fragments
本身不会在实际的 DOM 树中呈现。您通常使用它们在单个根父元素下呈现 2 个或更多元素。所以在渲染后删除它们是没有用的。
但是,您可以将它们从 map
函数中删除,改为
return <h1 key={datum.name} className="heading">{datum.name}</h1>;
因为无论如何你都会返回一个根元素。
更新
如果要根据语句是 true
还是 false
有条件地呈现:
{topSongs?.results?.trackmatches?.track.length ?
topSongs.results.trackmatches.track.map((datumn) => {
return (
<div key={datumn.name}>
<h1 className='heading'>{datumn.name}</h1>
</div>
);
}) : (
<div className="inner-input">
<div className="container">
<h1 className="search" >Search for song:
</h1>
<input ref={inputEl} size="50" type="text"/>
<button class="btn btn-primary" onClick={fetchData} >Fetch</button>
</div>
</div>
)}
topSongs.results.trackmatches.track.map()
将在 topSongs?.results?.trackmatches?.track.length > 0
时呈现,否则 <div className="inner-input">..</div>
将呈现。
我需要在获取后删除所有带有 h1 的旧 div:
export default function SearchSong() {
const [topSongs, setTopSongs] = useState([]);
let inputEl = useRef(null);
const fetchData = async () => {
更新。这是 fetch(returns 正确的数据):
let sTrack = inputEl.current.value;
sTrack = sTrack.replace(/ /g,"+");
try {
const response = await fetch(
`http://ws.audioscrobbler.com/2.0/?method=track.search&track=${sTrack}&api_key=a3c9fd095f275f4139c33345e78741ed&format=json`
);
const data = await response.json();
setTopSongs(data);
} catch (error) {
console.log(error.message);
}
};
return (
<div>
<div className="inner-input">
<div className="container">
<h1 className="search" >Search for song:
</h1>
有输入:
<input ref={inputEl} size="50" type="text"/>
<button class="btn btn-primary" onClick={fetchData} >Fetch</button>
</div>
</div>
{topSongs?.results?.trackmatches?.track.length &&
topSongs.results.trackmatches.track.map((datumn) => {
return (
<div key={datumn.name}>
<h1 className='heading'>{datumn.name}</h1>
</div>
);
})}
</div>
)
}
我已经尝试使用 useRef 并删除父元素
Fragments
本身不会在实际的 DOM 树中呈现。您通常使用它们在单个根父元素下呈现 2 个或更多元素。所以在渲染后删除它们是没有用的。
但是,您可以将它们从 map
函数中删除,改为
return <h1 key={datum.name} className="heading">{datum.name}</h1>;
因为无论如何你都会返回一个根元素。
更新
如果要根据语句是 true
还是 false
有条件地呈现:
{topSongs?.results?.trackmatches?.track.length ?
topSongs.results.trackmatches.track.map((datumn) => {
return (
<div key={datumn.name}>
<h1 className='heading'>{datumn.name}</h1>
</div>
);
}) : (
<div className="inner-input">
<div className="container">
<h1 className="search" >Search for song:
</h1>
<input ref={inputEl} size="50" type="text"/>
<button class="btn btn-primary" onClick={fetchData} >Fetch</button>
</div>
</div>
)}
topSongs.results.trackmatches.track.map()
将在 topSongs?.results?.trackmatches?.track.length > 0
时呈现,否则 <div className="inner-input">..</div>
将呈现。