如何使用 ractive 为数组中的新 DOM 条目设置样式?

How do I style new DOM entries in an array using ractive?

我有一个修改数组的 Ractive 实例。当数组中出现新值时,我希望突出显示相应的元素。我目前通过在新创建的元素上设置一些样式来做到这一点。 这里是 jsfiddle

var ractive = new Ractive({
  el: 'main',
  template: `
    <h1>Hello {{name}}!</h1>

    {{ #things:index }}
      <p>{{ things[index] }}</p>  
    {{ /things }}

  `,
  data: function(){
    return {
      things: [
        'banana',
        'carrot'
      ]
    }
  },
  oncomplete: function(){
    var component = this;

    setTimeout(function(){
      component.set('things', ['apple', 'banana', 'carrot'])
    }, 5 * 1000)
  }
});

唯一的问题是,由于 ractive 重复使用元素,样式出现在错误的元素上。

您会看到当 'banana', 'carrot'] 更改为 ['apple', 'banana', 'carrot'] 时,突出显示 'carrot' 元素,而不是与新值对应的 'apple' 元素。

在数组中设置新条目样式的最佳方式是什么?

你应该使用 splice 方法

 component.splice('things', 0, 0, 'apple');   // Add at zero index   
 component.splice('things', 1, 0, 'apple');   // Add at first index  

而不是再次设置整个数组。这相当于 Array.splice 方法。

整个代码如下所示。

var ractive = new Ractive({
  el: 'main',
  template: `
    <h1>Hello {{name}}!</h1>

    {{ #things:index }}
        <p>{{ things[index] }}</p>  
    {{ /things }}

  `,
  data: function(){
    return {
        things: [
        'banana',
        'carrot'
      ]
    }
  },
  oncomplete: function(){
    var component = this;

    setTimeout(function(){    
        component.splice('things', 0, 0, 'apple');
    }, 5 * 1000)
  }
});

在此处阅读更多相关信息。
https://ractive.js.org/api/#ractivesplice

使用 recentlyAddedThings 缓存来添加已添加项目的缓存。这是一个 working jsfiddle:

var ractive = new Ractive({
  el: 'main',
  template: `

    {{ #things:index }}

      <p class="{{ #if recentlyAddedThings.includes(things[index]) }}new{{ /if }}">
        {{ things[index] }}
      </p>  
    {{ /things }}

  `,
  data: function(){
    return {
      things: [
        'banana',
        'carrot'
      ],
      recentlyAddedThings: [

      ]
    }
  },
  oncomplete: function(){
    var component = this;

    var addThing = function(newThing){
      var things = component.get('things')
      var newThing = newThing
      things.push(newThing)
      component.set('things', things.sort())
      component.push('recentlyAddedThings', newThing)
    }

    setTimeout(function(){
      addThing('apple') 
    }, 2 * 1000)
    setTimeout(function(){
      addThing('avocado') 
    }, 3 * 1000)
    setTimeout(function(){
      addThing('cheese')  
    }, 4 * 1000)
  }
});