typescript 在使用svelte store时,美元分配和本机存储方法之间有什么区别吗?

wqlqzqxt  于 2023-08-07  发布在  TypeScript
关注(0)|答案(1)|浏览(126)

我正在用Sveltekit和TypeScript构建一个表单。为了管理用户输入,我使用Svelte store声明了表单状态,并将其封装在一些模块中。下面是管理输入的代码。

// useFormInput.svelte
<script lang="ts" context="module">
  import {writable, get} from "svelte/store"
  type Form = {
    name: string, job: string, home: string, gender: string
  }
  export const useFormInput = () => {
    const form = writable<Form>({
      name: "", job: "", home: "", gender: ""
    })
    const onChange = <T extends string = keyof Form>(key: T, value: T extends keyof Form ? Form[T] : never) => {
      const _form = get(form)
      form.set({
        ..._form, [key]: value
      })
    }

    return {form, onChange}
  }
</script>

// useFormSubmit.svelte
<script lang="ts" context="module">
  import {writable} from "svelte/store"
  type Form = {
    name: string, job: string, home: string, gender: string
  }
  type Props = {
    form: Form
  }
  export const useFormSubmit = (props: Props) => {
    const isLoading = writable(false)
    const onSubmit = async () => {
      isLoading.set(true)
      await new Promise((resolve) => {
        setTimeout(() => {
          resolve(null!)
        }, 3000)
      })
      console.log(props.form, "form submitted")
      isLoading.set(false)
    }

    return {onSubmit, isLoading}
  }
</script>

字符串
useFormInput返回一个表单存储对象,以及一个使用set方法更新存储的函数。useFormSubmit从store接收表单值作为参数,并返回一个函数来触发表单提交。当我在填写表单后提交表单时,控制台说我的表单存储中没有有效的文本,例如{name: "", job: "", home: "", gender: ""}。我可以看到我填写的表单在使用美元分配而不是onChange后正确显示。
我注意到dollar assignment在引擎盖下使用了set。美元分配和使用方法之间有什么我不知道的区别吗?
项目在此**StackBlitz**

jjjwad0x

jjjwad0x1#

对于设置没有真实的的区别1.
主要的区别是获取值,因为它在内部使用subscribe,并确保在使用$-syntax时,在组件被销毁时取消订阅。
出于这个原因,一个人应该在可能的情况下使用它。
像这样使用get通常是错误的,因为它不是被动的。大多数情况下,应该创建derived存储,并在使用它们的组件中使用自动订阅。您还可以让派生存储返回一个函数以使其可调用。
1有一件小事浮现在脑海中:使用set而不是$会欺骗依赖分析,从而允许创建循环依赖,否则会引发编译错误。

相关问题