gpt4 book ai didi

javascript - 在渲染子元素之前加载数据 React

转载 作者:行者123 更新时间:2023-12-01 01:30:00 25 4
gpt4 key购买 nike

我正在尝试根据外部 JSON 数据生成选择器选项列表。这里的代码大部分都很好,只是在加载数据之前调用了部分代码,导致没有附加子项。我确信有一种方法可以实现这一点,但我不确定这种方法适合我的特定情况。

代码如下:

class PokedexSelector extends Component {
constructor(props) {
super(props);

this.state = {value: "National", pokedexes: []};

this.generatePokedexList();

this.handleChange = this.handleChange.bind(this);
this.generatePokedexList = this.generatePokedexList.bind(this);
this.pokedexList = this.pokedexList.bind(this);
}

handleChange(event) {
this.setState({value: event.target.value});
}

generatePokedexList() {
const pokedexes = [];
fetch("https://pokeapi.co/api/v2/pokedex/")
.then(response => response.json())
.then(myJson => {
let results = myJson["results"];
results.forEach(function(pokedex) {
let pokedexName = pokedex["name"];
let pokedexLink = "https://pokeapi.co/api/v2/pokedex/" + pokedexName;
let pokedexDisplayName = capitalize(pokedexName.replace('-',' '));
pokedexes.push(
{
name: pokedexName,
displayName: pokedexDisplayName,
link: pokedexLink
}
);
});
this.state.pokedexes = pokedexes;
console.log(this.state.pokedexes)
})
}

pokedexList() {
if (this.state.pokedexes.length > 0) {
console.log("listing")
return (
this.state.pokedexes.map(pokedex => (
<option>{pokedex.displayName}</option>
))
)
}
}

render() {
return (
<select id="pokedex-selector" value={this.state.value} onChange={this.handleChange}>
{this.pokedexList()}
</select>
)
}

}

export default PokedexSelector;

我尝试使用componentDidMount()如下所示,但我不确定在这种情况下如何专门针对一个组件进行更改(<select> 元素)。

componentDidMount() {
{this.pokedexList()}
}

有什么想法吗?谢谢!

最佳答案

您应该在触发 render 方法之前进行提取调用(最好是在 componentDidMount 中),并将响应存储在状态中。仅当 stateprops 发生变化时,组件才会重新渲染。

state 应通过 this.setState() 方法更新,不应使用 this.state.

就您而言,由于您尝试使用 this.state 直接改变状态,因此组件将不会重新渲染。您应该将其替换为 this.setState()

试试这个代码

class PokedexSelector extends Component {
constructor(props) {
super(props);

this.state = {value: "National", pokedexes: []};

this.handleChange = this.handleChange.bind(this);
this.generatePokedexList = this.generatePokedexList.bind(this);
this.pokedexList = this.pokedexList.bind(this);
}

componentDidMount() {
this.generatePokedexList();
}

handleChange(event) {
this.setState({value: event.target.value});
}

generatePokedexList() {
const pokedexes = [];
fetch("https://pokeapi.co/api/v2/pokedex/")
.then(response => response.json())
.then(myJson => {
let results = myJson["results"];
results.forEach(function(pokedex) {
let pokedexName = pokedex["name"];
let pokedexLink = "https://pokeapi.co/api/v2/pokedex/" + pokedexName;
let pokedexDisplayName = capitalize(pokedexName.replace('-',' '));
pokedexes.push(
{
name: pokedexName,
displayName: pokedexDisplayName,
link: pokedexLink
}
);
});
this.setState({pokedexes: pokedexes}); // use setState()
})
}

pokedexList() {
if (this.state.pokedexes.length > 0) {
console.log("listing")
return (
this.state.pokedexes.map(pokedex => (
<option>{pokedex.displayName}</option>
))
)
}
}

render() {
return (
<select id="pokedex-selector" value={this.state.value} onChange={this.handleChange}>
{this.pokedexList()}
</select>
)
}

}

export default PokedexSelector;

关于javascript - 在渲染子元素之前加载数据 React,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53366354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com