将道具传递给 Svelte 的根组件

Passing props to the root component of Svelte

我了解到,与许多前端框架一样,Svelte 允许开发人员将逻辑分成更小的、可重用的组件文件。这样做,您可以将 props 从父组件传递到子组件。

我想知道是否可以将 props 传递给根组件本身。我正在尝试使用 Svelte 创建模型,并要求在 App.svelte 范围之外确定一些变量(即在导入 bundle.js 的同一级别分配的变量)

主要有两种方法

将数据添加到全局范围

这利用文档的全局范围在不同脚本之间共享值。它基本上归结为只是在 index.html 中声明一些东西,然后在你觉得合适的地方使用它。

<!-- index.html -->
<script>
  document.myapp = {
    name: 'Svelte'
  }
</script>
<script defer src="build/bundle.js"></script>
// main.js
const app = new App({
    target: document.body,
    props: {
        name: document.myapp.name
    }
});

我在这里使用 main.js 是因为我喜欢在我的应用程序中将所有外部非正式内容放在一起,但理论上你可以在任何你想要的地方使用 document.myapp.name,甚至作为商店的默认值

//store.js
export const name = readable(document.myapp.name)

你必须确保的一件事当然是这个对象在 svelte 应用程序 运行s 之前初始化(否则它只会是 undefined 甚至崩溃)

导出并调用应用程序

第二种方法是不直接在 main.js 中 运行 您的应用程序,而是让另一个脚本调用它。

// main.js
import App from './App.svelte'
export default App
<!-- index.html -->
<head>
    <script src='/build/bundle.js'></script>
</head>
<body>
    <script>
        new app({
            target: document.body,
            props: {
                name: 'from App'
            }
        })
    </script>
</body>

在这种情况下,确保脚本 运行s 在页面加载后和包加载后很重要(这里我通过在 body 标记中添加脚本并删除 defer 从捆绑中,我猜有更好的方法来做到这一点)

此方法的另一个重要说明是您的应用名称不一定是您从 main.js 导出的名称,它在输出配置的 rollup.config.js 中定义为 name(默认为 app

//rollup.config.js
output: {
  sourcemap: true,
  format: 'iife',
  name: 'app',
  file: 'public/build/bundle.js'
},