JSFiddle - React, Tailwind, and code Playground

by Константин Дралюк

HTML

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/youarei.min.js"></script>
<div id="filter-panel">
  <rt-filter-ch1></rt-filter-ch1>
  <rt-filter-ch2></rt-filter-ch2>
  <rt-filter-rd1></rt-filter-rd1>
  
  <hr>
  
  <h2>Object to URL</h2>
  {{ objToUrl }}
  
  <h2>URL to obj</h2>
  {{ urlToObj }}
</div>

Babel + JSX

Vue.component('rt-filter', {
	template: `
  <div class="filter">
  	<slot name="title"></slot>
    <slot name="body"></slot>
  </div>
  `
});

Vue.component('rt-filter-ch1', {
	name: 'rt-filter-ch1',
	template: `
  <rt-filter>
    <h3 slot="title">Чекбоксы 1</h3>
    <div slot="body">
       <label>
         <input v-model="$root.filter.ch1" type="checkbox" name="ch1" value="ch1-1"> ch1-1
         <input v-model="$root.filter.ch1" type="checkbox" name="ch1" value="ch1-2"> ch1-2
         <input v-model="$root.filter.ch1" type="checkbox" name="ch1" value="ch1-3"> ch1-3
         <input v-model="$root.filter.ch1" type="checkbox" name="ch1" value="ch1-4"> ch1-4
       </label>
    </div>
  </rt-filter>
  `
});

Vue.component('rt-filter-ch2', {
	name: 'rt-filter-ch2',
	template: `
  <rt-filter>
    <h3 slot="title">Чекбоксы 2</h3>
    <div slot="body">
       <label>
         <input v-model="$root.filter.ch2" type="checkbox" name="ch2" value="ch2-1"> ch2-1
         <input v-model="$root.filter.ch2" type="checkbox" name="ch2" value="ch2-2"> ch2-2
         <input v-model="$root.filter.ch2" type="checkbox" name="ch2" value="ch2-3"> ch2-3
         <input v-model="$root.filter.ch2" type="checkbox" name="ch2" value="ch2-4"> ch2-4
       </label>
    </div>
  </rt-filter>
  `
});

Vue.component('rt-filter-rd1', {
	name: 'rt-filter-rd1',
	template: `
  <rt-filter>
    <h3 slot="title">Радио</h3>
    <div slot="body">
       <label>
         <input v-model="$root.filter.rd1" type="radio" name="rd1" value="rd1-1"> rd1-1
         <input v-model="$root.filter.rd1" type="radio" name="rd1" value="rd1-2"> rd1-2
         <input v-model="$root.filter.rd1" type="radio" name="rd1" value="rd1-3"> rd1-3
       </label>
    </div>
  </rt-filter>
  `
});

new Vue({
	el: '#filter-panel',
  uri: '',
  data: {
  	filter: {
    	ch1: [],
      ch2: [],
      rd1: []
    }
  },
  created() {
  	this.uri = new YouAreI(window.location.href);
  },
  computed: {
  	objToUrl() {
   ...