防止在 Mithril 中重绘

Preventing redraw in Mithril

我为秘银制作了一个简单的 FlashMessage 模型,我用它来显示表单的反馈(例如,成功保存):

// the model
var FlashMessage = {
    messages: [],

    clear: function()
    {
        FlashMessage.messages = [];
    },

    add: function(level, message)
    {
        var mess = {level:level, message: message};
        FlashMessage.messages.push(mess);
    },

    get: function()
    {
        var messages = FlashMessage.messages;
        FlashMessage.clear();
        return messages;
    }
};

module.exports = FlashMessage


// the use
m('section.flash-messages', FlashMessage.get().map(function(mess){return m('.message-' + mess.level, mess.message);}))

保存数据时,布局会显示闪现消息,这很好,但是当我在表单上再次输入数据时,闪现消息 div 似乎被重绘了,因为get 方法擦除数据,闪现消息消失。据我所知,这是因为当数据发生变化时秘银会重新绘制,但我该如何防止这种情况发生?

防止重绘很简单,正如我将向您展示的那样,但在您的情况下,这不是一个好的解决方案。相反,你应该改变你对状态的看法。

防止重绘

只需将函数 onbeforeupdate 添加到您的组件,如果您不想更新,则 return false。

var Component = {
    onbeforeupdate: function (vnode, old) {
        var shouldUpdate = ???;

        return shouldUpdate;
    }
    ...
};

思考状态

您的应用程序状态应始终反映在 UI 中。如果状态改变, 显示的内容也应该改变。这是 React 和所有的核心原则 它启发了图书馆,其中包括秘银。这样做就可以 易于编写有状态应用程序,这就是这些库受欢迎的原因。

以任何其他方式进行操作都是(非常)糟糕的做法。 你将很难让它正常工作, 不仅因为 [Mithril] 旨在确保状态更新始终反映在 UI 中, 但也因为很难推理。 (另外,您的代码对其他人没有意义。)

你的情况

如果你想让消息留在屏幕上,它们也应该保持在状态。

只有当您希望消息消失(在屏幕上)时,您才应该将它们从状态中移除。

请 post 一个新问题,解释你想要实现的目标,我会告诉你如何去做:)