LOADING...

Hot

Monday, January 28, 2019

January 28, 2019

Pengulangan (Loop) Yang Baik Dalam Javascript



Pengulangan (Loop) Yang Baik Dalam Javascript - Pada artikel kali ini kita akan membahas tentang looping atau pengulangan, dengan menggunakan for loop dan metode array supaya koding kita terlihat rapi dan mudah di baca. Looping atau pengulangan berguna ketika kalian ingin memanipulasi data dalam sebuah array atau objek.

For in loop

Dengan menggunakan for in loop kalian tidak perlu mengiterasi atau mengulangi indeks array atau objek key secara manual.

//iterasi pada array
let arr = [1, 2, 3, 4, 5]
for (let index in arr) {
console.log(arr[index])
}
// Output: 1,2,3,4,5

//iterasi pada objek
let obj = { id: 1, msg: 'haii cantik..' }
for (let key in obj) {
console.log(obj[key])
}
// Output: 1, haii cantik..

For of loop

Dengan menggunakan for of loop kalian bisa mendapatkan nilai pada indeks tertentu, pengulangan ini hanya bisa digunakan pada array.

let arr = [1, 2, 3, 4, 5]
for (let val of arr) {
console.log(val)
}
// Output: 1,2,3,4,5

Metode Array

Sekarang kita lihat beberapa pengulangan dengan metode array.

Iterasi pada sebuah array

Kalian bisa menggunakan metode array.forEach(). Metode ini mengambil callback sebagai argumen dan mengeksekusi setiap elemen pada array.

// menampilkan index dan value
let arr = [1, 2, 3, 4, 5]
arr.forEach((value, index) => console.log(`Index = ${index} Value = ${value}`))
// Output: Index = 0 Value = 1, dst.

Transformasi pada array

Untuk mentransformasi sebuah array kedalam array baru kalian bisa menggunakan metode array.map(). Metode ini mengambil callback sebagai argumen dan mengembalikan array baru. Elemen pada array baru adalah nilai yang dikembalikan oleh callback.
Sebagai contoh kalian mempunyai sebuah objek yang berisi id dan nama, kalian ingin membuat array baru yang berisi id saja.

Dengan menggunakan For loop
let data = [
{ id: 1, name: 'Kucing', type: 'mamalia' },
{ id: 2, name: 'Tikus', type: 'mamalia' },
{ id: 3, name: 'Ayam', type: 'unggas' },
]
let ids = []
for (let i = 0; i < data.length; i++) {   ids.push(data[i].id) }

Dengan menggunakan map()
let ids = data.map(function(val) {   return val.id })

Atau lebih simpel lagi menggunakan arrow function
let ids = data.map(val => val.id)

Memfilter elemen dari array

Untuk memfilter elemen dari sebuah array kalian bisa gunakan metode array.filter(). Metode filter() membutuhkan sebuah callback, callback ini akan di eksekusi pada setiap elemen dalam array dan membuat array baru yang dengan elemen yang sudah di filter. Jika fungsi callback bernilai true maka elemen tersebut akan masuk ke array baru.

Memfilter item mamalia
let mamalia = data.filter(item => item.type == 'mamalia')

Mencari sebuah elemen dalam array

Jika kalian ingin mencari sebuah elemen dalam array kalian bisa gunakan metode array.find(). Seperti metode-metode sebelumnya metode ini membutuhkan sebuah callback. Fungsi callback harus bernilai true atau false. Nilai pertama yang bernilai true akan menjadi output metode ini. Jika tidak ada yang bernilai true maka outputnya undefined.

Mencari nama
data.find(val => val.name == 'Kucing')

Mendapatkan nilai tunggal dari sebuah array

Untuk mendapatkan nilai tunggal dari sebuah array kalian bisa gunakan metode array.reduce(). Metode ini mengambil callback sebagai argumen. Fungsi callback mempunyai accumulator dan currentValue. Accumulator berisi sebuah nilai yang sebelumnya di eksekusi callback, currentValue adalah elemen array yang sedang diproses.

let arr = [1, 2, 3, 4, 5]

// sum dari elemen array
arr.reduce((accumulator, currentValue) => (accumulator + currentValue), 0)
// 0 adalah initial value
// Output: 0+1+2+3+4+5 = 15

// product dari elemen array
arr.reduce((accumulator, currentValue) => (accumulator * currentValue), 1)
// 1 adalah initial value
// Output: 1*2*3*4*5 = 120

Memeriksa apakah suatu kondisi bernilai true atau salah satunya bernilai true

