W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
tick
函數(shù)不同于其他生命周期函數(shù),因為你可以隨時調(diào)用它,而不用等待組件首次初始化。它返回一個帶有resolve方法的 Promise,每當組件pending
狀態(tài)變化便會立即體現(xiàn)到DOM中 (除非沒有pending
狀態(tài)變化)。
在Svelte中每當組件狀態(tài)失效時,DOM不會立即更新。 反而Svelte會等待下一個 microtask 以查看是否還有其他變化的狀態(tài)或組件需要應(yīng)用更新。這樣做避免了瀏覽器做無用功,使之更高效。
這點在本示例中有所體現(xiàn)。選擇文本,然后按“Tab”鍵。 因為 <textarea>
標簽的值已發(fā)生變化,瀏覽器會將選中區(qū)域取消選中并將光標置于文本末尾,這顯然不是我們想要的,我們可以借助tick
函數(shù)來解決此問題:
import { tick } from 'svelte';
然后在 this.selectionStart
和 this.selectionEnd
設(shè)置結(jié)束前立即運行handleKeydown
:
await tick();
this.selectionStart = selectionStart;
this.selectionEnd = selectionEnd;
示例代碼
<script>
let text = `Select some text and hit the tab key to toggle uppercase`;
async function handleKeydown(event) {
if (event.which !== 9) return;
event.preventDefault();
const { selectionStart, selectionEnd, value } = this;
const selection = value.slice(selectionStart, selectionEnd);
const replacement = /[a-z]/.test(selection)
? selection.toUpperCase()
: selection.toLowerCase();
text = (
value.slice(0, selectionStart) +
replacement +
value.slice(selectionEnd)
);
// this has no effect, because the DOM hasn't updated yet
this.selectionStart = selectionStart;
this.selectionEnd = selectionEnd;
}
</script>
<style>
textarea {
width: 100%;
height: 200px;
}
</style>
<textarea value={text} on:keydown={handleKeydown}></textarea>
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: