Vue 异步更新和$nextTick
异步更新
需求:编辑标题,编辑框自动聚焦
案例结构:
1 2 3 4 5 6 7 8
| <div v-if="isShowEdit"> <input type="text" v-model="editValue" ref="inp" /> <button>确认</button> </div> <div v-else> <span>{{ title }}</span> <button @click="handleEdit">编辑</button> </div>
|
数据:
1 2 3 4 5 6 7
| data() { return { title: '大标题', isShowEdit: false, editValue: '', }; },
|
- 点击编辑,显示编辑框
- 让编辑框立刻获得焦点
1 2
| this.isShowEdit = true; this.$refs.inp.focus();
|
问题:”显示之后”,立刻获得焦点是不可能成功的
原因:Vue 是异步更新
DOM(提升性能)
$nextTick
$nextTick
:等 DOM更新后,才会触发执行此方法里的函数体
语法:this.$nextTick(函数体)
1 2 3
| this.$nextTick(() => { this.$refs.inp.focus(); });
|
完整代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <template> <div class="app"> <div v-if="isShowEdit"> <input type="text" v-model="editValue" ref="inp" /> <button>确认</button> </div> <div v-else> <span>{{ title }}</span> <button @click="handleEdit">编辑</button> </div> </div> </template>
<script> export default { data() { return { title: '大标题', isShowEdit: false, editValue: '', }; }, methods: { handleEdit() { this.isShowEdit = true; this.$nextTick(() => { this.$refs.inp.focus(); }); }, }, }; </script>
<style></style>
|