d3代碼如何改造成update結構(恰當處理enter和exit)

d3的enter和exit

網上有很多blog講解。說的還湊合的見:https://blog.csdn.net/nicolecc/article/details/50786661

如何把自己的rude繪圖代碼,進行精致化(update)

?不多比比,上代碼示例:

d3.selectAll('.circle_group').children().remove();
var circle_group = d3.selectAll('.circle_group').data(circleData).enter().append('g').attr('class', 'circle_group brushNode').attr('transform',function (d) {return 'translate(' + d.x + ',' + d.y + ')';}).on('click', function (d) {if (shiftKey) {//標記當前點d3.select(this).classed("selected", function (d) {d.selected = !d.selected;d.previouslySelected = !d.selected;return d.selected;})//阻止事件冒泡
            d3.event.stopPropagation();}}).on("contextmenu", function (node) {contextmenu("Rmenu");})circle_group.append('circle').attr('r', function (d) {return d.r;}).style("fill", function (d) {return color20(d.index);});
circle_group.append('text').attr("dy", ".35em").attr("text-anchor", "middle")//在圓圈中加上數據.style('fill', function (node) {return '#555';}).attr("y", -7).text(d => d.text);circle_group.call(d3.drag()
//定義了元素拖拽行為的原點,設置為圓的圓心位置可以避免明顯的元素跳動, 與d3v3中的origin方法類似。.subject(function () {var thisData = d3.select(this);return {x: thisData.datum().x,y: thisData.datum().y};}).on("start", dragstarted).on("drag", dragmove).on("end", dragended));

?很明顯,新手圖省事都是這么繪圖的。就繪圖結果來看,如果你不加動畫一點問題都沒有,只要一加動畫過渡動畫,所有的圖形都是從無到有的過程,而我們想看的是,如果點更新的話,能看到他從哪(位置)更新到哪(位置)。(這里就不加動畫過渡了,就一行代碼的事.transition().duration(300) )。

改造如下:

    //這部分代碼是有則改之,無則添加的功能
const circle_data=d3.selectAll('.circle_group').data(circleData)  //更新部分,如果你數據的數目沒變,那circle_data.size()=你數據內容改變的數目,你可以把circle_data考慮成update部分就行,這樣編代碼準沒錯.attr('transform',             //首次運行的時候,因為沒有元素circle_data.size()=0, 所以這個transform不會運行到function (d) {return 'translate(' + d.x + ',' + d.y + ')';});
const circle_enter=circle_data.enter().append('g')  //add 部分,首次運行的時候,circle_enter.size()=全部元素,所以在circle_enter進行所有的初始化設置操作.attr('class', 'circle_group brushNode').attr('transform',function (d) {return 'translate(' + d.x + ',' + d.y + ')';});
circle_data.exit().remove();  // 當你刪一些數據的時候, .exit().size()>0
circle_enter.on('click', function (d) {if (shiftKey) {//標記當前點d3.select(this).classed("selected", function (d) {d.selected = !d.selected;d.previouslySelected = !d.selected;return d.selected;})//阻止事件冒泡
        d3.event.stopPropagation();}
}).on("contextmenu", function (node) {contextmenu("Rmenu");})circle_enter.append('circle')     //add.attr('r', d=>d.r).style("fill", function (d) {return color20(d.index);});
circle_data.select('circle')  //update,這里不要append ,因為元素已經在那了(enter().append()過了)。當然首次運行(視圖首次顯示)的時候,這幾句代碼是運行不到的。.attr('r', d=>d.r).style("fill", function (d) {return color20(d.index);});circle_enter.append('text')  //add.attr("dy", ".35em").attr("text-anchor", "middle")//在圓圈中加上數據.style('fill', function (node) {return '#555';}).attr("y", -7).text(d => d.text);
circle_data.select('text')  //update  不要append .text(d => d.text);const drag=d3.drag()
//定義了元素拖拽行為的原點,設置為圓的圓心位置可以避免明顯的元素跳動, 與d3v3中的origin方法類似。.subject(function () {var thisData = d3.select(this);return {x: thisData.datum().x,y: thisData.datum().y};}).on("start", dragstarted).on("drag", dragmove).on("end", dragended);
circle_enter.call(drag);
circle_data.call(drag);   //update 注意,這里一定要重新綁定一下,這里涉及到drag的初始化(subject用于初始化drag拖動點的初始位置)

?

敲黑板

1、更新部分的所有與位置有關的事件(比如d3.drag()的初始位置)要重新綁定,否則會出現不可預料的結果。

2、update部分與數據有關的attr,style要重新設置,這時就不用append了。(因為這個元素既然有了,你已經在之前的.enter().append().append(其他元素)添加過了,這里只需要更新一下即可。)。一些固定的attr,style就不用重復設置了(之前enter已經綁定過了)

轉載于:https://www.cnblogs.com/xunhanliu/p/10995687.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448756.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448756.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448756.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

退居二線VS在深圳發展,一個十年IT人的選擇之難

有的人一直以來,身體里彷佛住著兩個靈魂。一個靈魂說:人就要拼搏,要奮斗,要實現理想,要留在中國最繁華的城市,感受大都市的生活,實現個人價值,走上人生巔峰!另一個靈魂說…

Jenkins 詳細安裝、構建部署 使用教程

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 Jenkins是一個開源軟件項目,是基于Java開發的一種持續集成工具,用于監控持續重復的工作,功能包括&…

GPU并行計算版函數圖像生成器

前幾天技術大牛Vczh同學開發了一個函數圖像繪制程序,可以畫出方程f(x,y)0的圖像。他的原理是用圖像上每一點的坐標帶入函數f得到針對x和y的兩個方程,再用牛頓迭代法求解得到一組點集,然后畫到圖像上。用他的程序可以畫出各種各樣令人驚嘆的方…

