gpt4 book ai didi

javascript - ComponentwillMount 被调用了两次

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:13:30 26 4
gpt4 key购买 nike

我的 componentWillMount() 每次切换路由时都会被调用。

有没有其他方法可以处理商店状态的变化?

当我第一次使用这两个功能时没问题,但是当我切换路线并返回并尝试再次使用它们时,我收到此消息

warning.js:45 警告:setState(...):只能更新已安装或安装的组件。这通常意味着您在未安装的组件上调用了 setState() 。这是一个空操作。请检查未定义组件的代码。

InventoryList.js

import React from "react";
import InventoryItem from "../components/InventoryItem";
import InventoryItemStore from "../stores/InventoryItemStore";
import { Link } from "react-router";

export default class InventoryList extends React.Component {
constructor() {
super();
this.state = {
items: InventoryItemStore.getAll(),
}
}

componentWillMount() {
InventoryItemStore.on("change", () => {
this.setState({
items: InventoryItemStore.getAll()
});
});
}

render(...);
}

InventoryStore.js

import { EventEmitter } from "events";

import dispatcher from "../dispatcher";

class InventoryItemStore extends EventEmitter {

constructor() {
super()
this.items = [
{
id: 1,
title: "first item",
stockQuantity: 10
},
{
id: 2,
title: "second item",
stockQuantity: 5
}
];
}

getAll() {
return this.items;
}

// Adds new item to the inventory store
addItem( title, stockQuantity ) {
const id = Date.now();
this.items.push({
id,
title, // We don't have to do title: title because of ES6... Thx ES6
stockQuantity
});

this.emit("change");
}


/**
* Lower the stock quantity of certain item
* @param {integer} id
* @param {integer} stockQuantity
*/
lowerQuantity( id, orderQuantity ) {

this.items.map((item) => {

if ( item.id == id ) {
item.stockQuantity = item.stockQuantity - orderQuantity;
}

});

this.emit("change");

}


handleActions( action ) {

switch( action.type ) {
case "ADD_ITEM": {
const { title, stockQuantity } = action;
this.addItem( title, stockQuantity );
}
case "LOWER_QUANTITY": {
const { id, orderQuantity } = action;
this.lowerQuantity( id, orderQuantity );
}
}

}

}

const inventoryItemStore = new InventoryItemStore;

dispatcher.register(inventoryItemStore.handleActions.bind(inventoryItemStore));

export default inventoryItemStore;

最佳答案

每次更改路由时,您的组件都会被卸载,当您改回路由时,会安装一个新组件。

由于您正在使用 InventoryItemStore.on 注册一个事件处理程序,但从未注销它,因此您剩下两个监听 change 的组件和一个未安装的组件抛出错误。

使用 componentWillUnmount 取消注册您的组件,这样它就不会像幽灵一样徘徊,并在您返回时困扰您。

参见 React lifecycle获取更多生命周期 Hook 。

关于javascript - ComponentwillMount 被调用了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38814764/

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