当下拉值更改时,setState 未正确设置状态
setState does not set the state properly, when dropdown values changes
我遇到了这种情况,我有一个下拉菜单,可以提取用户的帐户,然后根据用户的选择更改页面内容。我正在尝试一种如下所示的方法,似乎 setState 没有被正确调用或者调用顺序可能是错误的。没有真正理解错误。更改下拉值不会更新内容。
不胜感激。
import * as React from 'react';
import Select from 'semantic-ui-react/dist/commonjs/addons/Select';
interface IState{
accountDetails[], // stores all details w.r.t an account
userAccounts: [], // stores all accounts w.r.t a user
selectedAccount : string, // selected account from the dropdown
[x: string] : any,
}
export default class App extends React.Component<{},IState> {
constructor(props:any){
super(props);
this.state = {
accountDetails: [],
userAccounts: [],
selectedAccount: ''
}
}
dropdownChange = (event: React.SyntheticEvent<HTMLElement>, data:any) => {
this.setState(prevState => ({
selectedAccount: data.value
}), () => {});
}
async componentDidMount()
{
await this.fetchUserAccounts();
}
fetchUserAccounts = async() => {
//fetch API call for getting all user accounts by passing a user ID
// I am able to get the data
fetch('/api/fetch/accounts'
.then(response => response.json())
.then(data => this.setState({ userAccounts: data}));
this.fetchAccountDetails();
}
fetchAccountDetails = async() =>
{
let URL = "/api/fetch/account?accountId=" +this.state.selectedAccount;
fetch('URL'
.then(response => response.json())
.then(data => this.setState({ accountDetails: data}));
}
render() {
return(
<div>
<Select
options={this.state.userAccounts}
name="selectedAccount"
value={this.state.selectedAccount}
onChange={this.dropdownChange}
/>
// component to display the details
<DetailComponent accounts={this.state.accountDetails} />
</div>
)
}
}
您需要在更改状态后立即调用 fetchAccountDetails
,以便使用下拉列表已更改的最新状态调用该函数:
dropdownChange = (event: React.SyntheticEvent<HTMLElement>, data:any) => {
this.setState(prevState => ({
selectedAccount: data.value
}), () => { this.fetchAccountDetails() });
}
setState
函数是异步的,这意味着您在更新状态时需要特别小心,并希望同步使用状态中的更新值。出于这个原因,setState
函数有第二个参数,它允许您指定在状态实际更新时执行的回调。这是您需要调用 fetchAccountDetails
函数的地方。
您可以在 React 文档 here 中找到 setState
回调参数。
但是无论哪种方式,您都无法编译。 (a) 你的界面应该以分号而不是逗号结束每个成员声明。 (b) 您在调用 fetch
的每一行中都缺少一个“)”。 (c) 在 fetchAccountDetails
函数中声明了 URL
变量,但随后将字符串 'URL' 传递给 fetch
函数,而不是变量。
这是一个工作代码沙箱,显示了对您的问题的修复和语法修复。我已经注释掉了对 fetch
函数的调用,因为它们无论如何都会失败。
我遇到了这种情况,我有一个下拉菜单,可以提取用户的帐户,然后根据用户的选择更改页面内容。我正在尝试一种如下所示的方法,似乎 setState 没有被正确调用或者调用顺序可能是错误的。没有真正理解错误。更改下拉值不会更新内容。
不胜感激。
import * as React from 'react';
import Select from 'semantic-ui-react/dist/commonjs/addons/Select';
interface IState{
accountDetails[], // stores all details w.r.t an account
userAccounts: [], // stores all accounts w.r.t a user
selectedAccount : string, // selected account from the dropdown
[x: string] : any,
}
export default class App extends React.Component<{},IState> {
constructor(props:any){
super(props);
this.state = {
accountDetails: [],
userAccounts: [],
selectedAccount: ''
}
}
dropdownChange = (event: React.SyntheticEvent<HTMLElement>, data:any) => {
this.setState(prevState => ({
selectedAccount: data.value
}), () => {});
}
async componentDidMount()
{
await this.fetchUserAccounts();
}
fetchUserAccounts = async() => {
//fetch API call for getting all user accounts by passing a user ID
// I am able to get the data
fetch('/api/fetch/accounts'
.then(response => response.json())
.then(data => this.setState({ userAccounts: data}));
this.fetchAccountDetails();
}
fetchAccountDetails = async() =>
{
let URL = "/api/fetch/account?accountId=" +this.state.selectedAccount;
fetch('URL'
.then(response => response.json())
.then(data => this.setState({ accountDetails: data}));
}
render() {
return(
<div>
<Select
options={this.state.userAccounts}
name="selectedAccount"
value={this.state.selectedAccount}
onChange={this.dropdownChange}
/>
// component to display the details
<DetailComponent accounts={this.state.accountDetails} />
</div>
)
}
}
您需要在更改状态后立即调用 fetchAccountDetails
,以便使用下拉列表已更改的最新状态调用该函数:
dropdownChange = (event: React.SyntheticEvent<HTMLElement>, data:any) => {
this.setState(prevState => ({
selectedAccount: data.value
}), () => { this.fetchAccountDetails() });
}
setState
函数是异步的,这意味着您在更新状态时需要特别小心,并希望同步使用状态中的更新值。出于这个原因,setState
函数有第二个参数,它允许您指定在状态实际更新时执行的回调。这是您需要调用 fetchAccountDetails
函数的地方。
您可以在 React 文档 here 中找到 setState
回调参数。
但是无论哪种方式,您都无法编译。 (a) 你的界面应该以分号而不是逗号结束每个成员声明。 (b) 您在调用 fetch
的每一行中都缺少一个“)”。 (c) 在 fetchAccountDetails
函数中声明了 URL
变量,但随后将字符串 'URL' 传递给 fetch
函数,而不是变量。
这是一个工作代码沙箱,显示了对您的问题的修复和语法修复。我已经注释掉了对 fetch
函数的调用,因为它们无论如何都会失败。