AdityaDees: Vue.js

Hot

https://publishers.chitika.com/

Contact us for advertising.
Showing posts with label Vue.js. Show all posts
Showing posts with label Vue.js. Show all posts

10 September 2021

Ask Cara insert data ke dalam list atau table tanpa menutup Modal AdityaDees

11:11 0
Vue

Desain halaman dan dialog tambah data biasanya adalah, User klik tombol yang akan memunculkan dialog, dimana dialog akan otomatis tertutup setelah User menekan tombol simpan dan proses simpan berhasil. Tetapi, adakalanya User ingin dialog tidak otomatis tertutup setelah berhasil simpan data. Ini biasanya berguna jika perlu input banyak data sekaligus. Kali ini kita akan mencoba meng-implementasikan kebutuhan insert data tanpa menutup modal dengan menggunakan Vue.js.

Untuk contoh ini, penulis menggunakan UI framework Vue Material. Anda tidak harus menggunakan Vue Material, yang penting framework yang anda gunakan menyediakan komponen Modal.

Kemudian yang paling penting, solusi ini akan menjadi berguna jika komponen halaman utama/daftar terpisah dengan dialog. Maksudnya, jika halaman utama dan dialog tidak dipisah, maka solusi ini menjadi kurang menarik karena bisa langsung Anda selesaikan dengan mudah dengan memodifikasi langsung state-nya.

Jika halaman utama dan dialog dipisah, maka akan menjadi lebih menarik dan modular, dimana sekarang Modal/Dialog tidak boleh bergantung dengan parent yang memanggil dia.

0. Membuat halaman utama dan modal secara terpisah

Seperti disebutkan disebutkan sebelumnya, kita akan membuat 2 buah komponen, yaitu halaman utama dan dialog. Secara umum struktur folder dan file yang saya buat kurang lebih seperti gambar dibawah ini.

Struktur file dan folder

Komponen untamanya adalah App.vue, sedangkan komponen untuk modal dialognya adalah Modal.vue yang berada di folder components.

App.vue
<template>
<div id="app">
<md-toolbar>
<md-button @click="addData" class="md-primary">Add Data</md-button>
</md-toolbar>
<md-list class="md-double-line">
<md-list-item v-for="(i, index) in items" :key="index">
<div class="md-list-item-text">
<span>{{ i.nama }}</span>
<span>{{ i.alamat }}</span>
</div>
</md-list-item>
</md-list>
<Modal ref="dlg" />
</div>
</template>

<script>
import Modal from "./components/Modal";
export default {
name: "App",
data() {
return {
items: [
{ nama: "Fulan", alamat: "Jl. Berbatu nan terjal" },
{ nama: "Fulana", alamat: "Jl. Berkelok nan menanjak" },
],
};
},
components: {
Modal,
},
methods: {
addData() {
this.$refs.dlg.open();
},
},
};
</script>
Modal.vue
<template>
<md-dialog :md-active.sync="showDialog">
<md-dialog-title>Add data</md-dialog-title>
<md-card>
<md-card-content>
<md-field>
<label>Nama</label>
<md-input v-model="nama"></md-input>
</md-field>

<md-field>
<label>Alamat</label>
<md-textarea v-model="alamat"></md-textarea>
</md-field>
</md-card-content>
</md-card>
<md-dialog-actions>
<md-button class="md-primary" @click="showDialog = false"
>Close</md-button
>
<md-button class="md-primary" @click="apply">Save</md-button>
</md-dialog-actions>
</md-dialog>
</template>

<script>
export default {
data() {
return {
showDialog: false,
resolve: null,
reject: null,

nama: "",
alamat: "",
};
},
methods: {
open() {
return new Promise((resolve, reject) => {
this.resolve = resolve;
this.reject = reject;
this.showDialog = true;
});
},
apply() {},
},
};
</script>

<style>
</style>

Tampilan awalnya kurang lebih seperti ini.

Tampilan awal

