11

所以我目前有:

应用程序.html

<div>
  <input on:input="debounce(handleInput, 300)">
</div>

<script>
  import { debounce } from 'lodash'

  export default {
    data () {
      name: ''
    },

    methods: {
      debounce,
      async handleInput (event) {
        this.set({ name: await apiCall(event.target.value).response.name })
      }
    }
  }
</script>

并得到错误Uncaught TypeError: Expected a function at App.debounce。这来自 Lodash,因此 Svelte 的方法似乎没有被传递。

额外的额外编辑

我目前如何实现它的额外背景:

oncreate () {
  const debounceFnc = this.handleInput.bind(this)

  this.refs.search.addEventListener('input', debounce(debounceFnc, 300))
}
4

2 回答 2

20

应该去抖动的是方法本身——所以不是调用debounce每个输入事件,而是设置handleInput为去抖动方法:

<div>
  <input on:input="handleInput(event)">
</div>

<script>
  import { debounce } from 'lodash'

  export default {
    data () {
      return { name: '' };
    },

    methods: {
      handleInput: debounce (async function (event) {
        this.set({ name: await apiCall(event.target.value).response.name })
      }, 300)
    }
  }
</script>

这里是简化的 REPL 示例。

编辑:苗条的 v3 版本

<input on:input={handleInput}>

<script>
  import debounce from 'lodash/debounce'

  let name = '';

  const handleInput = debounce(e => {
    name = e.target.value;
  }, 300)
</script>

此处为 REPL 示例。

于 2017-09-08T00:33:44.150 回答
0

接受的答案对 Svelte v1 有效。对于 v3,您可以使用以下代码实现相同的目的:

<input placeholder='edit me' bind:this={input}>
<p>name: {name}</p>

<script>
  import { onMount } from "svelte"
    import { debounce } from 'lodash-es'
    var name="", input;
    onMount(()=>{
        input.addEventListener('input', debounce((e)=>{name=e.target.value}, 250))
    })
</script>
于 2020-01-05T20:08:26.973 回答