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