我正在尝试使用rails 7、stimulus和navigator.share实现共享功能,但并非所有浏览器都支持该功能。对于这些情况,我需要将链接复制到剪贴板,但显示flash消息。我的flash消息有问题。解决此问题的正确方法是什么?是否有可能这样做?
分享按钮
<div data-controller="share"
data-share-target="trigger"
data-share-url-value="<%= post_url(@post) %>"
data-share-name-value="<%= @post.name %>">
<%= button_to "", data: { action: "click->share#share" } do %>
<%= inline_svg_tag "svg/share.svg", class: 'h-6 w-6' %>
<% end %>
</div>
刺激控制器
import { Controller } from "@hotwired/stimulus";
export default class extends Controller {
static targets = ["trigger"];
static values = ["name"];
connect() {}
async share(e) {
e.preventDefault();
const shareData = {
name: this.nameValue,
url: this.data.get("urlValue"),
text: "some cool text",
title: "title here",
};
try {
if (navigator.share) {
await navigator.share(shareData);
} else {
navigator.clipboard.writeText(this.data.get("urlValue"));
// Trigger Flash message here
}
} catch (err) {
console.log(err);
}
}
}
我的闪光灯
app/views/layouts/application.html.erb
<body class="min-h-full flex flex-col h-full">
<main class="flex-1">
<div id="flash" class="w-full">
<% flash.each do |key, value| %>
<div>
<p><%= value %></p>
</div>
<% end %>
</div>
<%= yield %>
</main>
</body>
这是可能的吗?如果不可能,你会如何实施?我也希望有任何关于实施的反馈。
1条答案
按热度按时间6ie5vjzr1#
有几种方法可以解决这个问题,最简单的方法是在同一个
Share
控制器中添加动态注入消息的功能。下面是一个完整的代码示例。
1. HTML
#flash
元素中添加一个template
元素,以容纳要为每条消息复制的客户端HTML内容。data-share-target="trigger"
,因为您可以始终使用this.element
访问受控元素,但看起来您无论如何都没有使用它。button
,请记住添加type="button"
避免了使用event.preventDefault
的需要,并且它可以更好地实现可访问性。aria-label
,但你也可以添加一个跨度sr-only
(looks like you are using Tailwind)。2.控制器(JS)
addMessage
,它将找到id为flash
的元素,然后在里面找到模板元素。它将克隆该元素,然后找到放置消息内容的位置。然后它将把这个节点追加到flash容器中。addMessage
方法后,如果需要向用户显示“剪贴板已更新”消息和任何错误,就可以使用这个方法来显示它们。then
回调就足够了。替代方式
另一种方法是将flash消息行为拆分到一个新的控制器中。如果您希望其他代码需要动态创建消息,这将非常有用。
这里有一个参考实现,您可以使用它。
https://github.com/wagtail/wagtail/blob/main/client/src/controllers/MessagesController.ts(Wagtail,一个基于Django的CMS,有一个类似的全局消息用例)。
你也可以使用一个刺激的方法来处理'remove after a delay'部分,这里有一个'吐司'样式的删除的参考实现。
https://github.com/stimulus-components/stimulus-notification/blob/master/src/index.ts
最好从简单的开始,只有在需要的时候才添加这个单独的控制器行为。