state/src/globals.js

42 lines
1.6 KiB
JavaScript

// src/globals.js
import { NewState } from './observer.js';
import { Util } from './utils.js';
// url hash 状态
let _hashParams = new URLSearchParams(window.location.hash?.substring(1) || '')
export const Hash = NewState({}, k => Util.safeJson(_hashParams.get(k)), (k, v) => {
const oldStr = _hashParams.get(k)
const newStr = v === undefined ? undefined : JSON.stringify(v)
if (oldStr === newStr || (oldStr === null && newStr === undefined)) return
v === undefined ? _hashParams.delete(k) : _hashParams.set(k, newStr)
// 增量 5: 立即同步 Hash 字符串,确保响应式实时可见
window.location.hash = '#' + _hashParams.toString()
})
if (typeof window !== 'undefined') {
window.addEventListener('hashchange', () => {
const newParams = new URLSearchParams(window.location.hash?.substring(1) || '')
const keys = new Set([..._hashParams.keys(), ...newParams.keys()])
_hashParams = newParams
keys.forEach(k => Hash[k] = Hash[k]) // 触发更新
})
}
// localstorage 状态
export const LocalStorage = NewState({}, k => Util.safeJson(localStorage.getItem(k)), (k, v) => {
const oldStr = localStorage.getItem(k)
const newStr = v === undefined ? undefined : JSON.stringify(v)
if (oldStr === newStr || (oldStr === null && newStr === undefined)) return
v === undefined ? localStorage.removeItem(k) : localStorage.setItem(k, newStr)
})
// 增量:显式定义 State 单例
export const State = NewState({
exitBlocks: 0
});
globalThis.Hash = Hash;
globalThis.LocalStorage = LocalStorage;
globalThis.State = State;