运行只有选中的文字稳定时才动作
Run the action only when the selected text is stable
我想为 action
函数设置一个计时器。 The rule is: when the selected text does not change for 3 seconds, we 运行 the function action
with the selected text.
我在 playground https://microsoft.github.io/monaco-editor/playground.html 中尝试了以下代码,但没有成功。当我非常快速地更改所选文本时,他们的操作并没有被取消。
有人能帮忙吗?
const editor = monaco.editor.create(document.getElementById('container'), {
value: '1+2+3+4+5+6+7',
language: 'javascript'
});
function action(x) {
console.log("action", x)
}
let myTimeout
editor.onDidChangeCursorSelection((e) => {
clearTimeout(myTimeout)
console.log("cleared", myTimeout)
let selectedText = editor.getModel().getValueInRange(editor.getSelection())
if (selectedText != "") { // if we are already in this event, the selected text must change
myTimeout = setTimeout(action(selectedText), 3000);
console.log("set", myTimeout, selectedText)
}
})
编辑 1: 我的组件是 class 组件,所以我不能使用钩子调用。
您可以使用lodash
的debounce
来达到您想要的效果。并使用 useCallback
确保您获得相同的函数实例。我认为这样的实现可能有效:
import _ from 'lodash';
...
const debouncedAction = _.debounce(action, 3000).bind(this);
editor.onDidChangeCursorSelection((e) => {
let selectedText = editor.getModel().getValueInRange(editor.getSelection())
if (selectedText != "") { // if we are already in this event, the selected text must change
debouncedAction(selectedText);
}
})
我用了this作为参考。
setTimeout
在您调用函数时将其作为输入。我认为下面的代码运行良好。
const editor = monaco.editor.create(document.getElementById('container'), {
value: '1+2+3+4+5+6+7',
language: 'javascript'
});
function action(x) {
console.log("action", x)
}
let myTimeout
editor.onDidChangeCursorSelection((e) => {
clearTimeout(myTimeout)
let selectedText = editor.getModel().getValueInRange(editor.getSelection())
if (selectedText != "") {
// "action" is called inside a function
myTimeout = setTimeout(() => action(selectedText), 3000);
}
})
我想为 action
函数设置一个计时器。 The rule is: when the selected text does not change for 3 seconds, we 运行 the function action
with the selected text.
我在 playground https://microsoft.github.io/monaco-editor/playground.html 中尝试了以下代码,但没有成功。当我非常快速地更改所选文本时,他们的操作并没有被取消。
有人能帮忙吗?
const editor = monaco.editor.create(document.getElementById('container'), {
value: '1+2+3+4+5+6+7',
language: 'javascript'
});
function action(x) {
console.log("action", x)
}
let myTimeout
editor.onDidChangeCursorSelection((e) => {
clearTimeout(myTimeout)
console.log("cleared", myTimeout)
let selectedText = editor.getModel().getValueInRange(editor.getSelection())
if (selectedText != "") { // if we are already in this event, the selected text must change
myTimeout = setTimeout(action(selectedText), 3000);
console.log("set", myTimeout, selectedText)
}
})
编辑 1: 我的组件是 class 组件,所以我不能使用钩子调用。
您可以使用lodash
的debounce
来达到您想要的效果。并使用 useCallback
确保您获得相同的函数实例。我认为这样的实现可能有效:
import _ from 'lodash';
...
const debouncedAction = _.debounce(action, 3000).bind(this);
editor.onDidChangeCursorSelection((e) => {
let selectedText = editor.getModel().getValueInRange(editor.getSelection())
if (selectedText != "") { // if we are already in this event, the selected text must change
debouncedAction(selectedText);
}
})
我用了this作为参考。
setTimeout
在您调用函数时将其作为输入。我认为下面的代码运行良好。
const editor = monaco.editor.create(document.getElementById('container'), {
value: '1+2+3+4+5+6+7',
language: 'javascript'
});
function action(x) {
console.log("action", x)
}
let myTimeout
editor.onDidChangeCursorSelection((e) => {
clearTimeout(myTimeout)
let selectedText = editor.getModel().getValueInRange(editor.getSelection())
if (selectedText != "") {
// "action" is called inside a function
myTimeout = setTimeout(() => action(selectedText), 3000);
}
})