Vuejs Компонент класса Typescript refs.focus не работает - PullRequest
0 голосов
/ 11 февраля 2020

Я использую компонент 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();
  }
} 

Тогда я получаю эту ошибку:

enter image description here

эта проблема исправлена ​​ в этом вопросе Vuejs введите это. $ Refs..значение не существует добавлено:

  $refs!: {
    searchBoard: HTMLInputElement;
  };

I получить новую ошибку в моей консоли

[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

есть ли способ сделать это?

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

Относительно использования setTimeout:

В зависимости от времени вашего кода, кажется, что ваше свойство isShown контролирует, будет ли $refs.searchBoard отображаться в DOM. Вместо setTimeout Vue рекомендует использовать $nextTick для отсрочки действия до следующего цикла DOM:

toggleDropdown() {
  this.isShown = !this.isShown
  this.$nextTick(() => this.$refs.searchBoard.focus())
}

Относительно $refs:

Немного более чистая альтернатива расширению типа $refs в вашем классе - использовать @Ref:

@Component
export default class BoardList extends Vue {
  @Ref() readonly searchBoard!: HTMLInputElement

  toggleDropdown() {
    this.isShown = !this.isShown
    this.$nextTick(() => this.searchBoard.focus())
  }
}
1 голос
/ 11 февраля 2020

Я смог заставить его работать, я добавил .focus() внутри setTimeout().

  toggleDropdown() {
    this.isShown = !this.isShown;

    setTimeout(() => {
      this.$refs.searchBoard.focus();
    }, 50);
  }
...