Vue.js č. 3:Práce s událostmi, vazby vstupu formuláře a vazby stylu

Z našeho kurzu Základy JavaScriptu jsme se naučili, že zpracování událostí je nejdůležitějším konceptem při vývoji frontendu a Vue.js, protože je rozhraním JavaScriptu, musí mít vestavěný stejný koncept.

V tomto článku se zaměříme na dva aspekty, zpracování událostí pomocí direktivy v-on a zpracování vstupu formuláře pomocí direktivy v-model . A než začneme mluvit o sekci skriptů Vue.js, projdeme si rychle vazby stylů a vazby tříd.

Zpracování událostí

Událost je uživatelský vstup, může to být vstup z klávesnice nebo kliknutí myší, uživatel obvykle očekává nějakou odezvu poté, co událost proběhne. Obsluha události naslouchá této události a na pozadí provede nějaké akce a vrátí něco jako odpověď.

Pokud nevíte, co je to událost, zde je podrobné vysvětlení: Základy JavaScriptu #7:Zpracování událostí

 v-on direktivu, kterou můžeme zkrátit pouze na @ symbol, se používá k poslechu událostí ve Vue.js. Můžeme jej použít k upřesnění, jaký druh události posloucháme, jaký druh akce provedeme po přijetí této události.

v-on:click="someAction"
@click="someAction"

To someAction může být jednoduchý JavaScriptový výraz nebo velmi komplikovaná metoda, která nám umožňuje budovat složitější logiku.

v-on:click="count = count + 1"
v-on:click="someMethod()"

Někdy metoda vyžaduje až předání dalších argumentů.

<script>
export default {
  ...
  methods: {
    add(num) {
      this.count = this.count + num
    }
  }
}
</script>

<template>
  <p>count = {{count}}</p>
  <button v-on:click="add(1)">Add 1</button>
  <button v-on:click="add(5)">Add 5</button>
  <button v-on:click="add(10)">Add 10</button>
  <button v-on:click="add(100)">Add 100</button>
</template>

Je také možné, aby jedna událost spustila více obslužných rutin událostí a obslužné rutiny jsou odděleny pomocí operátoru čárky. Tentokrát například po kliknutí na tlačítko prohlížeč zobrazí okno s upozorněním a znovu vykreslí webovou stránku:

<script>
export default {
  data() {
    ...
  },

  methods: {
    ...
    say() {
      var msg = 'count = ' + this.count
      alert(msg)
    }
  }
}
</script>

<template>
  <p>count = {{count}}</p>
  <button v-on:click="add(1), say()">Add 1</button>
  ...
</template>

Modifikátory

Modifikátory se používají k předání dalších podrobností o události. Můžeme například použít .once modifikátor, který Vue řekne, že tato událost bude spuštěna pouze jednou:

<template>
  <p>count = {{count}}</p>
  <button v-on:click.once="add(1)">Add 1</button>
</template>

Tentokrát bude tlačítko "Přidat 1" fungovat pouze jednou.

Existují některé další modifikátory, například .prevent , která zastaví výchozí akci události. Nebo .stop , který zastaví šíření události. Pokud nevíte, které to jsou, přečtěte si prosím článek o Event Handling v kurzu JavaScript.

<!-- the click event's propagation will be stopped -->
<a @click.stop="doThis"></a>

<!-- the submit event will no longer reload the page -->
<form @submit.prevent="onSubmit"></form>

<!-- modifiers can be chained -->
<a @click.stop.prevent="doThat"></a>

Existuje také jiný typ modifikátoru, který umožňuje obsluze události poslouchat události z konkrétní klávesy nebo tlačítka myši nebo jakékoli z kombinací:

<template>
  <!-- Right Click -->
  <div v-on:click.right="doSomething">Do something</div>

  <!-- Control + Click -->
  <div v-on:click.ctrl="doSomething">Do something</div>

  <!-- Enter Key -->
  <div v-on:keyup.enter="doSomething">Do something</div>

  <!-- Alt + Enter -->
  <div v-on:keyup.alt.enter="doSomething">Do something</div>
</template>

Vazba vstupu formuláře

Formulář je velmi důležitou součástí při vývoji webu, poskytuje uživateli portál pro komunikaci s backendem. Z našeho kurzu o formulářích HTML však víme, že formuláře mohou mít mnoho různých typů vstupů a každý z nich je spojen s jiným datovým typem. Bolelo by to v krku, kdybychom se pokusili zpracovat všechny tyto datové typy jeden po druhém.

Naštěstí s Vue.js můžeme použít jedinou direktivu, v-model , svázat všechna vstupní data bez ohledu na jejich datové typy. Například zde máme standardní textový vstup:

