JSFiddle - React, Tailwind, and code Playground

HTML

<button type="button" onclick="createPie()">Click Me First!</button>
<button type="button" onclick="updatePie()">Update Diagram!</button>
<div class='foo'></div>

JavaScript

const width = 260;
const height = 260;
const thickness = 40;
const duration = 750;

const radius = Math.min(width, height) / 2;
const color = d3.scaleOrdinal(d3.schemeCategory10);

const arc = d3
  .arc()
  .innerRadius(radius - thickness)
  .outerRadius(radius);

const pie = d3
  .pie()
  .value(function(d) {
    return d.value;
  })
  .sort(null);


const create = function(data) {
  const svg = d3
    .select('.foo')
    .append('svg')
    .attr('class', 'pie')
    .attr('width', width)
    .attr('height', height)
    .attr('id', 'svgClass');

  svg
    .append('g')
    .attr('transform', 'translate(' + width / 2 + ',' + height / 2 + ')')
    .attr('id', 'bar');
	createLegend();
  draw(data);
}

const draw = function(data) {
  const path = d3.select('#bar')
    .selectAll('path')
    .data(pie(data))

  path
    .enter()
    .append('g')
    .append('path')
    .attr('d', arc)
    .attr('fill', (d, i) => color(i));

  path
    .transition()
    .duration(duration)
    .attrTween('d', function(d) {
      const interpolate = d3.interpolate({
        startAngle: 0,
        endAngle: 0
      }, d);
      return function(t) {
        return arc(interpolate(t));
      };
    });
};

const createLegend = function() {
	d3.select('#svgClass')
  .append('text')
  .text('foo bar')
  .attr('position', 'relative')
  .attr('background-color', 'red')
  .attr('top', '50px')
  .attr('left', '50px')
}


const data = [{
    name: 'USA',
    value: 50
  },
  {
    name: 'UK',
    value: 5
  },
  {
    name: 'Canada',
    value: 5
  },
  {
    name: 'Maxico',
    value: 40
  }
]

function createPie() {
  create(data)
}

const newData = [{
    name: 'USA',
    value: 40
  },
  {
    name: 'UK',
    value: 20
  },
  {
    name: 'Canada',
    value: 30
  },
  {
    name: 'Maxico',
    value: 10
  }
];

function updatePie() {
  draw(newData)
}