【问题标题】:I have some questions about Sapper/Svelte我有一些关于 Sapper/Svelte 的问题
【发布时间】:2018-03-02 21:01:59
【问题描述】:

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

我有几个关于使用框架的问题。

首先,我将提供我的代码的 sn-p,然后是屏幕截图:

[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>

现在我的问题:

  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() 以覆盖绑定。这可行,但我想知道是否有某种方法可以避免该功能。我认为您可以绑定输入的值并让它自动更新我的&lt;TopBar&gt; 组件绑定...也许?

  6. preload 方法让我可以访问params。我想知道是否有某种方法可以让我在没有预加载功能的情况下访问params.slug。

让专家以最好的方式重写我所做的工作,可能会解决我的一些问题,这将是非常酷的。

【问题讨论】:

    标签: javascript node.js angular frameworks svelte


    【解决方案1】:
    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. 不知道直接的 angular-translate 等价物,但直接的 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)——因此您可以在模板中将其引用为 @ 987654332@,或者在生命周期钩子和方法中作为this.get('params').slug,无论给定组件是否使用preload。

    【讨论】:

    • 非常感谢您的回答。你会推荐github.com/sveltejs/svelte/issues 作为我未来的任何问题的去处吗?
    • Stack Overflow 是解决此类问题的正确位置 - 我们更愿意让问题跟踪器专注于错误和功能讨论
    • 嗨,第 6 点仍然有效吗?出于某种原因,我收到关于 params 未在我的组件中定义的错误。
    • 不是。如果您想以$page.params 访问参数,请执行import { stores } from '@sapper/app'; const { page } = stores();,或者从预加载函数中获取它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 2013-07-07
    • 2013-05-10
    • 2012-03-18
    • 2023-03-09
    相关资源
    最近更新 更多