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

Теряется ref для компонентов размещенных в слотах внутри async render #1090

Open
shining-mind opened this issue Jan 22, 2024 · 3 comments
Labels

Comments

@shining-mind
Copy link
Contributor

shining-mind commented Jan 22, 2024

  1. Переключиться на ветку issues/1090
  2. Собрать проект npx webpack --watch --env public-path=//
  3. Запустить веб сервер npx static ./dist/client
  4. Перейти по ссылке http://127.0.0.1:8080/p-v4-components-demo.html и открыть консоль:
select ref {$root: {…}, $parent: {…}, $normalParent: {…}, …}
dummy ref {$root: {…}, $parent: {…}, $normalParent: {…}, …}
async select ref undefined
async dummy ref [{…}]

На селект, размещенный в слоте default компонента b-dummy, нет рефа.

Если компонент сделать функциональным, то рефы появляются, это связано с тем, что у vnode функциональных компонентов есть проп ref и свойство ref:
image

У обычных компонентов свойство ref не задано:
image

@shining-mind
Copy link
Contributor Author

shining-mind commented Jan 23, 2024

В итоге реф selectAsync:u11b99ae2e0e3b2 записывается в $refs к b-dummy, который создан внутри async render. Потому в root компоненте не получается его зарезолвить.

Причина в следующем: внутри async render withCtx теряет ссылку на контекст (currentRenderingInstance), потому слоты создаются с ссылкой на инстанс компонента в рамках которого они вставлены.

Чтобы полечить эту проблему необходимо кэшировать currentRenderingInstance, т.е. завернуть коллбэк функцию для renderList в некое подобие withCtx.

@shining-mind
Copy link
Contributor Author

shining-mind commented Jan 24, 2024

Fixed in #1091

@shining-mind
Copy link
Contributor Author

shining-mind commented Nov 14, 2024

Фикс в #1091 сломался в версии Vue 3.4.7. Ломается обычный v-for, из-за того что мы привязываем currentRenderingInstance внутри renderList.

Сейчас проблему решили иначе: #1487. Сделали так, чтобы v-ref всегда был пропсом.

У нас остается по прежнему две проблемы в случае асинк рендера:

  1. Фикс не будет работать для кейсов с v-func = someExpression
  2. Корневые узлы компонентов имеют ref = null, так как потерян контекст currentRenderingInstance (ломает ли это что-то на практике не известно, но это отличается от синхронного рендера).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant