【问题标题】:Is it possible to update component variables from within Svelte action?是否可以从 Svelte 操作中更新组件变量?
【发布时间】:2022-01-28 15:36:06
【问题描述】:

动作可以更新组件变量吗?例如,在下面的App.svelte 中是否可以更新disablederrors 的值?

<script>
  import { form } from './use-form'

  let disabled
  let errors = {}

  const submit = e => {
    const formData = new FormData(e.target)

    const data = {}
    for (let field of formData) {
      const [key, value] = field
      data[key] = value
    }
    console.log(data)
    e.target.reset()
  }
</script>

<form on:submit|preventDefault={submit} use:form={[disabled, errors]}>
  <input name="email" type="email" required />
  {#if errors && errors.email} <p>{errors.email}</p>{/if}
  <input name="password" type="text" minlength="8" required />
  {#if errors && errors.password} <p>{errors.password}</p>{/if}
  <hr />
  <button formnovalidate disabled={!disabled}>submit</button>
</form>

这是use-form 操作:

export const form = (node, [disabled, errors]) => {
  let inputs = node.querySelectorAll('input:invalid')

  const handleBlur = event => {
    ;[...inputs].forEach(e => {
      if (e.value.length === 0) {
        return
      } else {
        errors[e.name] = e.validationMessage
      }
    })

    disabled = node.checkValidity()
  }

  const handleInput = event => {
    ;[...inputs].forEach(e => {
      if (e.value.length === 0) {
        return
      } else {
        errors[e.name] = e.validationMessage
      }
    })

    disabled = node.checkValidity()
  }

  document.addEventListener('blur', handleBlur, true)
  document.addEventListener('input', handleInput, true)

  return {
    update: (disabled, errors) => {
      return disabled, errors
    },
    destroy: () => {
      document.removeEventListener('blur', handleBlur, true)
      document.removeEventListener('input', handleInput, true)
    },
  }
}

为了更好地说明我正在尝试实现的目标here's,尽管所有内容都夹在一个文件中,但使用粗略的工作解决方案进行排斥。

【问题讨论】:

    标签: svelte svelte-3 sveltekit svelte-component


    【解决方案1】:

    这不起作用,因为 Svelte 不知道它们已更新。你可以做的是要么

    • 向动作添加事件并在组件的回调内部进行重新分配:use:form={{onDisabled: d =&gt; disabled = d, ...}}(在动作调用onDisabled(node.checkValidity()) 内部)
    • 改用商店,因为 Svelte 会在更新时注意到:let disabled = writable(false); ...(在操作中执行 disabled.set(node.checkValidity())

    【讨论】:

    • 我尝试用 store (svelte.dev/repl/b452e7006bfb42759207fd8ed7aa708d?version=3.46.3) 来做,但它只在第一次工作。任何进一步的尝试都不会显示密码输入错误。另外,您能否详细说明第一种方法(事件)?我不太明白你的意思。
    • 你的例子是错误的,update 没有按照你的想法做。 update 的动作在其输入发生变化时被调用。您需要在输入/模糊回调中调用 disabled.set/errors.set
    猜你喜欢
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 2020-11-08
    • 1970-01-01
    相关资源
    最近更新 更多