Vuejs 打字稿 class 组件 refs.focus 不工作
Vuejs Typescript class component refs.focus not working
我正在使用 Typescript Class 组件,但遇到这个问题我无法使用 this.$refs.<refname>.focus()
模板代码:
<header class="py-2 px-1 m-0 row">
<input
type="text"
class="form-control m-1"
ref="searchBoard"
placeholder="Find boards by name..."
/>
</header>
此输入字段位于 弹出窗口 内。
打字稿代码:
import { Component, Vue } from "vue-property-decorator";
@Component
export default class BoardList extends Vue {
// I added this to solve the compile error
$refs!: {
searchBoard: HTMLInputElement;
};
isShown = false;
toggleDropdown() {
this.isShown = !this.isShown;
this.$refs.searchBoard.focus();
}
}
然后我得到这个错误:
这个问题在这个问题中已修复
已添加:
$refs!: {
searchBoard: HTMLInputElement;
};
我的控制台出现新错误
[Vue warn]: Error in v-on handler: "TypeError: this.$refs.searchBoard is undefined"
found in
---> <BoardList> at src/components/boards/buttons/BoardList.vue
<NavbarTop> at src/components/NavbarTop.vue
<ComponentName> at src/App.vue
<Root> vue.runtime.esm.js:619
VueJS
7
有办法吗?
我能够让它工作,我在 setTimeout()
中添加了 .focus()
。
toggleDropdown() {
this.isShown = !this.isShown;
setTimeout(() => {
this.$refs.searchBoard.focus();
}, 50);
}
关于setTimeout
的使用:
根据您的代码时间,您的 isShown
属性 似乎控制 $refs.searchBoard
是否在 DOM 中呈现。 Vue 建议使用 $nextTick
代替 setTimeout
将操作推迟到下一个 DOM 周期:
toggleDropdown() {
this.isShown = !this.isShown
this.$nextTick(() => this.$refs.searchBoard.focus())
}
关于$refs
:
比 $refs
type extension in your class is to use @Ref
更简洁的替代方法:
@Component
export default class BoardList extends Vue {
@Ref() readonly searchBoard!: HTMLInputElement
toggleDropdown() {
this.isShown = !this.isShown
this.$nextTick(() => this.searchBoard.focus())
}
}
试试这个
toggleDropdown() {
this.isShown = !this.isShown;
this.$refs.searchBoard.$el.focus();
}
我正在使用 Typescript Class 组件,但遇到这个问题我无法使用 this.$refs.<refname>.focus()
模板代码:
<header class="py-2 px-1 m-0 row">
<input
type="text"
class="form-control m-1"
ref="searchBoard"
placeholder="Find boards by name..."
/>
</header>
此输入字段位于 弹出窗口 内。
打字稿代码:
import { Component, Vue } from "vue-property-decorator";
@Component
export default class BoardList extends Vue {
// I added this to solve the compile error
$refs!: {
searchBoard: HTMLInputElement;
};
isShown = false;
toggleDropdown() {
this.isShown = !this.isShown;
this.$refs.searchBoard.focus();
}
}
然后我得到这个错误:
这个问题在这个问题
$refs!: {
searchBoard: HTMLInputElement;
};
我的控制台出现新错误
[Vue warn]: Error in v-on handler: "TypeError: this.$refs.searchBoard is undefined"
found in
---> <BoardList> at src/components/boards/buttons/BoardList.vue
<NavbarTop> at src/components/NavbarTop.vue
<ComponentName> at src/App.vue
<Root> vue.runtime.esm.js:619
VueJS
7
有办法吗?
我能够让它工作,我在 setTimeout()
中添加了 .focus()
。
toggleDropdown() {
this.isShown = !this.isShown;
setTimeout(() => {
this.$refs.searchBoard.focus();
}, 50);
}
关于setTimeout
的使用:
根据您的代码时间,您的 isShown
属性 似乎控制 $refs.searchBoard
是否在 DOM 中呈现。 Vue 建议使用 $nextTick
代替 setTimeout
将操作推迟到下一个 DOM 周期:
toggleDropdown() {
this.isShown = !this.isShown
this.$nextTick(() => this.$refs.searchBoard.focus())
}
关于$refs
:
比 $refs
type extension in your class is to use @Ref
更简洁的替代方法:
@Component
export default class BoardList extends Vue {
@Ref() readonly searchBoard!: HTMLInputElement
toggleDropdown() {
this.isShown = !this.isShown
this.$nextTick(() => this.searchBoard.focus())
}
}
试试这个
toggleDropdown() {
this.isShown = !this.isShown;
this.$refs.searchBoard.$el.focus();
}