reactjs - 如何停止状态变量被reactjs中的先前值覆盖?
问题描述
我将从服务器获取的数据存储在状态变量中。如果我打开具有大数据显示正确信息的项目,它工作正常。但是,在没有可用数据的情况下打开项目后,它会显示以前的项目值。
考虑情景,
item 1 没有数据, item2 有大数据。open item1 不显示任何数据。现在打开的 item2 显示它的数据(很大) 现在打开的 item1 显示 item2 的数据,而不是不显示任何数据。
不知道我哪里出错了。
下面是代码,
class ItemDetails extends React.PureComponent {
constructor(props) {
super(props);
this.state = {
item_info: null,
item_info_loading: false,
};
componentDidMount() {
this.unmount = new Promise((resolve) => { this.on_unmount =
resolve;});
this.load_item_info();
this.unlisten_path_change = this.props.history.listen((location) =>
{this.handle_path_change(location.pathname);});
}
componentDidUpdate(prevProps, prevState) {
if (prevProps.item_id !== this.props.item_id) {
this.setState({item_info: null}, this.load_item_info);}
}
componentWillReceiveProps(nextProps, nextState) {
if(nextProps.item_id !== this.props.item_id) {
this.setState({item_info: null}, this.load_item_info);
}}
componentWillUnmount() {
this.on_unmount();
this.unlisten_path_change();
}
load_item_info = () => {
const file_name = 'item_info.json';
this.setState({item_info_loading: true});
client.get_item_file(this.props.model_id, file_name, 'json',
this.unmount).finally(() => this.setState({item_info_loading: false}))
.then((request) => {
this.setState({item_info: request.response})
})};
render () {
<ItemInfoTool
item_info={state.item_info}
item_info_loading={this.state.item_info_loading}/>}}
export default class ItemInfoTool extends React.Component {
state = {
open_item_data: null,};
componentDidMount() {
this.set_open_item_data();
}
componentDidUpdate(prevProps) {
if (prevProps.selected_id !== this.props.selected_id) {
this.set_open_item_data();
}
}
set_open_item_data = () => {
if (!this.props.item_info) {
return;
}
if (this.props.selected_id === this.empty_id) {
this.setState({open_item_data: null});
return;
}
let open_item_data = {
info: [],
values: [],
};
const item_info = this.props.item_info;
for (let i=0, ii=item_info.length; i < ii; i++) {
if (item_info[i].somekey.includes(this.props.selected_id)) {
const info = item_info[i].info;
const values = object_info[i].values;
open_item_data = {
info: typeof info === 'string' ? info.split('\r\n') : [],
values: values ? values : [],
};
break;
}
}
this.setState({open_item_data:open_item_data);
};}
export function get_item_file(item_id, file_name, response_type,
on_progress, cancel) {
const local_override_defined = item_files[item_id] &&
item_files[item_id][file_name];
if (local_override_defined) {
const file = item_files[item_id][file_name];
const reader = new FileReader();
return new Promise(resolve => {
if (response_type === 'blob') {
resolve({response: file});
} else {
reader.onload = () => {
if (response_type === 'json') {
resolve({response: JSON.parse(reader.result)});
} else {
resolve({response: reader.result});
}};
reader.readAsText(file);}});}
return new Promise((resolve, reject) => {
item_file_get_url(item_id, file_name).then(({response}) => {
const request = new XMLHttpRequest();
request.addEventListener('progress', on_progress);
request.open('GET', response.url);
request.responseType = response_type;
send_request(request, undefined, cancel,
response.url).then(resolve).catch(reject);})});}
有人可以帮我解决它。谢谢。我怀疑是否发生了一些异步请求。
解决方案
关闭操作时需要清除数据
推荐阅读
- java - 如何设置连接超时?
- java - 点击后从 RecyclerView 获取对象
- python - 为用户创建设置选项的优雅解决方案
- three.js - 如何将gltf素材更改为卡通素材?
- slack-api - 继续为新的松弛应用程序获取 users.info 的 invalid_auth(甚至从清单中复制!)
- javascript - 如何使用条件返回不同的代码块
- java - --rerun-tasks 和 --refresh-dependencies 之间的区别
- python - 当我将“django_social_share”添加到我安装的应用程序时,我得到“内部服务器错误”
- python-3.x - python将Dataframe列文本传输到枕头图像
- go - 返回一个空字符串会导致 GO 出现恐慌