Pada kode awal di atas. Pada halaman utama (App.vue), user akan menekan tombol Add Data yang akan membuka dialog. Setelah user mengisi dan menekan tombol Save, maka data akan otomatis bertambah pada halaman utama tanpa perlu menutup Dialog.


Baca juga :
Vue+Vuetify : Menggunakan VDialog/v-dialog agar menjadi Promise based komponen
1. Komunikasi Child to Parent dengan menggunakan event

Design halaman Utama dengan Modal seperti ini bisa disebut dengan Parent (App.vue) Child (Modal.vue). Komponen Modal perlu berkomunikasi dengan Parent (yang memanggil) pada saat ditekan tombol Save. Maka solusinya adalah dengan menggunakan custom event yang dikirim dengan menggunakan $emit.

Untuk contoh ini, kita akan menambahkan custom event bernama on-save di komponen Modal.vue, yang akan di trigger pada saat user menekan tombol save. Pada contoh ini, pada saat tombol Save ditekan, akan memanggil method apply.

Tambahkan custom event dengan menggunakan $emit(<nama event>,<data yang dikirim>) pada method apply di komponen Modal.vue.

<template>
...
</template>

<script>
export default {
...
methods: {
...
apply() {
this.$emit("on-save", {
nama: this.nama,
alamat: this.alamat,
});
// reset
this.nama = "";
this.alamat = "";
},
},
};
</script>
on-save adalah nama custom event yang di trigger. Dan data yang dikirimkan adalah object yang berisi nama dan alamat yang diinput user.

Untuk menangkap event on-save ini, silahkan tambahkan v-on:<nama_event> di halaman utama (App.vue). Dalam hal ini adalah v-on:on-save atau disingkat dengan @on-save.

<template>
<div id="app">
...
<Modal ref="dlg" v-on:on-save="simpan" />
</div>
</template>

<script>
import Modal from "./components/Modal";
export default {
...
methods: {
...
simpan(obj) {
this.items.push(obj);
},
},
};
</script>
v-on:on-save="simpan" artinya, pada saat terjadi event on-save pada komponen Modal, panggil method simpan. Dimana pada method simpan, data yang diinput akan dimasukkan ke dalam array.

Di bawah ini kira-kira hasil akhirnya.

Mudah sekali bukan. Dalam banyak kasus, custom event ini akan sangat membantu aliran data child ke parent. Dimana hal ini akan sering terjadi jika Anda membagi aplikasi ke dalam komponen-komponen terpisah, yang harus saling berkomunikasi.

Sekian tip/trik kali ini. Selamat mencoba dan semoga yang sedikit ini bermanfaat.

Read More

04 September 2021

Ask Cara install dan integrasi GrapesJS dengan Vue 2 AdityaDees

08:17 0

GrapesJS adalah sebuah Web Builder Framework yang gratis dan opensource yang ditujukan untuk mempermudah pengguna dalam membuat template HTML tanpa pengetahuan coding sama sekali. GrapeJS ini juga dapat diintegrasikan ke dalam framework javascript lain seperti Angular, Reactjs atau Vue. Berikut ini adalah salah satu cara untuk meng-install dan meng-integrasikan GrapesJS ke dalam Vue 2.

Sebelum lanjut, pastikan Anda sudah meng-install node.js yang secara otomatis sudah termasuk npm. Bisa juga Anda meng-install yarn sebagai alternatif lain dari npm.


Baca juga :
Apakah Node.js, npm dan bagaimana menginstallnya
0. Menyiapkan project Vue 2

Jika Anda belum membuat project vue, maka silahkan buat terlebih dahulu, bisa dengan menggunakan vue cli atau dengan cara manual.

vue create test_grapesjs

Silahkan buka project Vue Anda dengan menggunakan text editor. Jika Anda baru membuat project Vue dengan cli seperti contoh di atas, maka di bawah ini tampilan struktur project Anda.

