General Update Pattern

導(dǎo)航

這篇文章由四部分組成.

  • 第一部分簡(jiǎn)單說(shuō)明Enter/Update/Exit的關(guān)系,Enter進(jìn)來(lái)的字母,顯示為綠色; Update的字母,顯示為深灰色,而剩余的字母直接刪除.由于沒(méi)有key Function的存在,故無(wú)法將data和element關(guān)聯(lián)起來(lái).故更新的數(shù)據(jù)總在最后.
  • 第二部分簡(jiǎn)單說(shuō)明key Function的作用.由于存在key Function,所以字母會(huì)在它原始存在的位置上進(jìn)行更新.
  • 第三部分引入duration, 更加形象化的展示數(shù)據(jù)的Enter/Update/Exit.
  • 第四部分為自己編寫(xiě)的一個(gè)小頁(yè)面. 點(diǎn)擊鍵盤(pán)上的字符az,則02秒內(nèi)字符上升消失.2~4秒內(nèi)字符下降出現(xiàn).

第一部分

主要代碼如下:

    const update = (data) => {
      const text = g.selectAll('text').data(data);
      text.attr('class', 'update');

      text.enter().append('text')
        .attr('class', 'enter')
        .attr('x', (d, i) => i * 32)
        .attr('dy', '.35em')
        .merge(text)
        .text(d => d);
      
      text.exit().remove();
    }
  • 預(yù)先將所有的text設(shè)置為"class=update".
  • 將enter進(jìn)來(lái)的字符設(shè)置為"class=enter".
  • 使用merge操作將enter和update結(jié)合起來(lái).
  • 使用exit.remove刪除不在data中的元素.

第二部分

主要代碼如下:

    const update = (data) => {
      const text = g.selectAll('text').data(data, d => d);
      text.attr('class', 'update');

      text.enter().append('text')
        .attr('class', 'enter')
        .attr('dy', '.35em')
        .merge(text)
        .attr('x', (d, i) => i * 32)
        .text(d => d);

      text.exit().remove();
    }

相比于第一部分,這里做了兩處修改:

  • 使用key Function,則可將data和element進(jìn)行比較.
  • merge后,需要手動(dòng)設(shè)置x的位置,保證字符在正確的位置顯示.

第三部分

主要代碼如下:

    const update = (data) => {
      const text = g.selectAll('text').data(data, d => d);
      const t = d3.transition().duration(750);

      text.exit()
        .attr('class', 'exit')
        .transition(t)
        .attr('y', 60)
        .style('fill-opacity', 1e-6)
        .remove();

      text.attr('class', 'update')
        .attr('y', 0)
        .style('fill-opacity', 1)
        .transition(t)
        .attr('x', (d, i) => i * 32);

      text.enter().append('text')
        .attr('class', 'enter')
        .attr('y', -60)
        .attr('x', (d, i) => i * 32)
        .style('fill-opacity', 1e-6)
        .text(d => d)
        .transition(t)
        .attr('y', 0)
        .style('fill-opacity', 1);
    }
  • 引入轉(zhuǎn)換延時(shí)機(jī)制: duration
  • 在字符exit.remove操作情況下,通過(guò)duration,將字符的y位置從0下降到60,并且透明度緩慢設(shè)置為1e-6.
  • 在字符更新情況下,將透明度設(shè)置為1, 并且進(jìn)行x位置的重新調(diào)整.
  • 在字符新增情況下, 將字符的y位置從-60下降到0, 并且透明度從0緩慢設(shè)置為1.

第四部分

設(shè)置文本位置代碼:

text.enter().append('text')
      .attr('fill', 'green').attr('dy', '.35em')
      .style('font', 'bold 48px monospace')
      .attr('y', 0)
      .attr('x', (d, i) => i * 32)
      .text(d => d)
      .attr('class', d => `key-$u0z1t8os`)

監(jiān)聽(tīng)鍵盤(pán)事件代碼:

  keyDown = (e) => {
    const alphabet = this.state.alphabet;
    const key = alphabet[e.keyCode - 65];
    const t = d3.transition().duration(2000);
    d3.select(`.key-${key}`)
      .transition(t)
      .attr('y', -250)
      .style('fill-opacity', 1e-6)
      .transition(t)
      .attr('y', 0)
      .style('fill-opacity', 1);
  }

源碼位置

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • d3 (核心部分)選擇集d3.select - 從當(dāng)前文檔中選擇一系列元素。d3.selectAll - 從當(dāng)前文...
    謝大見(jiàn)閱讀 3,574評(píng)論 1 4
  • 對(duì)集合的操作 關(guān)于d3.attr 一個(gè)可以處理很多情況的函數(shù),當(dāng)只傳入一個(gè)參數(shù)時(shí),如果是string,則返回該屬性...
    陳堅(jiān)生閱讀 2,761評(píng)論 0 2
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,527評(píng)論 19 139
  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 14,237評(píng)論 0 38
  • 生活像是一個(gè)鏈索,一環(huán)套一環(huán),沒(méi)有與xxxx討論xx的問(wèn)題,也就不會(huì)情緒糟糕,好幾次了,還是沒(méi)有能夠很好的處理面對(duì)...
    柏柏蓉閱讀 391評(píng)論 4 2

友情鏈接更多精彩內(nèi)容