Untuk memeriksa apakah suatu kondisi bernilai true atau salah satunya bernilai true kalian bisa gunakan metode array.some(). Metode ini akan menghasilkan output true jika salah satu elemen memenuhi kondisi dan akan menghasilkan output false jika tidak ada.

let umur = [13, 15, 16, 18] // umur teman

// cek jika salah satu nya lebih dari 16 tahun
friends.some(val => val >= 16) // true

Memeriksa apakah suatu kondisi bernilai true untuk semua elemen dalam array

Untuk memeriksa apakah suatu kondisi  bernilai true untuk semua elemen dalam array kalian bisa gunakan metode array.every(). Metode ini akan mengembalikan true jika suatu kondisi benar untuk semua elemen dalam array, jika tidak maka akan kembali false.

let hargaKado = [300, 350, 399, 400]
let modal = 450
let cekModal = harga => harga <= modal
hargaKado.every(cekModal) // true
modal = 300
hargaKado.every(cekModal) // false

End mabro!

Nah begitulah Pengulangan (Loop) Yang Baik Dalam Javascript (menurut saya :V). Untuk lebih lengkapnya kalian bisa buka dokumentasi MDN disini. Semoga artikel ini bermanfaat, Terimakasih.

Selamat koding guys.

Sunday, January 13, 2019

January 13, 2019

5 Tips Cara Menulis Conditional (If-Else atau Switch-Case) Dengan Javascript Yang Baik

5 Tips Cara Menulis Conditional (If-Else atau Switch-Case) Dengan Javascript Yang Baik - Ketika kita bekerja dengan Javascript, kita banyak sekali berurusan dengan conditional, berikut adalah 5 tips bagi kalian untuk menulis conditional yang lebih baik.

1. Gunakan Array.includes

Mari kita lihat contoh dibawah ini:
// kondisi
function test(buah) {
  if (buah == 'apel' || buah == 'stroberi') {
    console.log('merah');
  }
}/code>
Sekilas, contoh di atas terlihat bagus. Namun, bagaimana jika kita mendapat lebih banyak buah berwarna merah, seperti ceri dan arbei?
Apakah kalian akan memperpanjang code dengan lebih banyak ||?

Kita bisa menulis ulang code di atas dengan menggunakan Array.includes (Array.includes).
function test(buah) {
  // buat kondisi kedalam array
  const buahMerah = ['apel', 'stroberi', 'ceri', 'arbei'];

  if (buahMerah.includes(buah)) {
    console.log('merah');
  }
}
Kita buat kondisi kedalam sebuah array. Dengan begitu code kita akan terlihat lebih rapi.

2. Kurangi if bersarang

Mari kita perluas contoh sebelumnya dengan menambah 2 kondisi.
  • Jika tidak ada buah, tampilkan pesan eror
  • Terima dan tampilkan jumlah buah jika melebihi 10
function test(buah, jumlah) {
  const buahMerah = ['apel', 'stroberi', 'ceri', 'arbei'];

  // kondisi 1: buah harus memiliki nilai
  if (buah) {
    // kondisi 2: harus merah
    if (buahMerah.includes(buah)) {
      console.log('merah');

      // kondisi 3: harus lebih dari 10
      if (jumlah > 10) {
        console.log('jumlahnya banyak');
      }
    }
  } else {
    throw new Error('Tidak ada buah!');
  }
}

// hasil test 
test(null); // error: Tidak ada buah!
test('apel'); // print: merah
test('apel', 20); // print: merah, jumlahnya banyak

Lihat code di atas, kita punya:
  • 1 if/else statement yang memfilter kondisi yang tidak valid
  • 3 level if bersarang (kondisi 1, 2 & 3)
Aturan umum yang saya ikuti secara pribadi adalah me-return di awal jika kondisi yang tidak valid ditemukan.
function test(buah, jumlah) {
  const buahMerah = ['apel', 'stroberi', 'ceri', 'arbei'];

  // kondisi 1: lempar pesan error di awal
  if (!buah) throw new Error('Tidak Ada Buah!');

  // kondisi 2: harus merah
  if (buahMerah.includes(buah)) {
    console.log('merah');

    // kondisi 3: harus jumlahnya banyak
    if (jumlaj > 10) {
      console.log('jumlahnya banyak');
    }
  }
}
Dengan code ini, kita memiliki 1 level kondisi bersarang yang lebih sedikit. Gaya koding (coding) seperti ini baik terutama ketika kalian memiliki statement yang lebih panjang (bayangkan kalian harus scroll terus kebawah untuk mengetahui keberadaan else statement, not cool bro :V)

