1

我使用 react 已经有一段时间了,想试试 Mithril.js。

浏览了文档和示例并喜欢我所看到的,所以我说我应该动手并开始编码!

我有一个简单的 API 调用,它接收 JSON 数据,然后输出ul包含所有项目的列表。我已经为动画集成了 GSAP TweenMax,我想要实现的非常简单 - 我在加载时淡入所有内容,然后onclick我想淡入淡出一个元素并将其从 DOM / 数据中删除。

似乎正在发生的事情是元素正在淡出,整个ul列表正在重新渲染,并且该元素保留在 DOM 中,不透明度为 0:

var Item = {
    list: function() {
        return m.request({method: 'GET', url: '/api/items'});
    }
}

var dm = {
    controller: function(data) {                
        var items = Item.list();
        return {
            items: items,
            remove: function(item) {                
                items().data.splice(items().data.indexOf(item), 1);
            }
        }
    },

    view: function(ctrl) {      
        return m('ul', [
            ctrl.items().data.map(function(item, id){
                return m('li',{
                    key: id,
                    config: fadesIn,
                    onclick: fadeOut(ctrl.remove.bind(this, item))
                }, item.title);
            })
        ]);
    }
}

var fadesIn = function(element){
    var tl = new TimelineMax();
    tl.from(element, .5, {opacity: 0});
}

var fadeOut = function(callback) {
    return function(e) {
        m.redraw.strategy('none');
        TweenMax.to(e.target, .5, {opacity: 0, onComplete: function() {
            m.startComputation();           
            callback();         
            m.endComputation();
        }});
    }
}

m.mount(document.getElementById('test'), dm);

我很新……昨天才开始阅读。

4

1 回答 1

1

让动画库与 Mithril 一起工作可能很棘手。当库操作 DOM 状态时,与 Mithril 状态的同步可能会被破坏。

幸运的是,情况并非如此:您缺少的是isInitializedconfig 函数的参数,该参数仅在第一次调用时为 false。对此的测试使淡入只发生一次:

var fadesIn = function(element, isInit){
    if(isInit) return;
    var tl = new TimelineMax();
    tl.from(element, .5, {opacity: 0});
}

在这个简单的例子中,重绘也可以简化,我做了一个工作示例:

http://jsfiddle.net/ciscoheat/dkyc0ryc/

由于没有 DOM 操作,因此调用足以从 DOM 中删除 div,但当事情变得更复杂时m.redraw,您可能正确使用。start/endComputation我什至会m.startComputation超越TweenMax.to调用以使其更加安全,但如果同时发生许多其他事情,则可能会阻止其他重绘。你必须找到一个平衡点。:)

m.redraw.strategy我认为在任何情况下都不需要调用 to 。它主要用于您根本不希望发生任何事情(同步),但是异步动画正在启动,因此它不会产生任何影响。

编辑:发现另一个问题,key不能设置为地图功能的索引,那么当一个项目被删除时它会改变,搞砸重绘。我已经更新了小提琴以item.title用作键。

于 2015-07-28T12:00:19.363 回答