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();
}