javascript - 将项目添加到 ReactJs 状态的数组中,并设置超时以进行 self 删除

标签 javascript reactjs

我创建了一个 MessageList 组件,用于显示来自服务器的返回消息,我希望这些消息仅在该状态中存在大约 5 秒左右,我已经按照我想要的方式添加和显示了它,但是我我一生都无法思考如何超时从其父数组中删除特定项目。Vanilla JS 答案可以解决从数组中超时删除 self 的问题。

var MainApp = React.createClass({
     AddComment: function() {
        //do some stuff 
        this.showMessage({
            alerttype: "success", 
            title: "Success!", 
            message: "Comment saved to the database."})
        }
    },
    showMessage: function(message) {
        //how to I push this message onto messages for 5 seconds?
    },
    getInitialState: function() {
        return {messages: []};
    },
    render: function () {
        return (
            <div className="mainApp">
                <CommentForm messages={this.state.messages} />
            </div>
        );
    }
});

最佳答案

让我们尝试从您的 View 逻辑中抽象出这一点。我们可以创建一个数据类型来负责存储带时间戳的消息。我们还可以添加一些辅助函数来删除旧项目并检索当前项目列表。然后您需要做的就是偶尔清除所有旧项目:

function ExpiringMessages(expirationTime) {
    this.messages = [];
}

ExpiringMessages.prototype.add = function (data) {
    this.messages.push({ timestamp: Date.now(), data });
}

ExpiringMessages.prototype.removeOlderThan = function (delta) {
    this.messages = this.messages.filter(m => (Date.now() -  m.time) - delta > 0);
}

ExpiringMessages.prototype.current = function () {
    return this.messages.map(m => m.data);
}

这基本上只是存储一个带时间戳的数据列表,允许您随时清除任何项目。在您的组件中,您可以设置一个间隔(可能每秒左右)来删除超过 5 秒的项目。每次执行此操作时,您都会将当前消息列表重置为 messages.current()

关于javascript - 将项目添加到 ReactJs 状态的数组中,并设置超时以进行 self 删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36087244/

相关文章:

javascript - FlowType 使用什么语言来定义接口(interface)?

javascript - 使用 Ramda 创建对象

javascript - 将 Canvas 的一小部分转换为 png

javascript - 如何在 React 功能组件中限制 onWheel 事件

javascript - 在 'Switch' 中找不到导出 'Switch'(导入为 'react-router-dom')

javascript - 如何用Reactjs&Redux实现fifo队列

javascript - 使用 HTML 输入 'name' 属性生成对象

php - 将 mySQL 数据库信息放入 JavaScript 数组

javascript - 未捕获的语法错误 : Unexpected token < in react-router with trailing slash in the end

reactjs - 如何验证 redux 表单中的单选按钮值?