Kliping
KlipingBerandaDokumentasiKomponenBlocksVariasiTemplateDice UIHooks
Memulai
  • Pengenalan
  • Instalasi
  • Kredit
State
  • useBoolean
  • useControllableValue
  • useCounter
  • useDebounce
  • useResetState
  • useThrottle
  • useToggle
Lanjutan
  • useCreation
  • useCustomCompareEffect
  • useLatest
  • useLockFn
  • useMemoizedFn
  • usePrevious
Siklus Hidup
  • useDebounceEffect
  • useDebounceFn
  • useDeepCompareEffect
  • useDeepCompareLayoutEffect
  • useEffectEvent
  • useEffectWithTarget
  • useInterval
  • useIsHydrated
  • useIsomorphicLayoutEffect
  • useMount
  • useThrottleEffect
  • useThrottleFn
  • useTimeout
  • useUnmount
  • useUpdate
  • useUpdateEffect
Peramban
  • useActiveElement
  • useBattery
  • useClickAnyWhere
  • useClickAway
  • useClipboard
  • useDocumentVisibility
  • useElementSize
  • useEventListener
  • useFps
  • useFullscreen
  • useHash
  • useHover
  • useInViewport
  • useIsMatchMedia
  • useIsOnline
  • useMouse
  • useNetwork
  • useOs
  • useScrollLock
  • useTextSelection
  • useTitle
Pengembangan
  • useWhyDidYouUpdate
Paket Luar
  • useMcp
  • useQuery
  • useStickToBottom
  • useSwr
Pustaka
  • isBrowser
  • createContext
  • bacaElemen
  • saatTerpasang

useHash

SebelumnyaBerikutnya

Bagian # dari alamat halaman, yang bisa dibaca dan ditulis.

Hash sekarang: (kosong)

Alamat di bilah peramban ikut berubah, dan tombol kembali tetap bekerja.

Bagian # dari alamat halaman, yang bisa dibaca dan ditulis.

Menulis ke sini mengubah alamatnya, dan itu memicu hashchange yang lalu membaca balik nilainya — jadi satu sumber kebenaran, bukan dua yang harus dijaga tetap sama. Perubahan dari luar (tombol kembali, tautan #bagian, kode lain) ikut terbaca tanpa perlakuan khusus.

Kosong saat dirender di server: di sana tidak ada alamat yang bisa dibaca, dan # memang tidak pernah dikirim ke server oleh peramban mana pun.

Pemasangan ​

npx shadcn-vue@latest add @kliping/use-hash

Perlu @kliping terdaftar di components.json project Anda. Lihat cara menyiapkannya.

Ikut terpasang sendiri: is-browser, saat-terpasang, use-event-listener.

Salin dulu is-browser, saat-terpasang, target, use-event-listener — masing-masing memuat sumbernya di halamannya sendiri — lalu tempel berkas ini.

ts
import { customRef } from 'vue'
import { isBrowser } from '@/lib/is-browser'
import { saatTerpasang } from '@/lib/saat-terpasang'
import { useEventListener } from '@/composables/use-event-listener'

export function useHash() {
  let nilai = ''
  let beritahu: (() => void) | undefined

  const baca = () => (isBrowser ? window.location.hash : '')

  const perbarui = () => {
    const baru = baca()
    if (baru === nilai)
      return
    nilai = baru
    beritahu?.()
  }

  const hash = customRef<string>((track, trigger) => {
    beritahu = trigger
    return {
      get() {
        track()
        return nilai
      },
      set(baru) {
        if (!isBrowser) {
          nilai = baru
          trigger()
          return
        }
        // Ditulis ke alamatnya, bukan ke variabelnya. `hashchange` yang
        // menyusul akan membaca balik dan menyalakan pemberitahuannya, jadi
        // nilai ini tidak pernah bisa menyimpang dari alamat yang sebenarnya.
        window.location.hash = baru
      },
    }
  })

  saatTerpasang(perbarui)
  useEventListener('hashchange', perbarui)

  return hash
}

API ​

ts
export function useHash()
useFullscreenuseHover

Di halaman ini

PemasanganAPI
Dirilis di bawah lisensi MIT. Ditulis ulang untuk Vue dari shadcn-vue, shadcn-ui-blocks, dan shadcn-hooks. Hak cipta © 2026 Kliping