【发布时间】:2019-11-23 16:04:38
【问题描述】:
我正在开发一个 vue.js / nuxt.js 项目,应用Atomic Design 方法,我需要做一个设置网格布局并使用CSS Grid Layout。
我已经做了组件
GridLayout.vue
<template>
<div class="grid">
<style>
{{ css }}
</style>
<slot />
</div>
</template>
<script>
export default {
props: {
columns: String,
rows: String,
areas: String,
gap: String,
columnGap: String,
rowGap: String,
// breakpoints
small: Object,
medium: Object,
large: Object
},
computed: {
css () {
let large = ''
let finalStyle = ''
// generic
let generic = ''
if (this.columns) generic += `grid-template-columns: ${this.columns};`
if (this.rows) generic += `grid-template-rows: ${this.rows};`
if (this.areas) generic += `grid-template-areas: "${this.areas}";`
if (this.gap) generic += `grid-gap: ${this.gap};`
if (this.columnGap) generic += `grid-column-gap: ${this.columnGap};`
if (this.rowGap) generic += `grid-row-gap: ${this.rowGap};`
finalStyle += ` .grid { ${generic} }`
// small
let small = ''
if (this.small) {
if (this.small.columns) small += `grid-template-columns: ${this.small.columns};`
if (this.small.rows) small += `grid-template-rows: ${this.small.rows};`
if (this.small.areas) small += `grid-template-areas: "${this.small.areas}";`
if (this.small.gap) small += `grid-gap: ${this.small.gap};`
if (this.small.columnGap) small += `grid-column-gap: ${this.small.columnGap};`
if (this.small.rowGap) small += `grid-row-gap: ${this.small.rowGap};`
finalStyle += `@media (max-width: 600px) { .grid { ${small} } } `
}
// medium
let medium = ''
if (this.medium) {
if (this.medium.columns) medium += `grid-template-columns: ${this.medium.columns};`
if (this.medium.rows) medium += `grid-template-rows: ${this.medium.rows};`
if (this.medium.areas) medium += `grid-template-areas: "${this.medium.areas}";`
if (this.medium.gap) medium += `grid-gap: ${this.medium.gap};`
if (this.medium.columnGap) medium += `grid-column-gap: ${this.medium.columnGap};`
if (this.medium.rowGap) medium += `grid-row-gap: ${this.medium.rowGap};`
finalStyle += `@media (min-width: 600px) and (max-width: 992px) { .grid { ${medium} } } `
}
return finalStyle
},
},
}
</script>
<style lang="scss" scoped>
.grid {
display: grid;
}
</style>
在任何 page.vue 上使用组件
<template>
<GridLayout
columns="1fr 1fr 1fr 1fr"
rows="auto"
gap="10px"
:medium="{
columns: '1fr 1fr',
rows:'auto auto'
}"
:small="{
columns: '1fr',
rows: 'auto auto auto auto',
}"
>
<h1>1</h1>
<h1>2</h1>
<h1>3</h1>
<h1>3</h1>
</GridLayout>
</template>
<script>
import { GridLayout } from '@/components/bosons'
export default {
components: {
GridLayout
}
}
</script>
问题
1 - <template> 内的样式标签 <style> 需要限定范围,仅适用于组件本身
2 - 每当我想要 GridLayout 组件的新属性时,例如,child align,我必须在计算中的任何地方添加,即generic、small、medium、large
我该如何解决这些问题?也许让我的代码更小、更智能、更少重复
提前致谢
【问题讨论】:
-
我认为这个问题更适合代码审查:codereview.stackexchange.com。
-
见stackoverflow.com/help/dont-ask。您能否编辑您的问题以专注于特定的编码问题而不是意见?
-
@chipit24,我更新了我的问题,我不征求更多意见,我明确提出问题。
-
1) 如果您的样式只适用于单个节点,则需要
id。我对vue不是很了解,但是如果它有状态,你可以在生成实例时创建一个随机id并存储它。和 2) 你知道什么是重复性工作的真正优势:函数或循环 *wink* -
Vue 不仅与原子设计兼容,而且实际上基于相同的原则。你只需要遵循 Vue 的特定语法和约定。在 Vue 中,作用域 CSS 位于标记之外并且是作用域的。阅读the docs。昨天我回答了一个关于 Vue 中作用域 CSS 的问题,我为此做了这个codesandbox。您可能会发现它很有用。
标签: javascript vue.js vuejs2 nuxt.js