gpt4 book ai didi

javascript - 使用 getDerivedStateFromProps 获取 API 数据导致组件渲染多次

转载 作者:行者123 更新时间:2023-11-30 19:47:54 25 4
gpt4 key购买 nike

我正在尝试从 API 调用中获取一些数据。我正在使用 getDerivedStateFromPropscomponentDidMount、shouldComponentUpdateandcomponentDidUpdate`。

我这样做是因为我需要 userToken 来自 userToken: store.signinScreen.userToken 在调用函数 GetPassengersData 之前 需要 userToken 从 API 获取数据。

这是整个组件:

// imports

class HomeScreen extends Component {
static navigationOptions = {
header: null,
};

state = {
error: false,
};

static getDerivedStateFromProps(props, state) {
if (props.userToken !== state.userToken) {
return { userToken: props.userToken };
}
return null;
}

componentDidMount() {
this.GetPassengersData();
}

shouldComponentUpdate(prevProps, state) {
return this.props !== prevProps;
}

componentDidUpdate(prevProps, prevState) {
const { error } = this.state;
if (!error) {
this.GetPassengersData();
}
}

GetPassengersData = async () => {
const { passengersDataActionHandler, userToken } = this.props;
if (userToken && userToken !== null) {
try {
const response = await fetch(
'http://myAPI/public/api/getPassengers',
{
method: 'POST',
headers: {
Authorization: `Bearer ${userToken}`,
Accept: 'application/json',
'Content-Type': 'application/json',
},
},
);
const responseJson = await response.json();
if (has(responseJson, 'error')) {
this.setState({ error: true });
Alert.alert('Error', 'Please check your credentials.');
} else {
passengersDataActionHandler(responseJson.success.data);
}
} catch (error) {
this.setState({ error: true });
Alert.alert(
'Error',
'There was an error with your request, please try again later.',
);
}
}
};

render() {
return <TabView style={styles.container} />;
}
}

HomeScreen.defaultProps = {
userToken: null,
};

HomeScreen.propTypes = {
navigation: PropTypes.shape({}).isRequired,
passengersDataActionHandler: PropTypes.func.isRequired,
userToken: PropTypes.oneOfType([PropTypes.string]),
};

export default compose(
connect(
store => ({
userToken: store.signinScreen.userToken,
passengersData: store.homeScreen.passengersData,
}),
dispatch => ({
passengersDataActionHandler: token => {
dispatch(passengersDataAction(token));
},
}),
),
)(HomeScreen);

使用此实现,组件会多次呈现,因此会破坏应用程序。

我做错了什么?

最佳答案

首先,您不需要在状态中存储 userToken,因为您没有在本地修改它,因此您不需要 getDerivedStateFromProps

其次,您需要仅在 prop 更改时触发 componentDidUpdate 中的 API 调用,而不是在没有检查的情况下直接触发,否则,API 中的 setState 成功或错误将导致组件重新渲染调用 componentDidUpdate 再次调用 API,导致无限循环

第三,shouldComponentUpdate 比较 props 的检查并不完全正确,因为 nestedObjects props 会给出错误的否定结果,而且如果你为 props 编写深度相等性检查,组件将不会在状态改变时重新渲染。

// imports

class HomeScreen extends Component {
static navigationOptions = {
header: null,
};

state = {
error: false,
};

componentDidMount() {
this.GetPassengersData();
}

componentDidUpdate(prevProps, prevState) {
if (prevProps.userToken !== this.props.userToken) {
this.GetPassengersData();
}
}

GetPassengersData = async () => {
const { passengersDataActionHandler, userToken } = this.props;
if (userToken && userToken !== null) {
try {
const response = await fetch(
'http://myAPI/public/api/getPassengers',
{
method: 'POST',
headers: {
Authorization: `Bearer ${userToken}`,
Accept: 'application/json',
'Content-Type': 'application/json',
},
},
);
const responseJson = await response.json();
if (has(responseJson, 'error')) {
this.setState({ error: true });
Alert.alert('Error', 'Please check your credentials.');
} else {
passengersDataActionHandler(responseJson.success.data);
}
} catch (error) {
this.setState({ error: true });
Alert.alert(
'Error',
'There was an error with your request, please try again later.',
);
}
}
};

render() {
return <TabView style={styles.container} />;
}
}

HomeScreen.defaultProps = {
userToken: null,
};

HomeScreen.propTypes = {
navigation: PropTypes.shape({}).isRequired,
passengersDataActionHandler: PropTypes.func.isRequired,
userToken: PropTypes.oneOfType([PropTypes.string]),
};

export default compose(
connect(
store => ({
userToken: store.signinScreen.userToken,
passengersData: store.homeScreen.passengersData,
}),
dispatch => ({
passengersDataActionHandler: token => {
dispatch(passengersDataAction(token));
},
}),
),
)(HomeScreen);

关于javascript - 使用 getDerivedStateFromProps 获取 API 数据导致组件渲染多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54778892/

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