Kita selanjutnya bisa mengurangi 1 level kondisi bersarang, langsung saja kita lihat kondisi 2 di bawah ini.
function test(buah, jumlah) {
  const buahMerah = ['apel', 'stroberi', 'ceri', 'arbei'];

  // kondisi 1: lempar pesan error di awal
  if (!buah) throw new Error('Tidak Ada Buah!');

  // kondisi 2: berhenti ketika buah tidak merah
  if (!buahMerah.includes(buah)) return; 

  console.log('merah');

  // kondisi 3: harus banyak jumlahnya
  if (jumlah > 10) {
    console.log('jumlahnya banyak');
  }
}

Dengan mengubah kondisi dari kondisi 2, sekarang code kita bebas dari kondisi bersarang. Teknik ini berguna ketika kita mempunyai logic yang sangat panjang dan kita ingin menghentikan proses lebih lanjut ketika suatu kondisi tidak terpenuhi.

3. Gunakan default function parameter dan destructuring

Menurut saya code dibawah ini sudah tidak asing lagi bagi kalian, kita selalu mengecek nilai null atau undefined dan memberi nilai default ketika bekerja dengan javascript.
function test(buah, jumlah) {
  if (!buah) return;
  const j = jumlah|| 1; // jika jumlah tidak tersedia, maka nilai default 1

  console.log(`Kita punya ${j} ${buah}!`);
}

//hasil test
test('pisang'); // kita punya 1 pisang!
test('apel', 2); // kita punya 2 apel!
Faktanya kita dapat menghapus variabel j dengan memberi nilai default pada parameter
function test(buah, jumlah= 1) { // jika jumlah tidak tersedia, maka nilai default 1
  if (!buah) return;
  console.log(`Kita punya ${jumlah} ${buah}!`);
}

//hasil test
test('pisang'); // kita punya 1 pisang!
test('apel', 2); // kita punya 2 apel!
Lebih mudah bukan? setiap parameter bisa mempunyai deafult function parameter. Contohnya, kita bisa memberi nilai default untuk buah: function test(buah = 'unknown', jumlah = 1).

Bagaimana jika buah adalah sebuah object? Bisakah kita memberi nilai parameter default?
function test(buah) { 
  // tampilkan nama buah jika tersedia
  if (buah && buah.nama)  {
    console.log (buah.nama);
  } else {
    console.log('unknown');
  }
}

//hasil test
test(undefined); // unknown
test({ }); // unknown
test({ nama: 'apel', warna: 'merah' }); // apel
Lihat contoh diatas, kita ingin menampilkan nama buah jika tersedia atau menampilkan unknown jika tidak tersedia. Kita bisa hindari menggunakan conditional buah && buah.nama dengan default function parameter & destructing.
// destructing - ambil properti nama saja
// memberi default object {} kosong
function test({nama} = {}) {
  console.log (nama || 'unknown');
}

//hasil test
test(undefined); // unknown
test({ }); // unknown
test({ nama: 'apel', warna: 'merah' }); // apel
Karena kita hanya butuh properti nama dari buah, kita dapat destructure parameter menggunakan {nama}. Lalu kita bisa gunakan nama sebagai variabel dalam koding kita daripada pakai buah.nama.

Kita juga memberi object {} kosong sebagai nilai default, jika tidak di kasih objek kosong maka koding kalian akan muncul eror seperti ini test(undefined) - Cannot destructure property name of 'undefined' or 'null'.

4. Gunakan Map/ Object literal

Lihat koding dibawah ini, kita ingin menampilkan buah sesuai warna.
function test(warna) {
  // Menggunakan switch untuk menampilkan buah sesuai warna
  switch (warna) {
    case 'merah':
      return ['apel', 'stroberi'];
    case 'kuning':
      return ['pisang', 'nanas'];
    case 'ungu':
      return ['anggur', 'plum'];
    default:
      return [];
  }
}

//hasil test
test(null); // []
test('kuning'); // ['pisang', 'nanas']
Tidak ada yang salah dari koding diatas, tapi menurut saya koding nya kebanyakan. Kita bisa mendapatkan hasil yang sama menggunakan object literal dengan lebih sedikit koding.
// Menggunakan object literal untuk menampilkan buah sesuai warna
  const fruitColor = {
    red: ['apple', 'strawberry'],
    yellow: ['banana', 'pineapple'],
    purple: ['grape', 'plum']
  };

function test(color) {
  return fruitColor[color] || [];
}
Alternatifnya kalian bisa gunakan Map untuk mendapatkan hasil yang sama.
// Menggunakan Map untuk menampilkan buah sesuai warna
  const warnaBuah = new Map()
    .set('merah', ['apel', 'stroberi'])
    .set('kuning', ['pisang', 'nanas'])
    .set('ungu', ['anggur', 'plum']);

