d3.v4神器,merge()函數(shù)實現(xiàn)數(shù)據(jù)更新

簡單介紹下D3熊户,D3.js是一個開源的js庫萍膛,全名是Data-Driven Documents
,因為三個字母開頭都是D嚷堡,所以簡稱D3蝗罗,主要是對DOM元素的數(shù)據(jù)驅(qū)動操作艇棕。下面看看第一部分,簡單介紹下幾個常用的基本概念串塑。
1.Selections:
在D3中沼琉,可以選擇DOM元素,進而對他們進行操作桩匪,例如更改樣式打瘪,修改其屬性,執(zhí)行數(shù)據(jù)連接或插入/刪除元素傻昙。
兩個方法闺骚,
.select() 選擇單一的DOM元素、
.selectAll()選擇所有符合條件的DOM元素


對選擇的元素進行設(shè)置.png

2.關(guān)于綁定數(shù)據(jù)妆档,給定一組數(shù)據(jù)和前面說到的D3 Selections僻爽,我們可以將每個數(shù)組元素附加或“連接”到Selections的每個元素。同樣有兩個方法:

  • .datum()贾惦,綁定單一的數(shù)據(jù)到單一DOM元素上胸梆,基本不用。
  • .data()须板,支持綁定多個數(shù)據(jù)到多個DOM元素上碰镜,經(jīng)常使用。
    對于.data()函數(shù)逼纸,該函數(shù)返回一個對象洋措,對象里面包含updata selection以及enter()和exit()兩個函數(shù)。
  • updata selection顯示的是成功綁定數(shù)據(jù)的DOM元素杰刽,就是數(shù)據(jù)和DOM元素一一對應(yīng)的部分菠发。
  • .enter()函數(shù),返回 相比較dom element多出的那部分data;
  • .exit()函數(shù)贺嫂,返回 相比較data多出的那部分dom element,下面會說它們兩種情況的處理方式滓鸠。
    對于.data()函數(shù),該函數(shù)有兩個參數(shù)第喳,第一個參數(shù)是要綁定的數(shù)據(jù)集合糜俗,第二個參數(shù)是 key函數(shù),決定你要綁定數(shù)據(jù)的順序曲饱。
    .data(array1,function(d){return d.key;})
    至于第二個參數(shù)悠抹,什么情況下需要設(shè)置?
  • 設(shè)置key函數(shù)扩淀,就是規(guī)定了數(shù)組綁定DOM元素的順序楔敌,每個數(shù)據(jù)綁定的DOM元素固定,不論數(shù)組中的數(shù)據(jù)如何變化驻谆,綁定的DOM元素都不變卵凑,讓我們視覺上看起來很舒服庆聘,很有條理;
  • 不設(shè)置key函數(shù)勺卢,就是默認按照數(shù)組索引號綁定DOM元素伙判,適用于當(dāng)你的數(shù)據(jù)和DOM元素的順序相同時。當(dāng)你每次對數(shù)組中的數(shù)據(jù)進行動態(tài)更新時黑忱,會重新綁定所有的DOM元素宴抚,很容易出錯,達不到數(shù)據(jù)驅(qū)動DOM元素的目的杨何。
    例子:https://bl.ocks.org/BMPMS/21ca3ca9671e93b57bee831ff2e0e99d

3.關(guān)于.enter()/.exit()的處理酱塔。
前面說到了這兩個函數(shù)分別返回的是什么,

  • .enter()函數(shù)危虱,返回 相比較dom element多出的那部分data,我們使用D3的目的是為了把數(shù)據(jù)和DOM元素進行綁定唐全,以便于對數(shù)據(jù)的可視化埃跷,那現(xiàn)在數(shù)據(jù)比DOM元素多,此時應(yīng)該為多出來的數(shù)據(jù)創(chuàng)建DOM元素邮利,讓他們一一綁定弥雹。
    創(chuàng)建DOM元素有兩種方法,
    (1).append(),一般都是跟隨.enter().append('')延届,這樣就為多出來的數(shù)據(jù)分別創(chuàng)建DOM元素剪勿,此種方法是順序創(chuàng)建,默認在上一個DOM元素之后方庭。
    (2).insert(),同樣是跟隨.enter().insert('',''),兩個參數(shù)厕吉,第一個參數(shù)是要創(chuàng)建的DOM元素,第二個參數(shù)是你要插入到哪個DOM元素的前面械念。此種方法是指定了創(chuàng)建之后元素的位置头朱,其實應(yīng)該叫插入比較合適。

  • .exit()函數(shù)龄减,返回 相比較data多出的那部分dom element,很明顯项钮,既然這部分的數(shù)據(jù)已經(jīng)不存在了,那之前為之分配的DOM元素也沒有存在的必要了希停,直接把DOM元素移除烁巫。一般這么使用,.exit().remove()宠能。

4.為什么要使用merge(),merge()可以把 update和enter部分的操作合一亚隙,更加方便數(shù)據(jù)更新。
例子:https://www.codementor.io/milesbryony/d3-js-merge-in-depth-jm1pwhurw

  • d3js v3和v4中如何一次性獲取和處理enter以及update selections統(tǒng)一處理相應(yīng)邏輯?
    在d3js中棍潘,我們已經(jīng)很熟悉通過select.data().append().attr這種pattern來處理可視化恃鞋,我們也知道data操作符調(diào)用后返回update selection并且通過update selection也可以訪問exit和enter selection崖媚,這些selection加起來才是整個可視化的dom集合,在d3.v3版本中無須任何其他調(diào)用恤浪,只要你執(zhí)行了update.enter().append()之后enter selection自然就merge到update selection中去了畅哑,因此我們對update selection的任何操作都會影響到整個dom集。但是在v4中水由,這個特性消失了荠呐,取而代之的是必須使用merge調(diào)用。但是要注意的是通過merge獲取到整個dom集合后砂客,update段的數(shù)據(jù)更新(比如在.each函數(shù)中對每個數(shù)據(jù)dataum增加一個字段泥张,而在其他地方使用該數(shù)據(jù))在該場景下可能存在問題。
<html>

    <head>

        <script src="d3.v3.min.js"></script>       

    </head>

    <body>

        <p>p1</p>

        <p>p2</p>

        <p>p3</p>

    </body>

</html>

var update = d3.select("body").selectAll("p").data([4,5,6,7,8])

update.enter().append("p");

update.text(function(d,i){return d}) // V3下一次調(diào)用就可以對所有5個dom元素執(zhí)行操作

// 而v4下則必須使用merge函數(shù)調(diào)用鞠值,比如:

var update = d3.select("body").selectAll("p").data([4,5,6,7,8])

var enter = update.enter().append("p")

enter.merge(update).text(function(d){return d;}) // 一次調(diào)用text就可以對所有的selection設(shè)置對應(yīng)數(shù)據(jù)了
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末媚创,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子彤恶,更是在濱河造成了極大的恐慌钞钙,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件声离,死亡現(xiàn)場離奇詭異芒炼,居然都是意外死亡,警方通過查閱死者的電腦和手機术徊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門本刽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赠涮,你說我怎么就攤上這事子寓。” “怎么了世囊?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵别瞭,是天一觀的道長。 經(jīng)常有香客問我株憾,道長蝙寨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任嗤瞎,我火速辦了婚禮墙歪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贝奇。我一直安慰自己虹菲,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布掉瞳。 她就那樣靜靜地躺著毕源,像睡著了一般浪漠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上霎褐,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天址愿,我揣著相機與錄音,去河邊找鬼冻璃。 笑死响谓,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的省艳。 我是一名探鬼主播娘纷,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼跋炕!你這毒婦竟也來了赖晶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤枣购,失蹤者是張志新(化名)和其女友劉穎嬉探,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棉圈,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年眷蜓,在試婚紗的時候發(fā)現(xiàn)自己被綠了分瘾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡吁系,死狀恐怖德召,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情汽纤,我是刑警寧澤上岗,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站蕴坪,受9級特大地震影響肴掷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜背传,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一呆瞻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧径玖,春花似錦痴脾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滚朵。三九已至,卻和暖如春前域,著一層夾襖步出監(jiān)牢的瞬間辕近,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工话侄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留亏推,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓年堆,卻偏偏與公主長得像吞杭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子变丧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • [譯]D3.js 之 d3-selection 原理 譯者注 原文: 來自 D3.js 作者 Mike Bosto...
    ssthouse閱讀 722評論 0 0
  • 對集合的操作 關(guān)于d3.attr 一個可以處理很多情況的函數(shù)芽狗,當(dāng)只傳入一個參數(shù)時,如果是string痒蓬,則返回該屬性...
    陳堅生閱讀 2,511評論 0 2
  • 原文:How Selections Work selection是Array子類 selection是Array子...
    secViz閱讀 1,814評論 0 1
  • d3 (核心部分)選擇集d3.select - 從當(dāng)前文檔中選擇一系列元素童擎。d3.selectAll - 從當(dāng)前文...
    謝大見閱讀 3,437評論 1 4
  • 原因: ci框架是在Apache下進行開發(fā)的,如果要讓基于ci框架開發(fā)的項目跑起來攻晒,需要對nginx進行如下配置顾复。...
    大步向前blue閱讀 1,565評論 0 0