Categories
VueJS

Common useful Vue 3 APIs and Macros

In this article we are going to list some common and useful Vue Apis and Macros that can help you in day to day coding.

computed

const count = ref(1)
const plusOne = computed(() => count.value + 1)
console.log(plusOne.value) // 2
plusOne.value++ // error

//As a getter/setter
const count = ref(1)
const plusOne = computed({
  get: () => count.value + 1,
  set: val => {
    count.value = val - 1
  }
})

plusOne.value = 1
console.log(count.value) // 0

watchEffect

const count = ref(0)

watchEffect(() => console.log(count.value))
// -> logs 0

setTimeout(() => {
  count.value++
  // -> logs 1
}, 100)

watch
The watch API is the exact equivalent of the Options API this.$watch (and the corresponding watch option). watch requires watching a specific data source and applies side effects in a separate callback function. It also is lazy by default – i.e. the callback is only called when the watched source has changed.
A watcher data source can either be a getter function that returns a value, or directly a ref:

// watching a getter
const state = reactive({ count: 0 })
watch(
  () => state.count,
  (count, prevCount) => {
    /* ... */
  }
)

// directly watching a ref
const count = ref(0)
watch(count, (count, prevCount) => {
  /* ... */
})

$emit
Trigger an event on the current instance. Any additional arguments will be passed into the listener’s callback function.

<div id="emit-example-argument">
  <advice-component v-on:advise="showAdvice"></advice-component>
</div>

const app = createApp({
  methods: {
    showAdvice(advice) {
      alert(advice)
    }
  }
})

app.component('advice-component', {
  emits: ['advise'],
  data() {
    return {
      adviceText: 'Some advice'
    }
  },
  template: `
    <div>
      <input type="text" v-model="adviceText">
      <button v-on:click="$emit('advise', adviceText)">
        Click me for sending advice
      </button>
    </div>
  `
})

app.mount('#emit-example-argument')
Categories
Quasar VueJS

How to create a Custom Select Component in Quasar V2 using <script setup> SFC

In this post we are going to wrap Quasar V2 q-select in a custom base component we can reuse. The q-select has many props and options and sometime we want some of these props to be available by default for all our select components. Same goes for the styling, sometimes we require our q-select’s to have the same look and feel or wrapped in some custom HTML that has a common look and feel across our website or App.

For such cases a custom Select Component is quite handy. In a similar manner we can wrap other components like q-input, q-uploader etc as well if required.

Below is the sample code for creating a custom Select Component wrapping the quasar’s q-select. Please note we have used Vue 3′ script setup SFC API in this and it will not work if you are using Vue 2 or Quasar V1.

<template>
  <div>
    <q-select
      :options="arrMatchedOptions"
      use-input
      outlined
      dense
      hide-selected
      hide-bottom-space
      fill-input
      map-options
      input-debounce="0"
      :option-value="strOptionValue"
      :option-label="strOptionLabel"
      option-disable="inactive"
      :label="strLabel"
      emit-value
      clearable
      :modelValue="modelValue"
      @update:model-value="fnEmit"
      :loading="blnLoading"
      :rules="arrRules"
      :disable="blnDisabled"
      @filter="fnFilter"
    ></q-select>
  </div>
</template>

<script setup>
import { computed, onMounted, ref } from "vue"
import { myUtils } from '@/boot/utils'

const props = defineProps({
  modelValue: { required: true },
  strLabel: {
    type: String,
    required: true
  },
  strOptionLabel: {
    type: String,
    required: false,
    default: 'name'
  },
  strOptionValue: {
    type: String,
    required: false,
    default: 'id'
  },
  arrOptions: {
    type: Array,
    required: true
  },
  blnLoading: {
    type: Boolean,
    default: false
  },
  blnRequired: {
    type: Boolean,
    default: false
  },
  blnDisabled: {
    type: Boolean,
    default: false
  }
})

const emit = defineEmits(['update:modelValue'])


const arrMatchedOptions = ref(JSON.parse(JSON.stringify(props.arrOptions)));

const arrRules = computed(() => {
  if (props.blnRequired) {
    return [myUtils.requiredSelectRule]
  }
  return []
}
);

onMounted(() => {
});


const fnFilter = (strVal, update) => {

  if (strVal === '') {
    update(() => {
      arrMatchedOptions.value = props.arrOptions
    })
    return
  }

  update(() => {
    const strNeedle = strVal.toLowerCase()
    arrMatchedOptions.value = props.arrOptions.filter(obj => {
      const strOptionLabel = obj[props.strOptionLabel]
      return strOptionLabel.toLowerCase().indexOf(strNeedle) > -1
    })
  })
};

const fnEmit = ($event) => {

  emit('update:modelValue', $event)
}

How to use in your parent component, below is an example code:

<template>
  <q-layout>
    <q-card>
      <q-card-section class="p20px">
        <div class="sectionTitle">
          <h2>Base Select Test</h2>
          <span class="after"></span>
        </div>

        <div class="mt20px row">
          <BaseSelect
            :arrOptions="arrGender"
            strLabel="Gender"
            strOptionLabel="name"
            strOptionValue="id"
            v-model="gender"
            hide-bottom-space
          ></BaseSelect>
        </div>
      </q-card-section>
    </q-card>
  </q-layout>
</template>

<script setup>
import { ref } from "vue"
import BaseSelect from "./components/BaseSelect.vue"

const arrGender = ref([
  { name: 'Male', id: 'm' },
  { name: 'Female', id: 'f' },
  { name: 'Other', id: 'o' },
]);