Silahkan buka komponen App.vue lalu hapus komponen-komponen dan css yang tidak diperlukan. Untuk contoh ini, kita tidak membutuhkan komponen HelloWorld dan css untuk id #app. Seperti ini kira-kira struktur akhir dari komponen App.vue

1. Install/menambahkan GrapesJS

Dengan menggunakan Terminal kesayangan Anda, silahkan masuk ke dalam folder tempat project Anda berada. Kemudian jalankan perintah yarn add grapesjs jika Anda menggunakan yarnatau npm i grapesjs jika Anda menggunakan npm.

2. Import GrapesJS

Setelah Anda meng-install GrapesJS, maka selanjutnya kita akan tambahkan GrapesJS ke dalam project dengan cara import langsung ke komponen App.vue.

Anda bisa saja membuat komponen terpisah untuk GrapesJS ini, akan tetapi kali ini kita akan langsung menambahkan GrapesJS ke dalam App.vue karena lebih mudah dan sederhanan.

Silahkan import GrapesJS beserta css nya seperti kode di bawah ini.

<template>
<div id="app">
</div>
</template>

<script>
import grapesJS from "grapesjs";
import "grapesjs/dist/css/grapes.min.css";

export default {
name: 'App',
}
</script>

<style>
</style>


Baca juga :
Apakah Node.js, npm dan bagaimana menginstallnya
3. Render GrapesJS

Untuk me-render atau memasang GrapesJS, maka kita bisa menggunakan event mounted dari Vue. Silahkan tuliskan kode seperti di bawah ini di dalam event mounted.

export default {
name: "App",
mounted() {
grapesJS.init({
showOffsets: 1,
fromElement: 1,
container: "#app",
height: "100%",
avoidInlineStyle: false,
plugins: [],
pluginsOpts: {
},
});
},
};
Yang perlu diperhatikan di sini adalah pada property container. Untuk contoh ini diisi dengan #app dikarenakan editor GrapesJS ini akan ditempelkan pada <div id="app">. Silahkan sesuaikan dengan id dari div yang Anda gunakan.

Sampai disini, silahkan coba jalankan aplikasi ini dengan menggunakan perintah yarn serve.

Untuk melihat hasilnya, silahkan buka Browser kemudian tuliskan alamat yang tertera pada hasil yarn serve pada bagian Local. Untuk contoh di atas pada alamat localhost:8082. Bisa jadi ini berbeda dengan milik Anda. Tampak hasilnya kurang begitu sesuai. Hal ini karena kita masih harus melakukan beberapa penyesuaian style.

4. Penyesuaian style

Untuk memperbaiki tmapilan dari editor GrapesJS di atas, maka silahkan tambahkan style berikut ini di bagian bawah dari App.vue.

<template>
<div id="app"></div>
</template>

<script>
import grapesJS from "grapesjs";
import "grapesjs/dist/css/grapes.min.css";

export default {
name: "App",
mounted() {
grapesJS.init({
showOffsets: 1,
fromElement: 1,
container: "#app",
height: "100%",
avoidInlineStyle: false,
plugins: [],
pluginsOpts: {},
});
},
};
</script>

<style>
body,
html {
height: 100%;
margin: 0;
}
</style>

Maka hasilnya akan menjadi lebih baik.

5. Menambahkan Preset

Jika Anda perhatikan hasil di atas, maka tampak editor GrapesJS tersebut masih kosong dari toolbox (komponen drag drop masih kosong). Hal ini dikarenakan kita belum menambahkan preset ke dalam GrapesJS. Preset ini sederhananya adalah kumpulan setting dan komponen untuk membangun editor GrapesJS. Berikut ini adalah beberapa preset yang sudah disediakan oleh GrapesJS.

Untuk kali ini, kita akan mencoba menggunakan preset untuk Webpage Builder. Silahkan tambahkan package grapesjs-preset-webpage ke dalam project dengan menggunakan perintah yarn di bawah ini.

yarn add grapesjs-preset-webpage
atau dengan npm.
npm i grapesjs-preset-webpage

