날씬한 팁
18929 단어 localstoragejavascriptsvelte
반응성이 없는 Svelte 및 localStorage
기본 값 및 유형 인식을 위해 작업합니다.
/** ~/localstorage.js */
/**
* @template T
* @param {string} storageKey
* @param {T} defaultsTo
* @returns {{value: T, set: (val: T) => void}}
*/
function setupStorage(storageKey, defaultsTo) {
const isBool = typeof defaultsTo === 'boolean'
const isNum = typeof defaultsTo === 'number'
function get() {
const val = localStorage.getItem(storageKey)
if (val) {
if (isBool) return val === 'true' ? true : false
if (isNum) return Number(val)
return val
}
return defaultsTo
}
const obj = {
/** @param {T} val */
set(val) {
this.value = val
localStorage.setItem(storageKey, `${val}`)
},
value: get()
}
// @ts-ignore
return obj
}
한 곳에서 모든 항목. 추가, 제거 또는 변경이 쉽습니다. 편집기는 intellisense를 제공할 수 있으며 일부 변수의 철자가 틀리거나 누락된 경우 경고합니다.
/** ~/localstorage.js */
/** @enum {any} */
const storage = {
rounds: setupStorage('Rounds', 10),
color: setupStorage('Color', 'blue'),
isActive: setupStorage('Is_active', true)
}
export default storage
<script>
import storage from '~/localstorage.js'
const rounds = storage.rounds.value
/** @param {Event & { currentTarget: EventTarget & HTMLInputElement; }} ev */
function onChangeRound(ev) {
const val = ev.currentTarget.valueAsNumber
storage.rounds.set(val)
}
const isActive = storage.isActive.value
/** @param {Event & { currentTarget: EventTarget & HTMLInputElement; }} ev */
function onChangeActive(ev) {
const checked = ev.currentTarget.checked
storage.isActive.set(checked)
}
const colors = ['blue', 'yellow']
const color = storage.color.value
/** @param {Event & { currentTarget: EventTarget & HTMLSelectElement; }} ev */
function onChange(ev) {
const val = ev.currentTarget.value
storage.color.set(val)
}
</script>
<label>
Rounds
<input type="number" min="0" step="1" value={rounds} on:change={onChangeRound} />
</label>
<label>
Active
<input type="checkbox" checked={isActive} on:change={onChangeActive} />
</label>
<label>
My color
<select value={color} on:change={onChangeColor}>
{#each colors as color}
<option>{color}</option>
{/each}
</select>
</label>
Svelte Store 및 localStorage
스토어 업데이트 시 localStorage 항목을 설정하는 함수로 쓰기 가능한 스토어를 래핑합니다(첫 번째 구독 호출 건너뛰기).
/** ~/store.js */
import { writable } from 'svelte/store'
/**
* @template T
* @param {string} key
* @param {T} defaultsTo
* @returns {import('svelte/store').Writable<T>}
*/
function setupStore(key, defaultsTo) {
const isBool = typeof defaultsTo === 'boolean'
const isNum = typeof defaultsTo === 'number'
function get() {
const val = localStorage.getItem(key)
if (val) {
if (isBool) return val === 'true' ? true : false
if (isNum) return Number(val)
return val
} else {
return defaultsTo
}
}
const initVal = get()
const store = writable(initVal)
let first = true
store.subscribe((v) => {
if (first) {
first = false
} else {
localStorage.setItem(key, `${v}`)
}
})
// @ts-ignore
return store
}
export const rounds = setupStore('Rounds', 10)
export const color = setupStore('Color', 'blue')
export const isActive = setupStore('top_panel', true)
<script>
import { rounds, isActive, color } from '~/store.js'
const colors = ['blue', 'yellow']
</script>
<label>
Rounds
<input type="number" min="0" step="1" bind:value={$rounds} />
</label>
<label>
Active
<input type="checkbox" bind:checked={$isActive} />
</label>
<label>
My color
<select bind:value={$color}>
{#each colors as color}
<option>{color}</option>
{/each}
</select>
</label>
감시 변수
값 변경을 감시하는 가장 쉬운 방법입니다.
<script>
let word = ''
$: watch(word)
/** @param {string} val */
function watch(val) {
console.log(val)
if (val.length > 3) localStorage.setItem('Word', val)
}
</script>
<label>
Word
<input type="text" bind:value={word} />
</label>
Reference
이 문제에 관하여(날씬한 팁), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/diogenesofweb/svelte-tips-hh6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)