Navigation

    BaliJS
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unsolved
    • Popular
    • Talents
    • Users
    • Groups
    1. Home
    2. natserract
    3. Posts

    natserract (@natserract)

    44
    Reputation
    45
    Posts
    35
    Profile views
    3
    Followers
    8
    Following
    • Profile
    • Following
    • Followers
    • Topics
    • Posts
    • Best
    • Groups

    Information about natserract

    Problem Solver
    Joined
    Last Online
    Website
    github.com/natserract
    Location
    Bali
    Age
    24

    About me

    Cool links: http://rustlang.org/

    Posts made by natserract

    • Functional Programming di Rust

      Functional Programming di Rust

      Sebulan lalu ketika pertama kali mendevelop sebuah non komersial project menggunakan ReasonML, saya mendapat sebuah pengalaman baru, yaitu functional programming. Bahasa ini merupakan alternative syntax dari OCaml. OCaml sendiri merupakan purely functional language, fitur-fitur yang ditawarkan menarik. Contohnya: type inference, strongly type system, algebraic datatypes, dan masih banyak lagi. Menarik bukan?

      Nah setelah mencoba language tersebut, saya mulai interest dengan namanya functional programming. Usut punya usut, akhirnya saya coba mengimplementasikan paradigma tersebut di bahasa berbeda yaitu Rust.

      Introduction

      Functional programming (FP) adalah paradigma pemrograman dimana memungkinkan kita untuk menulis kode program yang ekspresif, ringkas, dan elegan. Functional programming juga membantu developer untuk mengatur kodenya agar tidak DRY (Don't Repeat Yourself) alias tidak menulis kode yang sama berulang-ulang kali. Functional language lainnya contohnya seperti Lisp, Clojure, Erlang, Haskell, R, dan masih banyak lagi.

      Okay, but why Rust?

      Pertanyaannya, apakah Rust functional programming language? jawabannya, tidak. Walaupun Rust sendiri terinspirasi dari ML family of language, dia bukan functional. Tetapi beruntungnya Rust mempunyai beberapa fitur yang mirip dengan bahasa fungsional lainnya, seperti: algebraic datatypes, expressive types, dan lain-lain.

      Lists yang akan dibahas

      • Primitive Types
      • Closures
      • Currying
      • Recursion
      • Higher Order Functions(HOF)
      • Lazy evaluations

      Primitive Types

      Agar tidak langsung loncat lebih jauh, alangkah baiknya kita harus mengetahui beberapa tipe data yang ada di Rust. Ini juga berlaku untuk semua bahasa pemrogaman.

      Booleans

      Jenis tipe data yang paling sederhana adalah nilai true/false, di Rust ini disebut bool

      let x = true;
      let y: bool = false;
      

      Char

      Jenis tipe data char memiliki nilai single Unicode. Kita bisa menggunakan tipe data char dengan single tick (')

      let x = 'x';
      let two_hearts = 'πŸ’•';
      

      Tidak seperti beberapa bahasa lain, char di Rust nilainya bukan satu byte, tetapi empat.

      Numeric Types

      Rust mempunyai beberapa varian kategori tipe numeric, seperti signed(i) dan unsigned(u), fixed size (8, 16, 32, 64) dan variable(isize, usize) types.

      let x = 42; // `x` has type `i32`.
      let y = 1.0; // `y` has type `f64`.
      

      Arrays

      Seperti banyak bahasa pemrograman lain, Rust juga memiliki tipe data array. Secara default, array di Rust tidak dapat diubah. Kecuali kamu menginisializenya dengan mut

      let a = [1, 2, 3]; // a: [i32; 3]
      let mut m = [1, 2, 3]; // m: [i32; 3]
      

      Functions

      Function juga memiliki tipe data! Contohnya seperti ini:

      fn foo(x: i32) -> i32 { x }
      let x: fn(i32) -> i32 = foo;
      

      Dalam case ini, fungsi foo() memiliki return type numeric: i32, dan mengembalikan nilai x.

      Untuk selengkapnya kamu bisa cek disini: primitive types

      Closures

      "Closure is a mechanism by which an inner function will have access to the variables defined in its outer function’s lexical scope even after the outer function has returned."

      Sampai disini paham? singkatnya closures adalah sebuah inner function yang mempunyai akses untuk mengambil suatu nilai diseluruh scopenya baik diluar maupun didalam.

      fn fmt(prev_str: &str) -> String {
          let mut new_str = String::new();
          
          let closure_annotated = |next_str| -> String {
              new_str.push_str(prev_str);
              new_str.push_str(next_str);
              return new_str;
          };
          
          closure_annotated("dolor sit amet")
      }
      
      let r_txt = "Lorem ipsum ";
      assert_eq!("Lorem ipsum dolor sit amet", fmt(r_txt));
      

      Dicase ini, dibagian new_str.push_str() dimana closure_annotated mengakses variable new_str lalu merubah nilai dalam variabel tersebut dan mereturn nya diluar scope.

      Currying

      Currying adalah teknik functional programming di mana kita dapat mengubah suatu fungsi dengan beberapa argumen menjadi urutan fungsi bersarang. Ini mengembalikan fungsi baru yang mengharapkan argumen inline berikutnya.

      #[derive(Debug)]
      struct States<'a> {
          a: &'a i32,
          b: &'a i32
      }
      
      trait Currying {
          type ReturnType: Fn(i32) -> i32;
          fn add(self) -> Self::ReturnType;
      }
      
      impl Currying for States<'static>{
          type ReturnType = Box<dyn Fn(i32) -> i32>;
         
          fn add(self) -> Self::ReturnType {
              Box::new(move|x| {
                  x * self.a
              })
          }
      }
      
      let r_value: States = States {
          a: &100,
          b: &100
      };
      
      let r1 = r_value.add();
      let r2 = r1(5);
      
      assert_eq!(500, r2);
      
      

      Terdapat 2 parameter disini, yaitu a, b dimana masing-masing mempunyai tipe data numeric, lalu dibagian trait adalah sebuah function interfaces, tempat untuk inisialisasi function. Traits ini mirip seperti typescript interfaces.

      Recursion

      Sederhananya recursion adalah suatu procedure/function yang memanggil dirinya sendiri, dimana fungsinya untuk membuat/mengolah data yang akan ingin ditampilkan.

      #[allow(non_camel_case_types)] 
      type i64_t = i64;
      
      trait Factor {
          fn factorial_tail_rec(val: i64_t) -> Self;
          fn factorial(num: i64_t) -> Self;
      }
      
      impl Factor for i64_t {
          fn factorial_tail_rec(val: i64_t) -> Self {
              val
          }
      
          fn factorial(num: i64_t) -> Self {
              match num {
                  0 => 1,
                  _ => num * Self::factorial_tail_rec(num - 1)
              }
          }
      }
      
      let result: i64_t = Factor::factorial(3); 
      assert_eq!(6, result);
      

      Ini adalah sebuah fungsi faktorial, dimana jika nilai argumen dari parameter num !== 0, maka nilai tersebut akan dikalikan dengan setiap angka dibawahnya. Misalnya (5! = 5 * 4 * 3 * 2 * 1 = 120).

      Higher Order Functions(HOF)

      Higher order function adalah fungsi yang menggunakan fungsi lain sebagai parameter atau sebagai hasil return.

      fn map<F>(arr: &[i32], func: F) -> Vec<i32> where F: Fn(&i32) -> i32{
          let mut new_array: Vec<i32> = vec![];
          for i in arr.iter() {
              new_array.push(func(i))
          }
          
          return new_array
      }
      
      let lists = vec![1, 4, 9, 16];
      let result = map(&lists, |i| *i + 2);
      
      assert_eq!(vec![3, 6, 11, 18], result)
      

      Jadi func dan map merupakan higher order function, dimana fungsi ini digunakan untuk mengubah setiap isi dari suatu array. Hasil returnnya adalah array baru dengan length yang sama dengan originalArray yang diubah.

      Lazy Evaluation

      Lazy evaluation atau non-strict evaluation adalah sebuah proses menahan evaluasi dari sebuah expression/function hingga nilainya diperlukan. Tujuannya agar menghindari evaluasi berulang.

      struct State {
          x: i32,
      }
      
      trait Lazy {
          fn add(&self) -> i32;
          fn multiply(&self) -> i32;
          fn add_or_multiply(&self, add: bool) -> i32;
      }
      
      impl Lazy for State {
          fn add(&self) -> i32 {
              println!("executing add");
              &self.x + &self.x
          }
      
          fn multiply(&self) -> i32 {
              println!("executing multiply");
              &self.x * &self.x
          }
      
          fn add_or_multiply(&self, add: bool) -> i32 { 
              match add {
                  true => self.add(),
                  false =>  self.multiply(),
              }
          }
      }
      
      let val: State = State {
          x: 20
      };
      
      assert_eq!(40, val.add_or_multiply(true));
      assert_eq!(400, val.add_or_multiply(false));
      

      Referensi

      • Functional Programming in Go
      • Eloquent Javascript Functional Programming
      • Closures Developer Mozilla

      Motivation

      Functional Programming (FP) memiliki banyak keuntungan, dan popularitasnya terus meningkat. Namun, setiap paradigma pemrograman dilengkapi fitur dan keunikan tersendiri dan FP tidak terkecuali. Semoga dengan adanya tulisan ini, dapat memberikan manfaat bagi pembacanya. Sekian dari saya terimakasih ✌️

      Repository: rustfp.github.rs

      posted in Back End
    • Ngoding React di Vue (include: TypeScript) πŸ”₯

      @Joe-Prabawa Wah iya bener https://github.com/vuejs/composition-api/pull/230, keren nih udah make vue composition api, lanjutkan πŸ‘

      posted in Front End
    • Ngoding React di Vue (include: TypeScript) πŸ”₯

      @alfrcr said in Ngoding React di Vue (include: TypeScript) πŸ”₯:

      komprehensif

      thankyou kak @alfrcr

      posted in Front End
    • Ngoding React di Vue (include: TypeScript) πŸ”₯

      Ketika pertama kali kamu ingin belajar suatu teknologi khususnya frontend, biasanya kamu bingung mau mulai dari mana, salah satu alasannya karena kamu dihadapkan dengan banyak pilihan stack, contohnya: Vue, Angular, React, dll. Tentu saja ini membingungkan, maka dari itu supaya tahu bagaimana stack2 itu bekerja, caranya adalah harus langsung mencobanya. Yang perlu diingat semua teknologi punya pros dan consnya masing2.

      Nah, dalam tulisan ini, kita ga akan ngebahas mana yang terbaik, karena semua digunakan sesuai dengan kebutuhan, yang akan kita bahas disini adalah bagaimana para React developer bisa dengan mudah ngoding di Vue dengan kode yang mirip/sama (97%). Tulisan ini cocok buat kamu bagi para react dev yang lagi ingin bermigrasi ke vue atau sekedar mau belajar.

      So, ini perjalanan panjang! Baca doa dulu biar adem! πŸ˜ƒ

      Persiapan Project

      Pertama yang harus kita lakukan adalah mengatur project, mulai dengan membuat struktur direktori terlebih dahulu.

      1. Struktur direktori root

      Ini struktur direktori yang kita pakai dalam project ini, didalam folder komponen ada 2 folder yaitu container dan presentational. Kedua folder ini nantinya dipakai untuk membedakan mana komponen logic dan mana komponen view.

      β”œβ”€β”€ src
      | β”œβ”€β”€ assets
      | β”œβ”€β”€ components
      |   β”œβ”€β”€ container
      |   β”œβ”€β”€ presentational
      β”œβ”€β”€ redux
      | β”œβ”€β”€ action
      | β”œβ”€β”€ reducer
      β”œβ”€
      

      Kamu bisa bebas mengatur struktur direktori ini sesuai hati nurani kamu, yang penting kamu suka, nyaman dan aman.

      2. Menggunakan JSX & TypeScript

      So, mari kita mulai dengan menginstal beberapa dependensi yang diperlukan. Kita dapat melakukan ini dengan mengetikkan perintah:

      npm i --save-dev typescript babel-preset-vca-jsx
      npm i --save-dev @babel/plugin-syntax-dynamic-import @babel/plugin-transform-runtime 
      npm i --save-dev @babel/preset-typescript @types/webpack-env source-map-loader 
      npm uninstall babel-plugin-transform-runtime 
      

      Kita perlu menghapus package ini babel-plugin-transform-runtime, karena kita sudah menginstal versi yang terbaru @babel/plugin-transform-runtime

      Dan selanjutnya, kita harus mengatur beberapa konfigurasi tambahan karena beberapa packages memerlukan versi Babel yang support.

      Catatan: Kebetulan saya make boilerplate ini: Vue Webpack Template kamu bisa memilih boilerplate apa saja.

      Update babel core & babel loader

      npm i --save-dev babel-core@^7.0.0-0 babel-loader@^8.0.6 
      npm i --save-dev @babel/core@^7.6.4 @babel/preset-env@^7.6.3 
      

      Setelah menginstal semua dependensi, kita harus mengatur konfigurasi tambahan pada .babelrc buka file ini, dan tambahkan config .babelrc dan kita juga mengatur webpack loadernya webpack config

      Catatan: Untuk typescript loader, ada alternative lain, seperti Awesome TypeScript Loader

      Dan jangan lupa, kamu juga harus menambahkan beberapa config di .eslintrc.js

      rules: {
          'import/extensions': ['error', 'always', {
            jsx: 'never',
            ts: 'never',
            tsx: 'never'
          }],
      }
      

      Dan selanjutnya, buat file baru tsconfig.json lalu ikutin config ini tsconfig.json

      Setelah semua config ditambahkan, hooray! ini waktunya ganti extension seluruh file project kamu dari .jsx/.js ke.tsx/.ts

      Catatan: Untuk bagian kedua ini memang cukup ribet, kalo mau langsung di skip boleh, kamu bisa pake boilerplate yang saya buat Project Boilerplate

      3. Install dependensi tambahan

      npm i --save @vue/composition-api vuejs-redux redux @types/redux 
      

      Konsep Utama

      Sebagai frontend tools yang sangat populer, react dan vue memiliki fitur yang sama, seperti two-way-databinding, templating, routing, components, dan masih banyak lagi.

      Serupa tapi tak sama, ada beberapa perbedaan antara kedua tools ini, yaitu dalam hal penulisan sintaks, rendering komponen, pengelolaan kondisi dan data. Oleh karena itu, pada bagian ini kita akan mengupas satu per satu cara menerapkan pattern React di Vue.

      Komponen and Props
      Komponen adalah jenis fungsi khusus seperti fungsi JavaScript yang akan menampilkan sebuah element dan dapat digunakan sebagai bagian terpisah dan dapat digunakan kembali. Dalam merender komponen, keduanya sangat berbeda. React mendefinisikan komponen sebagai class atau fungsi, kalo Vue berdasarkan objek.

      export default createComponent({
          name: 'ComponentProps',
          props: {
              name: String,
              authorName: Array as () => string[]
          },
          setup(props) {
              return () => (
                  <div className="components-props">
                      <h2>{props.name}</h2>
                      <p>{props.authorName}</p>
                  </div>
              )
          }
      })
      

      Kita tidak perlu menggunakan template lagi, right?πŸ™‚

      render () {
        return (
            <ComponentProps 
               name="Your name here" 
               commentId={['Name1', 'Name2']} 
            />
        )
      }
      

      Render Pengkondisian
      Cara kerjanya mirip seperti pengkondisian di javascript biasa, kita bisa menggunakan if else ataupun ternary operator

      export default createComponent({
          name: 'ConditionalRendering',
          props: {
              show: Boolean
          },
          setup(props) {
              return () => props.show ? <p>True Condition</p> : <p>False Condition</p>
          }
      })
      
      render() {
         return <ConditionalRendering show={false}/>
      }
      

      Menangani Event
      Di Vue JS, saat menangani event, vue memberikan kita arahan untuk menggunakan v-on. Nah karena kita sudah menggunakan JSX, jadi kita tidak membutuhkan itu lagi, kita bisa menggunakan attribut JSX biasa seperti di React πŸ™‚

      export default createComponent({
          setup(props) {
              return () => (
                  <button onClick={props.handleButtonClick}>
                      Click Event
                  </button>
              )
          },
          props: {
              handleButtonClick: Function as () => void
          }
      })
      
      render () {
        return (
             <HandlingEvent 
                handleButtonClick={() => alert("Click event. This works!")} 
             />
        )
      }
      

      Children
      Children komponen digunakan untuk menampilkan apapun yang kamu wrap antara tag pembuka dan penutup. Untuk mengakses komponen ini, kita dapat menggunakan fungsi slots.

      export default Vue.component('Children', {
          render() {
              return (
                  <div className="children">
                      {this.$slots.default}
                  </div>
              )
          }
      })
      
      render () {
        return (
           <div className='container'>
              <Children>
                {/* what is placed here is passed as children */}
              </Children>
           </div>
        )
      }
      

      Siklus Kehidupan & Hooks

      Siklus hidup adalah metode yang mengatur tahapan siklus hidup dalam suatu komponen, dan memiliki fungsi masing-masing.

      • setup: dipanggil setelah resolusi properti awal ketika instance komponen dibuat. Dari segi siklus, ia dipanggil sebelum hooks beforeCreate.
      • onBeforeMount: fungsi yang dijalankan sebelum proses rendering dijalankan.
      • onMounted: fungsi yang dipanggil hanya sekali setelah rendering pertama selesai. Biasanya fungsi ini digunakan untuk menghandle side effect dalam operasi request ajax.
      • onUnmounted: fungsi yang dijalankan untuk menghilangkan atau menghapus komponen dari DOM.
      import {
          createComponent,
          reactive as useState,
          onBeforeMount as componentWillMount,
          onMounted as componentDidMount,
          onUnmounted as componentWillUnmount
      } from '@vue/composition-api';
      
      const LifecycleHooks = createComponent({
          setup() {
              const state = useState<{ loading: boolean, users: object }>({
                  loading: false,
                  users: []
              })
      
              componentWillMount(() => {
                  console.log("Component before mount")
              })
      
              componentDidMount(() => {
                  const API_URL = 'https://jsonplaceholder.typicode.com/users'
                  fetch(API_URL)
                      .then(res => res.json() as Promise<any>)
                      .then(data => {
                          state.users = data,
                              state.loading = !state.loading;
                      })
                      .catch((err: Error) => {
                          throw err
                      })
                  console.log("Component Mounted")
              });
      
              componentWillUnmount(() => {
                  console.log("Component Will Unmount")
              })
      
              return () => (
                  <div className="lifecycle-hooks">
                      {state.loading ? JSON.stringify(state.users) : <span>Loading...</span>}
                  </div>
              )
          }
      })
      
      export default LifecycleHooks
      
      • reactive: fungsi ini mirip dengan Vue.observable()pada Vue 2, fungsi ini mengembalikan sebuah object baru, dan mengembalikan proxy reaktif dari aslinya.
      • watch: "function expects a function" itu istilahnya. Fungsi ini melacak variabel reaktif didalam suatu komponen. Ketika nilai dari variable reaktif tersebut diganti/update, maka fungsi dijalankan kembali atau dirender ulang.
      import {
          createComponent,
          reactive as useState,
          watch as useEffect
      } from '@vue/composition-api';
      
      const LifecycleHooks = createComponent({
          setup() {
              const state = useState<{ count: number }>({
                  count: 0
              })
      
              /* => Re-run it whenever the dependencies have changed */
              useEffect(() => state.count, (nextState, prevState) => {
                  console.log(nextState, '<= this is nextState')
                  console.log(prevState, '<= this is prevState');
              })
      
              return () => (
                  <div className="lifecycle-hooks">
                      <button onClick={() => state.count++}>
                          Update Value
                      </button>
                  </div>
              )
          }
      })
      

      Redux & Vue

      Tentunya kamu pasti sudah tau apa itu Redux right?, ya! kamu jackpot! Redux adalah sebuah library state management untuk aplikasi javascript. Ga kayak vuex, redux bisa digunakan framework apapun.

      Redux mempunyai 4 konsep: reducers, actions, action creators, dan store. State pada Redux sifatnya immutable dan pure functions. Berikut adalah beberapa hal yang perlu diketahui lebih lanjut tentang redux di vue:

      Actions
      Actions adalah objek Javascript sederhana yang tugasnya adalah mengirim/mengembalikan data dari aplikasi kamu ke store. Jika diberikan perumpamaan, maka action adalah orang yang memberikan perintah untuk melakukan suatu pekerjaan dan memberikan hal-hal yang diberikan untuk dapat menunjang pekerjaan itu.

      export const INCREMENT = 'INCREMENT'
      export const DECREMENT = 'DECREMENT'
      export const RESET = 'RESET'
      
      
      export const increment = () => {
          return { 
              type: INCREMENT 
              // your payload here
          }
      }
      
      export const decrement = () => {
          return { 
              type: DECREMENT 
          }
      }
      
      export const reset = () => {
          return { 
              type: RESET 
          }
      }
      

      Reducers
      Reducers mempunyai peran sebagai penentu bagaimana keadaan aplikasi berubah sesuai dengan perintah yang diberikan lalu dikirim ke store. Kamu bisa membuat banyak reducer, lalu mengkombinasikannya menjadi satu root reducer.

      type Action = { type: 'INCREMENT' } | { type: 'DECREMENT' } | { type: 'RESET' };
      
      const Counter = (state: number = 0, action: Action) => {
          switch (action.type) {
              case 'INCREMENT': {
                  return state + 1;
              }
              case 'DECREMENT': {
                  return state - 1;
              }
              case 'RESET': {
                  return state
              }
              default: return state
          }
      }
      
      export default Counter
      

      Fungsi combineReducers untuk memanggil semua reducer yang kamu buat. Ini tentunya sangat useful:)

      import { combineReducers } from 'redux'
      import userReducer from './reducer/user.reducer'
      
      export default combineReducers({
          user: userReducer
          // your another reducer here
      })
      

      Store
      A store tempat menyimpan state/data dari aplikasi kamu. Store, memegang seluruh cabang dari aplikasi kamu. Hanya ada satu store di Redux.

      import Vue from 'vue'
      import { createStore } from 'redux'
      
      import Provider from 'vuejs-redux';
      import RootReducer from './rootReducer'
      
      const store = createStore(RootReducer);
      
      export default Vue.component('Provider', {
          render() {
              return (
                  <Provider 
                      mapStateToProps={this.mapStateToProps} 
                      mapDispatchToProps={this.mapDispatchToProps} 
                      store={store}> 
                      {this.$scopedSlots.default}
                  </Provider>
              )
          },
      
          props: ['mapStateToProps', 'mapDispatchToProps'],
      
          components: {
              Provider
          }
      })
      

      Kamu juga bisa membuat custom provider yang menerima mapStateToProps and mapDispatchToProps sebagai props and mengimport store serta meneruskannya ke setiap Provider.

      import Vue from 'vue';
      import ContextConsumer from './redux';
      import * as actions from './redux/action/user.action';
      
      import ComponentContainer from './components/container/component-wrap';
      
      export default Vue.component('App', {
        render() {
         return (
            <ContextConsumer 
                mapStateToProps={this.mapStateToProps} 
                mapDispatchToProps={this.mapDispatchToProps}>
                  {({ incrementAction, userData }) => (
                      <ComponentContainer>
                          <SingleComponent
                            value={userData.user}
                            handleClick={incrementAction} 
                          />
                      </ComponentContainer>
                  )}
            </ContextConsumer>
          )
        },
      
        components: {
          ContextConsumer
        },
      
        methods: {
          mapStateToProps(state) {
            return {
              userData: state
            }
          },
          mapDispatchToProps(dispatch) {
            return {
              incrementAction: () => dispatch(actions.increment())
            }
          }
        }
      })
      

      Higher-Order Components

      Higher-order component (HOC) adalah sebuah konsep/teknik/pattern advanced di React yang dapat digunakan terus-menerus alias (reusable). HOCs bukan bagian dari React API.

      Jika kamu paham dengan konsep higher-order functions (HOF), tentunya akan sangat mudah membuat HOC, karena HOC adalah implementasi dari HOF πŸ™‚

      import Vue from 'vue'
      
      const useDataFetchingHOC = (WrappedComponent: JSX.IntrinsicElements) => (urlParam: string) => {
          return Vue.component('HOCFetch', {
              data: () => ({
                  fetchData: null
              }),
              mounted: function() {
                  fetch(urlParam)
                      .then(response => {
                          if (!response.ok) { throw new Error(response.statusText) }
                          return response.json() as Promise<any>;
                      })
                      .then(data => this.fetchData = data)
                      .catch((err: Error) => {
                          throw err
                      })
              },
      
              render(createElement) {
                  return !this.fetchData ? createElement('span', 'Loading Fetch...') :
                      createElement(WrappedComponent, {
                          attrs: this.$attrs,
                          props: this.$props,
                          on: this.$listeners
                  })
              }
          })
      };
      
      export default useDataFetchingHOC
      
      import { createComponent } from '@vue/composition-api'
      import useDataFetchingHOC from '../presentational/hoc-component'
      
      const dataSourceUrl = "https://jsonplaceholder.typicode.com/users";
      
      const ContentSite = createComponent({
          setup() {
            return () => (
              <div className="content">
                <p>Yes, i'm in HOC</p>
              </div>
            )
          }
        })
      
      export default useDataFetchingHOC(ContentSite)(dataSourceUrl)
      
      

      Terimakasih sudah membaca!
      Terima kasih telah membaca, saya harap kamu menikmati artikel ini, dan bisa memberi inspirasi baru untuk pekerjaan kamu. Yang pasti, Vue dan React adalah tools front-end yang sangat keren, dan sangat diminati oleh banyak pengguna. Jadi, teruslah mencoba dan mempelajari hal-hal baru, dan jangan lupa selalu percaya diri!😎

      Source code: Github

      posted in Front End
    • Ayo kenalin dirimu!

      Hey! Salam kenal semua. Perkenalkan nama saya Alfin, saat ini bekerja di Fantasktic. Fokus di frontend development, untuk sekarang lagi mendalami ReasonML & Rust. Habit saya, suka makan yg pedes2, sekian dan mohon bantuannya, teman2 semua terimakasih.

      posted in Diskusi Umum
    • 1
    • 2
    • 3
    • 3 / 3