Kemudian tambahkan grapesjs-preset-webpage ke dalam GrapesJS sebagai berikut:

import grapesWEB from "grapesjs-preset-webpage";
import "grapesjs-preset-webpage/dist/grapesjs-preset-webpage.min.css";

export default {
name: "App",
mounted() {
grapesJS.init({
showOffsets: 1,
fromElement: 1,
container: "#app",
height: "100%",
avoidInlineStyle: false,
plugins: [grapesWEB],
pluginsOpts: {
[grapesWEB]: {
// options
},
},
});
},
};

Maka tampilan GrapesJS akan berubah menjadi Web Builder dengan toolbox yang lebih lengkap.

Keseluruhan kode App.vue

<template>
<div id="app"></div>
</template>

<script>
import grapesJS from "grapesjs";
import "grapesjs/dist/css/grapes.min.css";

import grapesWEB from "grapesjs-preset-webpage";
import "grapesjs-preset-webpage/dist/grapesjs-preset-webpage.min.css";

export default {
name: "App",
mounted() {
grapesJS.init({
showOffsets: 1,
fromElement: 1,
container: "#app",
height: "100%",
avoidInlineStyle: false,
plugins: [grapesWEB],
pluginsOpts: {
[grapesWEB]: {
// options
},
},
});
},
};
</script>

<style>
body,
html {
height: 100%;
margin: 0;
}
</style>

Dengan ini maka Anda sudah berhasil meng-integrasikan GrapesJS ke dalam Vue. Selanjutnya silahkan lakukan eksperimen dengan menggunakan preset yang lain atau bahkan membuat plugin sendiri sesuai dengan kebutuhan.

Sekian tip dan trik kali ini.Selamat mencoba dan semoga yang sedikit ini bermanfaat.

Sumber : https://github.com/artf/grapesjs

Read More

31 December 2020

Ask Cara mudah menghilangkan flicker {{ }} di vue.js AdityaDees

07:48 0

Jika Anda membuat sebuah webapp atau blog atau yang sejenis dengan menggunakan vue.js, maka Anda mungkin akan menemui sedikit masalah yang mengganggu, yaitu kadang akan muncul seperti flicker karakter {{ }} pada saat halaman terbuka. Memang hanya beberapa milisecond saja, tetapi lama kelamaan akan terasa sangat mengganggu. Masalah ini hampir pasti muncul pada saat Anda menggunakan vue.js tidak sebagai SPA, melainkan sebagai library biasa yang digunakan langsung di halaman web. Lalu apa penyabab masalah flicker ini dan bagaimana solusinya ?

Masalah flicker ini disebabkan oleh proses rendering template vue yang di dalamnya terdapat mustache tag yaitu {{ }}. Proses rendering template ini akan dilakukan setelah vue.js selesai di load oleh Browser, sehingga ada jeda waktu antara loading library vue.js dan halaman web yang sudah terlanjur muncul.

Ada berapa solusi yang bisa dicoba untuk menghindari flicker ini terjadi. Beberapa diantaranya adalah sebagai berikut.

1. Mengubah posisi loading vue.js dari sebelum akhir body menjadi di atas body.

Jika dalam kondisi normal Anda biasanya menempatkan posisi script di bagian akhir dari body, seperti contoh di bawah ini :

<!DOCTYPE html>
<html>
<head>
<title>Apa kabar dunia</title>
<style>
.tengah {
text-align: center;
}
</style>
</head>
<body>
<div id="app">
<h3 class="tengah">{{ message }}</h3>
<span>Halo, perkenalkan nama saya <b>{{nama}}</b>, saya saat ini tinggal di <b>{{ alamat }}</b>.</span>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
var app = new Vue({
el: "#app",
data: {
message: "Apa kabar dunia",
nama : "Fulan bin Fulan",
alamat : "Indonesia"
}
});
</script>
</body>
</html>

Pada kode di atas, vue.js di load dari cdn.jsdelivr.net diposisi akhir body, sebelum script aplikasi. Kode dengan pola seperti inilah yang akan menyebabkan ada flicker {{ message }} selama beberapa saat.

