我对Sapper / Svelte有一些疑问

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我对Sapper / Svelte有一些疑问相关的知识,希望对你有一定的参考价值。

我刚开始第一次使用Sapper(https://sapper.svelte.technology)。到目前为止我真的很喜欢它。我需要它做的一件事是显示我的应用程序中可用的组件列表并显示有关它们的信息。理想情况下,有一种方法可以根据页面上的动态绑定更改组件的外观。

我有一些关于使用框架的问题。

首先,我将提供我的代码片段,然后是截图:

[slug].html
-----------

<:Head>
<title>{{info.title}}</title>
</:Head>

<Layout page="{{slug}}">
    <h1>{{info.title}}</h1>

    <div class="content">
         <TopBar :organization_name />
    <br>
    <h3>Attributes</h3>
    {{#each Object.keys(info.attributes) as attribute}}
    <p>{{info.attributes[attribute].description}} <input type="text" on:keyup="updateComponent(this.value)" value="Org Name" /></p>
    {{/each}}
    </div>
</Layout>

<script>
import Layout from '../_components/components/Layout.html';
import TopBar from '../../_components/header/TopBar.html';

let COMPONENTS = require('../_config/components.json');

export default {
    components: {
        Layout, TopBar
    },

      methods: {
          updateComponent(value) {
            this.set({organization_name: value});
          }
      },

  data() {
      return {
        organization_name: 'Org Name'
      }
  },

  preload({ params, query }) {

    params['info'] = COMPONENTS.components[params.slug];

    return params;
  }

};
</script>

enter image description here

现在我的问题:

  1. 我注意到我不能通过我的对象#each。我必须循环其键。如果我可以做这样的事情会很好: {{#each info.attributes as attribute}} {{attribute.description}} {{/每}}
  2. 在Sapper之前,我会使用Angular-translate模块,它可以根据给定的JSON文件对字符串进行翻译。有没有人知道是否存在Sapper / Svelte等效物,或者我可能需要自己想出什么?
  3. 我不习惯做进口。我更喜欢Angular中的依赖注入,看起来更清洁(没有路径)。有什么方法可以创建一个可以在我的文件中使用的COMPONENTS常量,或者我是否需要在每次需要访问其数据时导入JSON文件?
  4. 作为#3的后续,我想知道是否有一种方法可以更好地包含文件而不必依赖使用../..来浏览我的文件夹结构?如果我要改变我的一个文件的路径,我的终端会抱怨并给出错误,这很好,但我仍然想知道是否有更好的方法来导入我的文件。
  5. 我知道必须有更好的方法来实现我在我的例子中实现的内容。基本上,你会在属性旁边看到一个输入框,如果我在那里进行更改,我会调用updateComponent函数,然后在当前作用域中执行this.set()来覆盖绑定。这有效,但我想知道是否有某种方法可以避免这个功能。我认为你可以绑定输入的值并让它自动更新我的<TopBar>组件绑定......也许?
  6. preload方法让我可以访问params。我想知道是否有一些方法可以让我在没有预加载功能的情况下访问params.slug

真正酷的是让一些专家以最好的方式重写我所做的事情,可能会解决我的一些问题。

答案
  1. Svelte只会迭代类似数组的对象,因为它不可能保证对象的一致行为 - 它会抛出最好在应用程序级别解决的各种边缘情况。你可以做这种事情,只使用标准的javascript习惯用法:
{{#each Object.values(info.attributes) as attr}}
  <p>{{attr.description}} ...</p>
{{/each}}

<!-- or, if you need the key as well -->
{{#each Object.entries(info.attributes) as [key, value]}}
  <p>{{attr.description}} ...</p>
{{/each}}
  1. 不知道直接的角度转换等效,但一个简单的i18n解决方案是在preload中获取一些JSON:
preload({ params, query }) {
  return fetch(`/i18n/${locale}.json`)
    .then(r => r.json())
    .then(dict => {
      return { dict };
    });
}

然后,您可以在模板中引用{{dict["hello"]}}之类的内容。更复杂的解决方案只会加载当前页面所需的字符串,并会缓存所有内容等,但基本思路是相同的。

  1. 我想你可以这样做:
// app/client.js (assuming Sapper >= 0.7)
import COMPONENTS from './config/components.json';
window.COMPONENTS = COMPONENTS;

// app/server.js
import COMPONENTS from './config/components.json';
global.COMPONENTS = COMPONENTS;

虽然导入并不是那么糟糕!模块的依赖关系是明确的,这很好。

  1. 您可以在webpack配置中使用resolve.modules字段:https://webpack.js.org/configuration/resolve/#resolve-modules
  2. 这将是一个使用双向绑定的好地方:
{{#each Object.values(info.attributes) as attr}}
  <p>{{attr.description}} <input bind:value=organization_name /></p>
{{/each}}
  1. 是的,params对象总是可以在你的页面中使用(不是嵌套组件,除非你传递了prop,但是所有的顶层组件都像routes/whatever/[slug].html) - 所以你可以在模板中引用它作为{{params.slug}},或者在生命周期钩子和方法中作为this.get('params').slug,无论给定组件是否使用preload

以上是关于我对Sapper / Svelte有一些疑问的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 Sapper 的情况下使用 Svelte 进行代码拆分

Sapper/Svelte/Rollup 外部依赖最佳实践?

如何将 Google Adsense 添加到 Svelte/Sapper 网络应用程序?

Svelte/Sapper.js - 如何使用 localStorage 数据初始化存储?

如何手动将 svelte 组件编译为 sapper/svelte 生成的最终 javascript 和 css?

更改 Svelte / Sapper 中预处理器的顺序