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

时间:2019-01-31 16:06:52

标签: events svelte

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

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

   //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)
    }
  }
}

有人对此问题有更好的解决方案吗?

3 个答案:

答案 0 :(得分:2)

聚会很晚,但我遇到了类似的问题,最终通过一个动作解决了它。对我来说,只有在特定条件为真时,我才需要将点击侦听器附加到按钮上。一个更通用的例子可能是:

<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)
        } 
    }
}

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

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 发生变化,更新就会运行。

答案 1 :(得分:1)

我不知道为什么我没有想到这一点,但这完全是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)
  }

答案 2 :(得分:0)

我尝试了以下方法,并且有效。注意小写的“ 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>