function test(warna) {
  return warnaBuah.get(warna) || [];
}
Atau kalian bisa gunakan Array.filter
const buah = [
    { nama: 'apel', warna: 'merah' }, 
    { nama: 'stroberi', warna: 'merah' }, 
    { nama: 'pisang', warna: 'kuning' }, 
    { nama: 'nanas', warna: 'kuning' }, 
    { nama: 'anggur', warna: 'ungu' }, 
    { nama: 'plum', warna: 'ungu' }
];

function test(warna) {
  // Menggunakan array.filter untuk menampilkan buah sesuai warna

  return buah.filter(f => f.warna == warna);
}
Banyak jalan menuju roma, sama seperti coding banyak cara untuk mendapatkan hasil yang sama. Koding is fun ma bro :V

5. Gunakan Array.every & Array.some 

Tips terakhir untuk kalian yaitu menggunakan fungsi javascript Array.every dan Array.some untuk semua atau beberapa kriteria. Contoh lihat koding dibawah untuk mengetahui apakah semua buah berwarna merah.
const buah = [
    { nama: 'apel', warna: 'merah' },
    { nama: 'pisang', warna: 'kuning' },
    { nama: 'anggur', warna: 'ungu' }
  ];

function test() {
  let semuaMerah = true;

  // kondisi: semua buah berwarna merah
  for (let b of buah) {
    if (!semuaMerah) break;
    semuaMerah = (b.warna == 'merah');
  }

  console.log(semuaMerah); // false
}
Dari koding diatas kita bisa mengurangi beberapa baris kode dengan Array.every.
const buah = [
    { nama: 'apel', warna: 'merah' },
    { nama: 'pisang', warna: 'kuning' },
    { nama: 'anggur', warna: 'ungu' }
  ];

function test() {
  // kondisi: semua buah berwarna merah
  const semuaMerah = buah.every(b => b.warna == 'merah');

  console.log(semuaMerah); // false
}
Gimana? :V . Dengan cara yang sama kita ingin mengetahui jika terdapat buah berwarna merah, kita gunakan Array.some
const buah = [
    { nama: 'apel', warna: 'merah' },
    { nama: 'pisang', warna: 'kuning' },
    { nama: 'anggur', warna: 'ungu' }
  ];

function test() {
  // kondisi: jika terdapat buah berwarna merah
  const adaBuahMerah = buah.some(b => b.warna == 'merah');

  console.log(adaBuahMerah); // true
}

Terakhir

Mari kita bersama-sama membuat kode lebih mudah dibaca. Supaya yang lagi belajar koding bisa cepat memahami koding tersebut. Nah begitulah 5 tips cara menulis conditional dengan javascript yang baik (menurut saya :V). Semoga artikel ini bermanfaat, Terimakasih.

Selamat koding guys.

Saturday, January 5, 2019

January 05, 2019

Cara Membuat Indikator Loading (Loading Indicators) Pada Aplikasi Vue.js


Cara Membuat Indikator Loading (Loading Indicators) Pada Aplikasi Vue.js - Indikator loading dapat meningkatkan UX (User Experience) pada sebuah aplikasi web atau mobile. Indikator loading memberitahukan user bahwa sebuah action atau proses sedang berjalan dan hasilnya bisa diketahui setelah itu.

Pada aplikasi web, ada 2 hal penting yang membutuhkan indikator loading (loader), yaitu:
  • Network request seperti navigasi ke halaman lain atau AJAX request.
  • Ketika proses yang memerlukan waktu lama sedang berjalan.
Tutorial ini akan menjelaskan cara membuat Indikator Loading (Loading Indicators) pada aplikasi Vue.js

Tipe-tipe indikator loading

Tipe indikator loading yang kalian gunakan pada website kalian bisa berefek negatif atau positif kepada user. Ada dua jenis indikator yang bisa kalian gunakan pada website.

Yang pertama adalah counter(penghitung). counter bisa berupa progress bar atau penghitung dari 0 sampai 100. Tipe indikator loading inilah yang paling efektif yang bisa memberikan user estimasi kapan proses yang sedang di jalakan akan selesai.

Yang kedua adalah loop(pengulangan). Tipe ini berupa animasi melingkar yang berulang. Contoh umumnya yang bisa kalian lihat pada website adalah spinner.

Indikator loading tipe counter adalah pilihan terbaik untuk proses yang berjalan lama, sedangkan indikator loading tipe loop sangat cocok untuk proses yang berjalan sebentar.

