我有一个基本的VueJS应用程序,只有一个页面。它不是一个SPA,我不使用vue-router。
我想实现一个按钮,当单击该按钮时,将执行window.open()函数,其中包含来自我的一个Vue组件的内容。
查看window.open()
的文档,我看到URL的以下语句:
URL接受HTML页面、图像文件或浏览器支持的任何其他资源的路径或URL。
是否可以将组件作为window.open()
的参数传递?
我有一个基本的VueJS应用程序,只有一个页面。它不是一个SPA,我不使用vue-router。
我想实现一个按钮,当单击该按钮时,将执行window.open()函数,其中包含来自我的一个Vue组件的内容。
查看window.open()
的文档,我看到URL的以下语句:
URL接受HTML页面、图像文件或浏览器支持的任何其他资源的路径或URL。
是否可以将组件作为window.open()
的参数传递?
4条答案
按热度按时间f4t66c6m1#
我能够使用an article about Portals in React的一些见解来创建一个Vue组件,该组件能够在新窗口中挂载其子组件,同时保持React性!
在这款codesandbox中试试吧!
此组件的代码如下所示:
关键是
this.windowRef.document.body.appendChild(this.$el)
线;该行有效地删除了与Vue组件关联的DOM元素(顶层<div>
),并将其插入子窗口的主体。由于此元素与Vue通常更新的元素是 * 相同的引用 *,只是在不同的位置,因此所有内容Just Works - Vue将继续更新元素以响应数据绑定更改,尽管它被安装在一个新的窗口。我其实很惊讶这是多么简单!b1payxdu2#
你不能传递一个Vue组件,因为
window.open
不知道Vue。然而,你可以做的是创建一个显示你的组件的路由,并将这个路由的URL传递给window.open
,给你一个包含你的组件的新窗口。但是,不同窗口中的组件之间的通信可能会很棘手。3npbholx3#
例如,如果main vue声明为
如果您只需要在新窗口中呈现少量数据,那么您可以从父窗口引用数据模型。
q5lcpyga4#
我把Alex的贡献移植到了Composition API中,运行得很好。唯一的烦恼是创建的窗口忽略了大小和位置,可能是因为它是从全屏的Chrome应用程序启动的。