Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Опциональность $refs #1416

Open
shining-mind opened this issue Sep 12, 2024 · 0 comments
Open

Опциональность $refs #1416

shining-mind opened this issue Sep 12, 2024 · 0 comments
Labels
enhancement Improvement of the existing API question

Comments

@shining-mind
Copy link
Contributor

shining-mind commented Sep 12, 2024

Когда мы используем рефы, к ним по умолчанию стоит относится как к опциональным - их может не быть на определенных этапах жизненного цикла компонента.

В связи с этим возникает вопрос, как гарантировать, что реф существует? Ниже рассмотрим следующие варианты:

await waitRef

const el = await this.waitRef('$el');
el.foo();

Плюсы:

  • позволяет дождаться элемент

Минусы:

  • создает микротаску
  • не гарантирует, что после выполнения await el будет на странице

waitRef().then

this.waitRef('$el').then((el) => el.foo());

Плюсы:

  • позволяет дождаться элемент
  • then выполняется синхронно, если возможно
  • гарантирует наличие $el

Минусы:

  • порождает лапшекод

optional

this.$refs.$el.unwrap().foo();

Плюсы:

  • работает синхронно
  • гарантирует наличие $el

Минусы:

  • зашумление кода
  • при неправильном использовании будет получен exception, который может прервать выполнение программы
  • не позволяет дождаться элемента

проверка на null

const el = this.$refs.$el;

if (el != null) {
  el.foo();
}

Плюсы:

  • гарантирует наличие $el

Минусы:

  • бойлерплейт
  • не позволяет дождаться элемента

декоратор wait

@wait({ref: '$el'})
method() {
  // только внутри метода с декоратором wait
  this.getRef('$el').foo();
}

Плюсы:

  • позволяет дождаться элемент
  • гарантирует наличие $el

Минусы:

  • нужен отдельный геттер для $refs, чтобы обращаться к $el в рамках метода
  • метод не должен иметь асинхронный операций
@shining-mind shining-mind added enhancement Improvement of the existing API question labels Sep 12, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement Improvement of the existing API question
Projects
None yet
Development

No branches or pull requests

1 participant