The third example is missing the data binding that you get automatically with React. It should look more like this:
function increment() {
count += 1;
dispatchEvent(new CustomEvent(
"count-incremented",
{ detail: { count } }
));
}
I think I prefer not having to manage events all over the place.