是否有可能在父组件中定义的条件下触发事件?
我有一个输入组件,我想在其中捕获输入。.有时,但是大多数时候我不希望事件触发
//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)
}
}
}
有人对此问题有更好的解决方案吗?
答案 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>