我可以在 svelte 组件上添加条件事件吗?

Can i add conditional events on svelte components?

是否可以在父组件中定义的条件下触发事件?

我有一个输入组件,我想在其中捕获输入。有时,但大多数时候我不希望事件触发

   //App.html
   <Input on:inputData="doStuff(event)" fireEvent=true />    

   //Input.html
   <input bind:value=value (fireEvent ? on:keyup='fire("inputData", { value })' : false )/>

目前发生的是 fireEvent 被忽略并且 on:keyup 总是触发

更新
我将 keyup 更改为一个函数调用,我在触发事件之前检查了参数,它有效但有点古怪

//App.html
<Input on:inputData='doStuff(event.value)' fireEvent={true} />
 ...
  methods: {
  doStuff(text) {
    console.log('here is the stuff', text);
  }

//Input.html
<input bind:value=value on:keyup='setData({ value })'/>
...
methods: {
  setData(text) {
    if(this.get().fireEvent) {
      this.fire("inputData", text)
    }
  }
}

谁有更好的解决这个问题的方法?

我尝试了以下方法并且有效。注意小写 'fireevent'。大写字母把它扔掉了。当然,您必须将其更改为 on:inputData 等

 methods: {
     test(evt) {
  console.log('evt.fireEvent', evt.target.getAttributeNode("fireEvent").value);
  if (evt.target.getAttributeNode("fireevent").value && evt.target.getAttributeNode("fireevent").value=="true")
      console.log('do the happy dance');
  else
      console.log('do NOTHING');

     }
 }
<button on:click="test(event)" fireevent="false">Test</button>

我不知道为什么我没有想到这一点,但这正是 onupdate 的目的

//App.html
<Input on:inputData='doStuff(event.value)' fireEvent={true} />
     ...
methods: {
 doStuff(text) {
   console.log('here is the stuff', text);
 }

//Input.html
<input bind:value=value />
...
onupdate({ changed, current, previous }) {
  if(this.get().fireEvent) {
    this.fire("inputData", current)
  }

派对来晚了,但我遇到了类似的问题,最终通过行动解决了它。对于我来说,只有当某个条件为真时,我才需要将点击侦听器附加到按钮。一个更通用的示例可能是:

<button use:conditionalEvent({condition: foo, event: 'click', callback: bar})>...</button>

...

function conditionalEvent(node, {condition, event, callback}) {
    if (condition) {
        node.addEventListener(event, callback);
    }

    return {
        destroy() {
            node.removeEventListener(event, callback)
        } 
    }
}

如果仅针对单个回调或事件类型,则标记可能不那么冗长,但您明白了。 如果条件可以随着用户输入而改变,您还可以 return 更新函数:

function changingCondition(node, {condition, event, callback}) {
    function update(condition) {
        if (condition) {
            node.addEventListener(event, callback);
        } else {
            node.removeEventListener(event, callback);
        }
    }

    update(condition);

    return {
        update,
        destroy() {
            node.removeEventListener(event, callback)
        } 
    }
}

每当 condition 发生变化时,更新将 运行。