Untuk menghilangkan flicker, cara yang paling mudah adalah dengan memindahkan loading vue.js ke head, seperti contoh di bawah ini.

<!DOCTYPE html>
<html>
<head>
<title>Apa kabar dunia</title>
<style>
.tengah {
text-align: center;
}
</style>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
<div id="app">
<h3 class="tengah">{{ message }}</h3>
<span>Halo, perkenalkan nama saya <b>{{nama}}</b>, saya saat ini tinggal di <b>{{ alamat }}</b>.</span>
</div>
<script>
var app = new Vue({
el: "#app",
data: {
message: "Apa kabar dunia",
nama : "Fulan bin Fulan",
alamat : "Indonesia"
}
});
</script>
</body>
</html>

Cara ini sangat mudah, tetapi sebenarnya sangat tidak disarankan, karena akan menambah loading time dari halaman web. Ada blocking time dimana browser akan menunggu sampai dengan vue.js selesai di get dari server baru melanjutkan proses render. Jadi, jika anda memilih untuk menggunakan solusi ini, pastikan anda menggunakan library vue.js versi production.

2. Menggunakan v-text

Alternatif lain untuk menghilangkan flicker adalah dengan menggunakan v-text pada tag tempat mustache tag berada. Untuk contoh di atas, kita bisa pindahkan {{ message }} , dan {{ nama }} dan {{ alamat }} masing-masing ke dalam blok dimana dia berada.

<!DOCTYPE html>
<html>
<head>
<title>Apa kabar dunia</title>
<style>
.tengah {
text-align: center;
}
</style>
</head>
<body>
<div id="app">
<h3 class="tengah" v-text="message"></h3>
<span>Halo, perkenalkan nama saya <b v-text="nama"></b>, saya saat ini tinggal di <b v-text="alamat"></b>.</span>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
var app = new Vue({
el: "#app",
data: {
message: "Apa kabar dunia",
nama : "Fulan bin Fulan",
alamat : "Indonesia"
}
});
</script>
</body>
</html>

Dengan menggunakan solusi ini, maka flicker akan hilang dikarenakan meskipun vue.js ditempatkan di akhir body, akan tetapi karena di dalam div tersebut kosong, maka tidak akan ada yang di render pada saat awal halaman tersebut muncul. Bandingkan dengan sebelumnya yang di dalam divterdapat mustache tag {{ message }}.

Akan tetapi, solusi ini hanya cocok jika Anda menggunakan sedikit mustache tag. Jika Anda menggunakan banyak sekali mustache tag, maka Anda mungkin akan kerepotan karena harus mengganti mustache tag menjadi v-text dibanyak tempat.

3. Menggunakan v-cloak

Mungkin solusi ini yang paling cocok disebagian besar keadaan. Yaitu dengan menggunakan v-clock untuk menyembunyikan mustache tag sampai dengan library vue.js selesai di-load oleh browser. Untuk menggunakan fitur v-cloak ini, langkah pertama yang harus dilakukan adalah menambahkan css untuk meng-hidden v-cloak secara default. Silahkan tambahkan css ini ke dalam head atau external css di dalam head.

<style>
[v-cloak] {display: none}
</style>

Kemudian, silahkan tambahkan v-cloak pada blok yang terdapat mustache tag. Pada contoh di atas adalah pada div.

<!DOCTYPE html>
<html>
<head>
<title>Apa kabar dunia</title>
<style>
[v-cloak] {display: none}
.tengah {
text-align: center;
}
</style>
</head>
<body>
<div id="app" v-cloak>
<h3 class="tengah">{{ message }}</h3>
<span>Halo, perkenalkan nama saya <b>{{nama}}</b>, saya saat ini tinggal di <b>{{ alamat }}</b>.</span>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
var app = new Vue({
el: "#app",
data: {
message: "Apa kabar dunia",
nama : "Fulan bin Fulan",
alamat : "Indonesia"
}
});
</script>
</body>
</html>