Jika kamu menggunakan indikator loading tipe loop untuk proses yang berjalan lama, ini bisa membuat user kesal dan membuat user berfikir bahwa website eror, proses yang berjalan gagal dan pemikiran-pemikiran negatif lainnya. Akhirnya user meninggalkan website tersebut (tentunya kalian tidak mau itu terjadi ya kan). Jadi untuk proses yang berjalan lama atau memakan waktu, hindari menggunakan indikator loading tipe loop.

Nah itu dia sekilas tentang indikator loading pada website, selanjutnya yo kita mulai saja tutorialnya, cuss...

Mulai

Pertama mari kita buat projek baru. Disini saya menggunakan Vue CLI untuk membuat aplikasi. Jika kalian belum tau tentang Vue CLI kalian bisa lihat disini .

vue create indikator

Selanjutnya kalian bisa memilih fitur apa saja yang mau di pasang pada aplikasi, untuk tutorial ini saya pilih Router dan Vuex. Kemudian enter dan tunggu sampai proses instalasi selesai.



Pada tutorial ini indikator loading yang saya gunakan adalah nprogress. Kalian bisa menggunakan indikator loading favorit kalian.

nprogress adalah sebuah progress bar yang berada di bagian paling atas aplikasi.

Supaya lebih cepat saya tidak akan menginstall nprogress menggunakan npm atau yarn. Langsung saja kita gunakan CDN.

Pada projek aplikasi yang telah di buat, buka file public/index.html dan tambahkan baris berikut sebelum tag </head>.

<link href="https://unpkg.com/nprogress@0.2.0/nprogress.css" rel="stylesheet" />
<script src="https://unpkg.com/nprogress@0.2.0/nprogress.js"></script>

Menggunakan nprogress
Nprogress memiliki beberapa function, tapi untuk tutorial ini saya akan menggunakan function start() dan function done(). Function ini berfungsi untuk memulai dan menghentikan progress bar.

Menggunakan Router

Ketika kalian menggunakan router untuk menampilkan progress bar, proses yang kita inginkan adalah ketika user membuka halaman baru, indikator loading muncul di atas halaman menampilkan kepada user proses menuju halaman berikutnya. Contoh:


Kabar baiknya adalah Vue router di lengkapi dengan hooks, kita bisa manfaatkan fitur tersebut, langsung saja..

Buka file src/router.js dan ganti isinya dengan code di bawah ini.

const router = new Router({
  routes: [
      { path: '/', name: 'home', component: Home },
      { path: '/about', name: 'about', component: About }
  ]
})

router.beforeResolve((to, from, next) => {
  // Jika ini bukan memuat halaman awal.
  if (to.name) {
      // Memulai route progress bar.
      NProgress.start()
  }
  next()
})

router.afterEach((to, from) => {
  // Menghentikan animasi route progress bar.
  NProgress.done()
})

export default router

Sebelum kita hook ke beforeResolve route, kita memberitahukan router untuk memulai nprogress setelah permintaan halaman terjadi. Kalau afterEach hook memberitahukan router ketika link sudah di load sepenuhnya untuk menghentikan nprogress, tidak masalah jika permintaan halaman berhasil.

Menggunakan HTTP library

Bagian lain yang akan kita tambahkan progress bar adalah ketika kita melakukan AJAX request.

Kebanyakan HTTP library mempunyai middleware atau interceptor yang di jalankan sebelum sebuah request atau response terjadi. Jadi kita bisa hook pada library pilihan kita.

Disini saya menggunakan axios, pada axios di sebut interceptor. cara install:
# for yarn
yarn add axios

# for npm
npm install --save axios

Selanjutnya kita konfigurasi axios seperti ini
// file HTTP.js
import axios from 'axios'

// membuat instance axios baru
const instance = axios.create({
  baseURL: '/api'
})

// sebelum request jalankan nprogress
instance.interceptors.request.use(config => {
  NProgress.start()
  return config
})

// sebelum response stop nprogress
instance.interceptors.response.use(response => {
  NProgress.done()
  return response
})

export default instance

Kemudian kita dapat gunakan file diatas untuk ngehandle connection dan menampilkan progress bar setiap kali request di buat.

Nahh sekian untuk tutorial membuat indikator loading pada aplikasi vue.js, cukup segini dulu yang bisa saya berikan, apabila ada kekurangan nanti saya update artikel ini. Semoga bermanfaat.

Kesimpulan

Mungkin di luar sana banyak cara untuk membuat indikator loading pada aplikasi vue.js yang belum saya ketahui. Dan juga beberapa plugin yang bagus, tapi di sini saya pengen tau bagaimana cara kerjanya.

Apabila ada kesalahan kalian bisa tanyakan atau koreksi di kolom komentar.

Terimakasih 😁