Adição, alteração e remoção de marcas: parte 1


A essa altura você já usou um bocado uma abstração central do d3: seleções. Quando você faz d3.selectAll('text'), por exemplo, você está criando uma seleção d3 que contém todos os elementos text do DOM.

Para ligar elementos do DOM e dados, d3 usa outra abstração chamada join.

Quando fazemos d3.selectAll('text').data(dados) estamos juntando à seleção uma lista de dados. Se depois fizermos outro join d3.selectAll('text').data(outrosDados), ele substituirá o primeiro.

Nesse exemplo e nos próximos dois, vamos explorar mais como operar sobre o resultado da seleção depois de um join.

Temos 3 situações com as quais queremos lidar:

  1. Queremos atualizar os elementos da seleção, que já existem com base nos dados. Nesse caso usamos o conjunto de update do join, que é o que é retornado a partir do join.
    Por exemplo, d3.selectAll('text').data(dados).attr('class', 'mudada') vai setar todos os elementos da seleção para os quais há dados correspondentes na lista dados com a classe css mudada. No join feito como fizemos, sem especificar nenhuma maneira de mapear dados para elementos, a atualização mapeia cada elemento de dados para cada elemento da seleção pelo índice.

  2. Queremos adicionar elementos à seleção com base nos dados. Nesse caso, usamos a seleção enter do join: d3.selectAll('text').data(dados).enter().append('text').text(d => d.conteudo) vai adicionar, para cada elemento de dados para o qual não há um elemento correspondente na seleção, um elemento text baseado no elemento de dados.

  3. Queremos remover elementos à seleção com base nos dados. Nesse caso, usamos a seleção exit do join: d3.selectAll('text').data(dados).exit().remove() vai remover, para cada elemento de dados para o qual não há um elemento correspondente na seleção, o elemento text.

Nesse exemplo, cada vez que você aperta o botão, um subconjunto de a a outra letra do alfabeto é escolhido como novo dado e as seleções de UPDATE, ENTER e EXIT são usadas, uma por vez.

Na prática

Próximos passos

No próximo exemplo de ENTER/EXIT fazemos as alterações mapeando os dados para elementos de uma maneira mais sofisticada.