const gender = ref('')
Categories
VueJS

The New Vue by Evan You – VueConf Toronto 2021

Latest on VueJS by Evan You in VueConf Toronto 2021.

Link to Slides: https://docs.google.com/presentation/d/1NntydB8nwtTpcIuKg6O1s_ZeGJKtffTn39Wi1OHhts0/edit#slide=id.p

Categories
Javascript

Javascript common array methods

In this tutorial we are going to review the most common and used methods to manipulate arrays in Javascript. A cheat
sheet of array methods are listed below:

To add/remove elements:
  • push(...items) – add an item to the end of array.
    Example:
    const arr = ["Black", "Green", "Yellow", "Red"];
    arr.push("Orange"); // Adds "Orange"
  • pop() – extracts an item from the end of array.
    Example:
    const arr = ["Black", "Green", "Yellow", "Red"];
    const str = arr.pop(); // Removed "Red" from arr and assign
    it to str
  • shift() – extracts an item from the beginning of array.
    Example:
    const arr = ["Black", "Green", "Yellow", "Red"];
    const str = arr.shift(); // Removed "Black" from arr and
    assign it to str
  • unshift() – adds items to the beginning of array and returns the new length.
    Example:
    const arr = ["Black", "Green", "Yellow", "Red"];
    const str = arr.unshift("Orange", "Violet"); // Adds
    ["Orange", "Violet"] to the beginning or arr which will now be ["Orange", "Violet", "Black", "Green", "Yellow",
    "Red"] and assign new length i.e 6 to str
  • splice(pos, deleteCount, ...items) – at
    index pos deletes deleteCount elements and inserts items
    Example:
    const arr = ["Black", "Green", "Yellow", "Red"]; arr.splice(2, 0, ["Orange", "Violet"]); // Adds ["Orange",
    "Violet"] after "Green", new arr will now be [ "Black", "Green", "Orange", "Violet", "Yellow", "Red"]
  • slice(start, end) – creates a new array, copies elements from
    index start till end (not inclusive) into it.
    Example:
    const arr = ["Black", "Green", "Yellow", "Red"];
    const arrNew = arr.slice(1, 3); //Assign ["Green", "Yellow"]
    to arrNew, arr remains unaffected
  • concat(...items) – returns a new array: copies all members of the current one and
    adds items to it. If any of items is an array, then its elements are taken.
    Example:
    const arr = ["Black", "Green", "Yellow", "Red"];
    const arr2 = ["Violet", "Pink"];
    const arrConcated = arr.concat(arr2); //new array with Values ["Black", "Green", "Yellow", "Red", "Violet", "Pink"], arr and arr2 remains unaffected
To search among elements:
  • indexOf/lastIndexOf(item, pos) – look for item starting from
    position pos, return the index or -1 if not found.
    Example:
    const arr = ["Black", "Green", "Yellow", "Red", "Green"];
    const found = arr.indexOf("Green"); //returns 1
    const foundLast = arr.indexOf("Green"); //returns 4 i.e the lastIndex
  • includes(value) – returns true if the array has value,
    otherwise false.
    Example:
    const arr = ["Black", "Green", "Yellow", "Red"];
    const found = arr.includes("Green"); //returns true
  • find/filter(func) – filter elements through the function, return first/all values that
    make it return true.
    Example:
    const arrAge = [15, 18, 21, 12];
    const arrFiltered = arrAge.filter(function(currentValue, index, arr){
    return currentValue > 15 }); //returns all ages greater than 18 i.e [18, 21]
    const intFind = arrAge.find(function(currentValue, index, arr){ return currentValue > 18 }); //returns the first age found greater than 18 i.e 21
  • findIndex –  is like find, but returns the index instead of a value.
    Example:
    const arrAge = [15, 18, 21, 12];
    const intIndexFound = arrAge.findIndex(function(currentValue, index, arr){ return currentValue > 15 }); //returns the first index of
    age found greater than 15 i.e 1
To iterate over elements:
  • forEach(func) – calls func for every element, does not return anything.
    Example:
    const arrAge = [15, 18, 21, 12];
    arrAge.forEach(function(item, index, arr){ arr[index] = item * 2; }); //[30,36,42,24]
To transform the array:
  • map(func) – creates a new array from results of calling func for every element.
    Example:
    let arr = [15, 18, 21, 12];
    arr = arr.map(int => { return int * 2 } );
    //[30,36,42,24]
  • sort(func) – sorts the array in-place, then returns it.
    Example:
    let arr = [15, 18, 21, 12];
    arr.sort((a, b) => (a > b ? -1 : 1));
    //[12,15,18,21]
  • reverse() – reverses the array in-place, then returns it.
    Example:
    let arr = [15, 18, 21, 12];
    arr.reverse(); //[12,21,18,15]
  • split/join – convert a string to array and back.
    Example:
    //split const str = "Hello There";
    const arr = str.split(" "); //returns ["Hello",
    "There"] //join
    const arr = [12,21,18,15]; arr.join() // Returns "12,21,18,15"
  • reduce/reduceRight(func, initial) – calculate a single value over the array by
    calling func for each element and passing an intermediate result between the calls.
Other Functions:
  • Array.isArray(arr) checks arr for being an array.

Please note that methods sortreverse and splice modify the array itself. These
methods are the most used ones, they cover 99% of use cases.

Categories
Javascript VueJS

Vue Essentials Cheat Sheet

Attached cheatsheet from Vue Mastery that contains most common and essential documentation on VueJS.

Vue-Essentials-Cheat-Sheet