- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望在 svelte 中创建一个 Spacer 元素。我已经完成了我设定的目标,即允许用户将元素包装在 <Space></Space>
中。标记并传递 Prop 以垂直/水平均匀地间隔它们,甚至对齐内部元素中心/开始/结束/基线。我遇到的问题是我必须将每个子元素包装到 <Space></Space>
用<SpaceItem></SpaceItem>
以获得预期的效果。这是示例代码:
App.svelte
<script>
import {Space, SpaceItem} from './components/Space';
</script>
<Space>
<SpaceItem>
<Button primary>Primary</Button>
</SpaceItem>
<SpaceItem>
<Button primary icon="add">Primary</Button>
</SpaceItem>
<SpaceItem>
<Button danger>Danger</Button>
</SpaceItem>
</Space>
Space.svelte
<script>
import { SPACE } from './SpaceContext.svelte';
import { setContext } from 'svelte';
import { readable } from 'svelte/store';
export let vertical = false;
export let horizontal = true;
export let alignCenter = false;
export let alignStart = false;
export let alignEnd = false;
export let alignBaseline = false;
export let large = false;
export let middle = false;
export let size = null;
horizontal = vertical ? false : true;
size = size ? size : large ? 24 : middle ? 16 : 8;
const gap = readable(size);
const direction = readable(horizontal ? 'horizontal' : 'vertical');
setContext(SPACE, {
gap,
direction,
});
</script>
<style>
.space {
display: -webkit-inline-box;
display: -ms-inline-flexbox;
display: inline-flex;
}
.vertical {
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
}
.align-center {
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
}
.align-start {
-webkit-box-align: start;
-ms-flex-align: start;
align-items: flex-start;
}
.align-end {
-webkit-box-align: end;
-ms-flex-align: end;
align-items: flex-end;
}
.align-baseline {
-webkit-box-align: baseline;
-ms-flex-align: baseline;
align-items: baseline;
}
</style>
<div
class="space"
class:horizontal
class:vertical
class:size
class:align-center={alignCenter}
class:align-start={alignStart}
class:align-end={alignEnd}
class:align-baseline={alignBaseline}>
<slot />
</div>
空间项目
<script>
import { SPACE } from './SpaceContext.svelte';
import { getContext } from 'svelte';
const { gap, direction } = getContext(SPACE);
let style;
if ($direction === 'horizontal') {
style = `margin-right: ${$gap}px;`;
} else {
style = `margin-bottom: ${$gap}px;`;
}
</script>
<style>
</style>
<div class="item" {style}>
<slot />
</div>
有没有办法消除 <SpaceItem></SpaceItem>
元素和 <Space></Space>
包装传递给其 <slot />
的每个元素与 <SpaceItem></SpaceItem>
?我只想将所有元素包装在一个 Space 标签中,而不是将每个单独的元素包装在 SpaceItem 标签中。
期望的效果是让我能够写:
App.svelte
<script>
import {Space, SpaceItem} from './components/Space';
</script>
<Space>
<Button primary>Primary</Button>
<Button primary icon="add">Primary</Button>
<Button danger>Danger</Button>
</Space>
并且仍然用 <SpaceItem></SpaceItem>
包裹每个按钮在 Space.svelte 文件中。
最佳答案
这是我自己制定的解决方案,但我不确定这在实际应用程序中是否会出现任何性能问题,因此欢迎提出意见。
App.svelte
<script>
import Space from './Space.svelte';
import Button from './Button.svelte';
</script>
<Space>
<Button primary>Primary</Button>
<Button primary icon="add">Primary</Button>
<Button danger>Danger</Button>
</Space>
<Space vertical large alignCenter>
<Button primary icon="add">Primary</Button>
<Button danger>Danger</Button>
</Space>
Space.svelte
<script>
import { onMount } from 'svelte';
import addWrapper from './utils/addWrapper';
export let vertical = false;
export let horizontal = true;
export let alignCenter = false;
export let alignStart = false;
export let alignEnd = false;
export let alignBaseline = false;
export let large = false;
export let middle = false;
export let size = null;
horizontal = vertical ? false : true;
size = size ? size : large ? 24 : middle ? 16 : 8;
const gap = size;
const direction = horizontal ? 'horizontal' : 'vertical';
let style;
if (direction === 'horizontal') {
style = `margin-right: ${gap}px;`;
} else {
style = `margin-bottom: ${gap}px;`;
}
let currentEl;
onMount(async () => {
addWrapper({
node: currentEl,
tag: 'div',
style,
});
});
</script>
<style>
.space {
display: -webkit-inline-box;
display: -ms-inline-flexbox;
display: inline-flex;
}
.vertical {
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
}
.align-center {
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
}
.align-start {
-webkit-box-align: start;
-ms-flex-align: start;
align-items: flex-start;
}
.align-end {
-webkit-box-align: end;
-ms-flex-align: end;
align-items: flex-end;
}
.align-baseline {
-webkit-box-align: baseline;
-ms-flex-align: baseline;
align-items: baseline;
}
</style>
<div
bind:this={currentEl}
class="space"
class:horizontal
class:vertical
class:align-center={alignCenter}
class:align-start={alignStart}
class:align-end={alignEnd}
class:align-baseline={alignBaseline}
>
<slot />
</div>
addWrapper.js
export default async function addWrapper({ node, tag, style }) {
const children = node.childNodes;
[].forEach.call(children, function (child) {
if (child.nodeName !== "#text" && child.nodeName !== "#comment") {
let wrapper = document.createElement(tag);
wrapper.setAttribute("style", style);
child.parentNode.insertBefore(wrapper, child);
wrapper.appendChild(child);
}
});
}
据说这可行,并且无需为简单情况创建单独的包装器,但更复杂的包装器将需要重新工作。如果有人有更简单、更高效的更好建议,我会洗耳恭听。
关于细长包裹每个插槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62157179/
我想了解如何正确地从 Parcel 中读取空值。让我们看看我的用例: public class MyModel implements Parcelable { private Long id;
好吧,我知道我必须使用 JDBC 等,但我不确定如何将 jar 实现到我的代码中,我有一个基本代码来打开文件等,但我如何才能真正将 sqlite jar 与我的 java 一起合并类文件可以在任何地方
我想知道是否可以打包(或序列化)ClassLoader 以通过 Message 将其发送到 Android 中的另一个进程。 ClassLoader没有实现 Parcelable/Serializab
在上传到我的域时尝试让我的 SVG 出现在浏览器中时,我 - 类似于我拥有 的其他项目包裹安装 - 创建了一个 静态文件夹 我会将 SVG 文件放入的位置。它现在出现在浏览器中,但是,正在播放的“绘图
我有这样的东西: 我希望以最简单的方式实现这样的事情:
当我们使用一个独立的函数语句作为 IIFE 时,我们需要用 () 包装它以使其工作 // IFFE (function a(){ console.log('Hello') }()); // I
我正在为 WCF 开发一个 Java 客户端,并且模板运行良好。我最初使用的是 eclipse 的 Web 服务客户端项目,但后来发现 android 平台不支持所需的库。当时我打算使用 ksoap,
我希望将整行变为可点击。现在行看起来像 Group Obj
我有以下标记(使用 Bootstrap 4): .resource{ border:1px solid red; } tes
#parent{ max-width:1100px; margin: auto; border: 1px solid red; padding: 40px; } #ch
我正在尝试用自定义指令包裹 Angular 带的弹出框。 弹出窗口应该能够使用由使用我的指令的人提供的自定义模板,并且该模板应该能够使用 Controller 的范围。 对于范围部分,我发现我可以将
我有一个 HTML 页面,其中一个 div 包含另一个包含数据库(聊天系统)中所有用户的 div,但是 ul li 标签没有占用父 div 的整个宽度。这是预期结果的图像:http://prntscr
我正在尝试通过套接字将包裹发送到 Android 应用程序。客户端在 libbinder(c++) 中,服务器是一个必须重建包裹的 android 应用程序。我一直在寻找解决方案有一段时间了,但我不知
当我部署一个网站(有多个入口点,许多 HTML 文件)并且主机使用构建命令时:parcel build index.html aboutme.html。部署的网站给我一个 404 错误。但是,如果我在
在 Quarkus 中,异常映射器返回的实体似乎被包装在另一个实体中。 提供一个 JAX-RS 异常映射器,例如: @Provider public class WebhookExceptionMap
如果我设置 textLayer.wrapped = YES , 如何调整大小 textLayer包含包装的文本?即,我如何获得 textLayer 的新高度? 基本上,我想要类似 -[UILabel
您好,如果类有 anchor ,我会尝试用 anchor 包裹图像。 jQuery: if ( $(".views-row:has(a)").length) { var noderef = $
所以,我以前多次使用 Parcel,我从来没有遇到过问题。 这一次它抛出了一些关于 SemVer 版本控制的愚蠢错误,我真的很想找到解决这个问题的解决方案。 我开始了新项目:安装了 npm w/npm
我将 Kotlin 与 Anko 一起使用,我想向另一个 Activity 发送玩家列表。 class Player(var name: String?) { var score: Int = 0 i
我正在尝试使用 Parcelable 通过 Activity 传递数据。这是我的代码: public class Player implements Parcelable { public stati
我是一名优秀的程序员,十分优秀!