Dengan menggunakan v-cloak ini, Anda hanya perlu menambahkan 1 baris css dan menempatkan v-cloak hanya di 1 tempat saja (di-root aplikasi) atau mungkin hanya di beberapa tempat saja. Bandingkan dengan jika Anda menggunakan v-text, dimana Anda harus menambahkan v-text disemua tempat yang menggunakan mustache tag.

Kesimpulan

Dari beberapa aklternatif solusi di atas, silahkan pilih dan gunakan solusi mana yang paling sesuai dengan kebutuhan Anda. Untuk saya pribadi, solusi yang paling cocok dan saya gunakan sampai saat ini adalah yang menggunakan v-cloak

Sekian tip dan trik kali ini. Selamat mencoba dan semoga yang sedikit ini bermanfaat.

Sumber :
https://vuejs.org/v2/api/#Directives

Read More

25 July 2019

Ask Vuetify 2 resmi dirilis, berikut ini fitur-fitur baru dan breaking changes yang perlu diantisipasi AdityaDees

10:45 0

Setelah beberapa bulan melewati fase alfa dan beta, kini Vuetify 2 versi final secara resmi telah dirilis. Menggunakan code-name Arcadia, Vuetify 2 menawarkan banyak perbaikan dan tentunya hal-hal baru dari versi sebelumnya, mulai dari perubahan core, grid, implementasi Material Design 2 dan komponen-komponen baru lainnya. 

Perubahan utama

Berikut ini adalah beberapa perubahan besar Vuetify 2:

  • check Complete update to Material Design 2
  • check Converted from Javascript to Typescript
  • check Converted from Stylus to Sass
  • check Converted from avoriaz to vue-test-utils
Komponen baru

Selain komponen-komponen lama yang diperbarui, Vuetify 2 dilengkapi dengan komponen-komponen baru sebagai berikut :

v-app-bar
v-banner
v-chip-group
v-color-picker
v-file-input

Akhirnya komponen yang paling dinanti !!!

v-list-item-group
v-overlay
v-simple-table
v-slide-group
Panduan Upgrade

Vuetify 2 ini boleh dibilang tidak kompatible dengan versi 1, oleh karena itu tentu ada banyak breaking change yang harus diperhatikan. Beruntung pihak Vuetify sudah menyediakan panduan lengkap untuk anda yang ingin meng-upgradeVuetify dari versi 1 ke versi 2. Panduan tersebut dapat anda akses dari link berikut ini : https://github.com/vuetifyjs/vuetify/releases?#user-content-upgrade-guide

Nasib Vuetify 1
Setelah Vuetify versi 2 rilis, lalu bagaimana nasib dari Vuetify 1 ? Jangan kuatir, karena Vuetify 1 masih akan terus diupdate sampai dengan Juli 2020, dengan beberapa catatan :
  • check tidak akan ada fitur baru
  • check hanya akan ada perbaikan bug dan security
Jadi, anda masih punya waktu sangat panjang untuk mempelajari dan menjadwalkan upgrade, itupun jika diperlukan.
Catatan pribadi

Saya pribadi sangat antusias dengan dirilisnya versi 2 ini, dan tidak sabar untuk segera melakukan upgrade di semua project. Akan tetapi, apakah harus semua project ? Jawabannya ya dan tidak, tergantung kebutuhan anda sendiri. Saya pribadi cenderung untuk tidak meng-upgrade project-project yang sudah lama, dikarenakan it's just work, jadi tidak perlu diutak-utik lagi. Sedangkan project-project yang masih baru atau ongoing atau next project, maka saya akan dan juga menyarankan anda untuk melakukan upgrade.

Sekian info kali ini. Semoga yang sedikit ini bermanfaat.

Sumber :
Read More

https://payclick.com/

Contact us for advertising.

Author Details

Menyediakan berbagai macam tutorial dan informasi penting dalam berbagai hal