JSFiddle - React, Tailwind, and code Playground

by kurotanshi

HTML

<script src="https://unpkg.com/vue@next"></script>
<div id="app">
  <h1>Total: {{ sum }}</h1>
  
  <button-counter @add-sum="plus"></button-counter>
  <button-counter @add-sum="plus"></button-counter>
  <button-reset></button-reset>
</div>

SCSS

#app {
  display: block;
  padding: 1rem;
  padding-top: 2rem;
  font-size: 1rem;
}

button {
  display: block;
  margin: 1rem 0;
  font-size: 1rem;
}

JavaScript

const { ref, watch, createApp } = Vue;

const sum = ref(0);
const plus = () => sum.value++;
const reset = () => sum.value = 0;

const app = createApp({
	setup () {

		return {
    	sum,
      plus
    };
  }
});

app.component('button-counter', {
  template: `<button @click="plus">You clicked me {{ count }} times.</button>`,
	setup (props, {emit}) {
  	const count = ref(0);
		const plus = () => {
	    count.value++
      emit('add-sum');
    };
    
    watch(sum, v => count.value = v === 0 ? 0 : count.value);
    
    return {
    	count,
      plus
    }
  }
});


app.component('button-reset', {
  template: `<button @click="reset">reset</button>`,
	setup () {
  	return {
	    reset
    }
  }
});

app.mount('#app');