Hotwire/Turbo Frames: почему target: "_top" не запрашивает страницы через выборку?
Я нахожусь на ранних этапах переноса приложения Rails из Turbolinks/rails-ujs (используя старый добрый
js.erb
просмотры, которые творили чудеса) на Hotwire/Turbo.
Представьте себе традиционный
users/index.html.erb
страница с формой поиска и таблицей результатов:
<%= form_with(scope: :search, url: url_for, method: :get, data: { turbo_frame: "users_table" }) do |f| %>
<%= f.search_field :name %>
<% end %>
<%= turbo_frame_tag("users_table") do %>
<% @users.each do |user| %>
<%= link_to user.name, user, target: :_top %>
<% end %>
<%== pagy_bootstrap_nav(@pagy) %>
<% end %>
Таким образом, приведенная выше форма поиска может обновлять приведенный ниже turbo_frame_tag без полной перезагрузки страницы (что сохраняет фокус и состояние в форме по желанию).
Ожидается, что каждая ссылка внутри turbo_frame_tag ведет к /users/show, заменяя собой всю страницу. И это работает, благодаря включению
target: :_top
атрибут в каждой ссылке.
Однако страдает пользовательский опыт. С Turbolinks каждая ссылка внутри таблицы users_table выполняла навигацию AJAX, заменяя «тело» и ощущалась очень, очень быстрой. С Turbo/Hotwire я вижу в devtools, что только разбивка на страницы (внутри турбо-фрейма) и отправка формы (из-за атрибута turbo_frame) извлекаются с использованием
fetch
, а ссылка в имени пользователя запрашивается как обычная
document
навигация.
Дело обстоит еще хуже: кнопка «Назад» также не имеет кеша, поэтому нажатие на имя пользователя и возврат занимает в 5 раз больше времени, чем с Turbolinks.
Это ожидаемая регрессия при использовании Turbo? Каждый раз, когда у меня есть ссылка внутри turbo_frame, которую я хочу вырвать за пределы фрейма, я теряю все преимущества навигации ajax?
1 ответ
Решение найдено.
Вместо
<%= link_to user.name, user, target: :_top %>
Следует использовать
<%= link_to user.name, user, data: { turbo_frame: :_top } %>