How Selections Work

分組元素

  • 當(dāng)執(zhí)行select/selectAll時(shí)候, 都會(huì)返回一個(gè)分組. 例如, 我們執(zhí)行代碼:
console.log(d3.select('body')._groups)
console.log(d3.selectAll('h2')._groups);

則展示:


4.PNG

當(dāng)我們執(zhí)行style/attr時(shí)候, 會(huì)對(duì)分組中的每個(gè)元素執(zhí)行. 而select只會(huì)匹配第一個(gè)元素, selectAll會(huì)匹配所有的元素.

  • 每個(gè)元素均由父元素. 在返回分組時(shí)候, 可通過(guò)父元素確定元素的具體位置.
    假設(shè)我們執(zhí)行操作:
const h = d3.selectAll('h2').append('p');
console.log(d3.selectAll('h2').selectAll('p'));

這里, 每個(gè)h2下面均由p. 如果我們d3.selectAll('h2').selectAll('p'), 則p會(huì)是一個(gè)分組, 但不在一個(gè)h2下, 而是在不同的h2下. 我們可以通過(guò)_parents屬性查知.


5.PNG
  • 空元素用于表明缺失的元素. 假設(shè)我們?nèi)齻€(gè)h2, 但是只有前兩個(gè)h2存在p. 那么執(zhí)行如下代碼:
console.log(d3.selectAll('h2').selectAll('p'));

則顯示第三個(gè)元素為空數(shù)組:


6.PNG

數(shù)據(jù)綁定

  • 數(shù)據(jù)是DOM元素的屬性, 而非選擇器的屬性. 數(shù)據(jù)可通過(guò)三種方式寫(xiě)入DOM屬性中:
    • 通過(guò)selection.data(插入分組)
    • 通過(guò)selection.datum(單個(gè)元素)
    • 通過(guò)append, insert, 或者select, 從父級(jí)中繼承.
d3.select('body').datum(42);
console.log(document.body.__data__);  // 42
// 通過(guò)父級(jí)繼承
d3.select('body').datum(42).append('h1');
console.log(d3.select('h1')._groups[0][0].__data__);// 42
  • selection.data函數(shù)定義的是分組的數(shù)據(jù)而非具體元素的數(shù)據(jù).

key函數(shù)

  • 使用selection.data時(shí)候, data和element的對(duì)應(yīng)是默認(rèn)通過(guò)索引的(數(shù)組的索引).


    7.PNG
  • 如果數(shù)據(jù)是數(shù)組, 索引是高效的. 但是如果數(shù)據(jù)中的元素是字典, 則默認(rèn)使用索引則是低效的. 這時(shí)候, 需要我們指定key函數(shù).
const letters = [
  {name: "A", frequency: .08167},
  {name: "B", frequency: .01492},
  {name: "C", frequency: .02780},
  {name: "D", frequency: .04253},
  {name: "E", frequency: .12702}
];

const div = d3.select('.chart');
div.selectAll('div').data(letters, d => d.name)
  .enter().append('div')
  .text(d => d.name);

Enter, Update和Exit

  • 當(dāng)插入數(shù)據(jù)情況下, 一般會(huì)有三種邏輯操作
    • Update: 給定的數(shù)據(jù)中, 存在對(duì)應(yīng)的DOM元素. (selection.data)
    • Enter: 給定的數(shù)據(jù)中, 沒(méi)有對(duì)應(yīng)的DOM元素. (selection.enter)
    • Exit: 給定的DOM元素中, 沒(méi)有對(duì)應(yīng)的數(shù)據(jù). (selection.exit)

考慮以下情況: 新建元素abcde, 然后更新為yeaoi.

const div = d3.select('.chart');
div.selectAll('p').data(['a', 'b', 'c', 'd', 'e'])
  .enter().append('p')
  .text(d => d);

const newDiv = div.selectAll('p').data(['y', 'e', 'a', 'o', 'i'], d => d);
newDiv.enter().append('p')
  .text(d => d);
newDiv.exit().remove();
  • key函數(shù)d => d必須填寫(xiě). 如果不填寫(xiě), 則為新增p元素. 填寫(xiě)的情況下, 匹配之前的p元素.
  • 使用enter新建DOM元素.
  • 使用exit找出存在DOM元素, 但是數(shù)據(jù)不提供的(如b, c, d三元素), 然后刪除它們.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子毫蚓,更是在濱河造成了極大的恐慌讶泰,老刑警劉巖赘被,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件珠漂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡愈案,警方通過(guò)查閱死者的電腦和手機(jī)步责,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)返顺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人勺择,你說(shuō)我怎么就攤上這事÷字遥” “怎么了省核?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)昆码。 經(jīng)常有香客問(wèn)我气忠,道長(zhǎng)邻储,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任旧噪,我火速辦了婚禮吨娜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淘钟。我一直安慰自己宦赠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布米母。 她就那樣靜靜地躺著勾扭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铁瞒。 梳的紋絲不亂的頭發(fā)上妙色,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音慧耍,去河邊找鬼身辨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛芍碧,可吹牛的內(nèi)容都是我干的煌珊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼师枣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼怪瓶!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起践美,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤洗贰,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后陨倡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體敛滋,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年兴革,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绎晃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡杂曲,死狀恐怖庶艾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情擎勘,我是刑警寧澤咱揍,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站棚饵,受9級(jí)特大地震影響煤裙,放射性物質(zhì)發(fā)生泄漏掩完。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一硼砰、第九天 我趴在偏房一處隱蔽的房頂上張望且蓬。 院中可真熱鬧,春花似錦题翰、人聲如沸恶阴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)存淫。三九已至,卻和暖如春沼填,著一層夾襖步出監(jiān)牢的瞬間桅咆,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工坞笙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岩饼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓薛夜,卻偏偏與公主長(zhǎng)得像籍茧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梯澜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • 問(wèn)答題47 /72 常見(jiàn)瀏覽器兼容性問(wèn)題與解決方案寞冯? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,760評(píng)論 1 92
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,407評(píng)論 0 5
  • 上周就和朋友相約,這星期有空下鄉(xiāng)摘桔子去晚伙。今個(gè)早上十點(diǎn)直接去二中國(guó)際象棋班接了二寶就出發(fā)了吮龄,開(kāi)始大路之不好,到了閃...
    加油一高博閱讀 186評(píng)論 0 2
  • 不知你們有過(guò)被老師揍過(guò)的記憶咆疗,我對(duì)被揍的事情記憶猶新漓帚。 那是九十年代初我上小學(xué)五年級(jí)的事了。在鎮(zhèn)上上學(xué)中午是可以回...
    北方不下雪閱讀 242評(píng)論 0 4
  • 睜眼看到朋友圈有人曬農(nóng)家樂(lè) 配詩(shī)與遠(yuǎn)方四個(gè)大字 遠(yuǎn)方是什么午磁? 心之所念目不能及身不能至者是也 詩(shī)是什么尝抖? 情動(dòng)于中...
    熱水c閱讀 97評(píng)論 0 1