我刚开始第一次使用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>
现在我的问题:
#each
。我必须循环其键。如果我可以做这样的事情会很好:
{{#each info.attributes as attribute}}
{{attribute.description}}
{{/每}}COMPONENTS
常量,或者我是否需要在每次需要访问其数据时导入JSON文件?../..
来浏览我的文件夹结构?如果我要改变我的一个文件的路径,我的终端会抱怨并给出错误,这很好,但我仍然想知道是否有更好的方法来导入我的文件。updateComponent
函数,然后在当前作用域中执行this.set()
来覆盖绑定。这有效,但我想知道是否有某种方法可以避免这个功能。我认为你可以绑定输入的值并让它自动更新我的<TopBar>
组件绑定......也许?preload
方法让我可以访问params
。我想知道是否有一些方法可以让我在没有预加载功能的情况下访问params.slug
。真正酷的是让一些专家以最好的方式重写我所做的事情,可能会解决我的一些问题。
{{#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}}
preload
中获取一些JSON:preload({ params, query }) {
return fetch(`/i18n/${locale}.json`)
.then(r => r.json())
.then(dict => {
return { dict };
});
}
然后,您可以在模板中引用{{dict["hello"]}}
之类的内容。更复杂的解决方案只会加载当前页面所需的字符串,并会缓存所有内容等,但基本思路是相同的。
// 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;
虽然导入并不是那么糟糕!模块的依赖关系是明确的,这很好。
resolve.modules
字段:https://webpack.js.org/configuration/resolve/#resolve-modules{{#each Object.values(info.attributes) as attr}}
<p>{{attr.description}} <input bind:value=organization_name /></p>
{{/each}}
params
对象总是可以在你的页面中使用(不是嵌套组件,除非你传递了prop,但是所有的顶层组件都像routes/whatever/[slug].html
) - 所以你可以在模板中引用它作为{{params.slug}}
,或者在生命周期钩子和方法中作为this.get('params').slug
,无论给定组件是否使用preload
。