날씬한 팁

반응성이 없는 Svelte 및 localStorage


  • localStore에 대한 설정 기능.

  • 기본 값 및 유형 인식을 위해 작업합니다.

    /** ~/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
    


  • onchange, oninput 또는 기타와 함께 사용하십시오.

  • <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>
    

    좋은 웹페이지 즐겨찾기