Vue异步更新和$nextTick

255 词

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. 让编辑框立刻获得焦点
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() {
// 1.显示输入框(异步dom更新)
this.isShowEdit = true;
// 2.让输入框获取焦点
this.$nextTick(() => {
this.$refs.inp.focus();
});
},
},
};
</script>

<style></style>