<input v-model="message" />
<p>Message is: {{ message }}</p>

Zde má uživatelský vstup typ string a bude vázána na proměnnou massage .

Víceřádkové zadávání textu funguje úplně stejně:

<textarea v-model="message"></textarea>
<p>Message is: {{ message }}</p>

Zaškrtávací políčko

<script>
export default {
  data() {
    return {
      checked: false
    }
  }
}
</script>

<template>
  <input type="checkbox" v-model="checked" />
  <p v-if="checked">The box is checked.</p>
  <p v-else>The box is NOT checked.</p>
</template>

Pokud jde o zaškrtávací políčko, vstup uživatele je logická hodnota, buď true nebo false . V tomto příkladu je uživatelský vstup vázán na proměnnou checked a direktivu v-if se použije ke kontrole pravdivosti checked .

Někdy však formulář obsahuje více zaškrtávacích políček, což znamená, že mají pouze dvě hodnoty (true nebo false ) by nestačilo. V tomto případě budeme muset přidat value atribut ke každému zaškrtávacímu políčku:

<script>
export default {
  data() {
    return {
      checkedBoxes: []
    }
  }
}
</script>

<template>
  <div id="v-model-multiple-checkboxes">
    <input type="checkbox" id="one" value="one" v-model="checkedBoxes" />
    <label for="one">one</label>
    <input type="checkbox" id="two" value="two" v-model="checkedBoxes" />
    <label for="two">two</label>
    <input type="checkbox" id="mike" value="three" v-model="checkedBoxes" />
    <label for="three">three</label>
    <br />
    <span>Checked boxes: {{ checkedBoxes }}</span>
  </div>
</template>

Všimněte si tentokrát proměnné checkedBoxes je vázáno na pole, a když je políčko zaškrtnuté, jeho hodnota (ať už jste přiřadili jeho value atribut) bude připojen k tomuto poli.

Rádio

Rádio je něco jako skupina s více zaškrtávacími políčky, kromě toho, že můžete vybrat pouze jednu možnost. Takže v tomto případě bude uživatelským vstupem vždy jeden řetězec.

<div id="v-model-radiobutton">
  <input type="radio" id="one" value="One" v-model="picked" />
  <label for="one">One</label>
  <br />
  <input type="radio" id="two" value="Two" v-model="picked" />
  <label for="two">Two</label>
  <br />
  <span>Picked: {{ picked }}</span>
</div>

Proměnná picked bude řetězec namísto pole.

Vyberte

Pro jeden výběr je proměnná typ řetězce.

<script>
export default {
  data() {
    return {
      selected: ''
    }
  }
}
</script>

<template>
  <select v-model="selected">
    <option disabled value>Please select one</option>
    <!--
      If you assign a 'value' attribute, that value will be assigned to the variable 'selected'
    -->
    <option value="aaaaaaa">A</option>
    <!--
      If you do not assign a value attribute, whatever is inside the <option> element
      will be assigned to the variable 'selected'
    -->
    <option>B</option>
    <option>C</option>
  </select>
  <span>Selected: {{ selected }}</span>
</template>

<style>
</style>

U muliselectu bude proměnná vázána na pole.

<script>
export default {
  data() {
    return {
      selected: []
    }
  }
}
</script>

<template>
  <select v-model="selected" multiple>
    <option>A</option>
    <option>B</option>
    <option>C</option>
  </select>
  <span>Selected: {{ selected }}</span>
</template>

Vazba stylu

Vazba třídy

Z našeho kurzu Základy CSS víme, že pomocí třídy můžeme přiřadit stejný kód CSS různým prvkům HTML a změnou názvu třídy můžeme snadno změnit kód CSS přidružený k tomuto prvku.

Název třídy prvku HTML můžeme ve Vue.js dynamicky změnit takto:

<div v-bind:class="{ active: isActive }"></div>

V tomto příkladu active je název třídy a isActive je proměnná s booleovskou hodnotou. Pokud isActive je true a poté název třídy active bude vykreslen.

Můžeme zde mít více názvů tříd:

<div v-bind:class="{ class-one: isClassOneActive, class-two: isClassTwoActive }"></div>

Vazba CSS

Můžeme také přímo svázat CSS kódy takto:

<script>
export default {
  data() {
    return {
      activeColor: 'red',
      fontSize: 30
    }
  }
}
</script>

<template>
  <div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
</template>

Ačkoli je obvykle lepší umístit objekt do metody data(), aby naše sekce šablony vypadala čistěji:

<script>
export default {
  data() {
    return {
      styleObject: {
        color: 'red',
        fontSize: '13px'
      }
    }
  }
}
</script>

<template>
  <div v-bind:style="styleObject"></div>
</template>