完全平方公式、平方差公式、一個數負次方

1.完全平方公式: 兩數和(或差)的平方,等于它們的平方和,加上(或減去)它們的積的2倍即完全平方公式 (ab)2a2b22ab 兩數和的完全平方公式(完全平方和) 與(a-b)2a2b2-2ab …

WSS連接服務器端報錯

錯誤: 1. Firefox 和 Chrome 瀏覽器對SSL證書拒絕的錯誤提示是不一樣的: (1) Chrome報錯:WebSocket connection failed: Error in connection establishment: net::ERR_CERT_AUTHORITY_INVALID (2&#xff…

LogBack 入門實踐

一、簡介 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 LogBack是一個日志框架,它是Log4j作者Ceki的又一個日志組件。 LogBack,Slf4j,Log4j之間的關系 slf4j是The Simp…

20個公司絕對不會告訴你的潛規則

1.入職時的工資高低不重要,只要你努力工作你會得到相應待遇的    我估計幾乎找過工作的人都聽過這句話,當我們確定被聘用跟公司談工資時,他們都會說“如果以后你業績突出、努力工作,你的報酬也會相應增加的”,特別是…

java 復制文件

2019獨角獸企業重金招聘Python工程師標準>>> public class copyFIle { public static void main(String[] args) throws IOException { File source new File("d:/test/1.xml");File des new File("d:/test/ma.txt");InputStream input null;…

Quartz學習資料地址記錄 、Quartz 學習的博客地址記錄

Quartz專欄系列 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1.Quartz學習——Quartz大致介紹(一) 2.Quartz學習——Quartz簡單入門Demo(二&#…

民間75個不傳之密 ,醫院都不知道的秘密

1、頭痛(各種頭痛均可): 生白蘿卜汁,每次滴鼻孔兩滴(兩鼻孔都滴),一日兩次,連用4-5天,可除根。忌吃花椒、胡椒。 2、頭暈(頭昏眼花、暈眩): 鴨蛋一個、赤豆2…

Docker最全教程之MySQL容器化 (二十四)

Docker最全教程之MySQL容器化 (二十四) 原文:Docker最全教程之MySQL容器化 (二十四)前言 MySQL是目前最流行的開源的關系型數據庫,MySQL的容器化之前有朋友投稿并且寫過此塊,本篇僅從筆者角…

CODING 受邀參加《騰訊全球數字生態大會》

近日,騰訊全年最重要的一場活動——《騰訊全球數字生態大會》于昆明滇池國際會展中心正式舉辦。此次全球數字生態大會是騰訊戰略升級后,整合互聯網數字經濟峰會、云未來峰會、騰訊全球合作伙伴三大行業大會,全新升級打造的行業創新大會。大會…

解決 dockerfile 構建鏡像報錯: [WARNING]: Empty continuation lines will become errors in a future release.

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 只是想自己寫個 dockerfile 用 docker 來部署 rocketmq 的服務。 dockerfile 中要運行多行命令 于是我寫成 RUN 命令a \&&…

第二章:08運算符[比較運算符]

①比較運算符②實例/* 運算符之三&#xff1a;比較運算符 ! > < > < instanceof 結論&#xff1a; 1.比較運算符的結果是boolean類型 2.區分 和 */ class CompareTest { public static void main(String[] args) { int i 10; int j 20; System.out.pr…

Apache版本兼容性問題

Apache 版本2.2.31 版本對于谷歌瀏覽器不兼容、IE8版本可以正常使用 當使用了Apache 高版本的話就解決了 出現以下現象 轉載于:https://www.cnblogs.com/tzhyy/p/10931084.html

王淮經驗談:我的碼農原則

摘要&#xff1a;王淮是Facebook第二位中國籍工程師&#xff0c;也是第一位中國籍研發經理&#xff0c;他一手開創了Facebook的支付安全和客服工具領域。2011年他離開Facebook&#xff0c;回國成為天使投資人。本文是王淮以前寫代碼和做代碼審查時候的一些原則&#xff0c;供大…

centos uwsgi自動調用python2環境,指定uwsgi調用版本

將自己開發好的django項目用uwsgi部署到Linux服務器、當運行uwsgi時出現了uwsgi選擇python版本的問題。因為本機器是在原來的機器上安裝了python3環境和pip3&#xff0c; 使用命令安裝uwsgi: pip3 install uwsgi 一點問題也沒有&#xff0c;使用uwsgi部署項目時 uwsgi --http :…

docker build Dockfile ---- RUN 中 cd 切換路徑失敗 的原因、解決

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 我只是想 直接切換到對應目錄下 執行后續命令。 ?????寫法如下&#xff1a; FROM openjdk:8-jre-alpineMAINTAINER JiangYuRU…

米爾電子Zynq UltraScale MPSoC核心板資料介紹

米爾Zynq UltraScale MPSoC核心板&#xff08;MYC-CZU3EG&#xff09;是采用Xilinx新一代Zynq處理器。該核心板是業界最小尺寸Zynq UltraScale 核心板&#xff0c;采用16納米制程&#xff0c;相比Znyq7000系列每瓦性能提升5倍&#xff0c;且單芯片融合4核心Cortex-A53&#xff…

幸福秘訣 男女必須要看哦

女人說&#xff1a;這一輩子最大的成功是什么?我認為是找到一個真正疼自己的老公,有了老公的支持才可以把事業做得有聲有色,有一個幸福的家和一個可愛的寶寶。 男人說&#xff1a;我的成功是在我的人生之中&#xff0c;是妻子和我形影相隨&#xff0c;朝夕相伴。她是我身邊…