2017-06-22 62 views
1

我建立一个Vue的组件作为单个文件组件:Vue的单个文件元器件数据-V-XXXXXXXX结合生成的元素

<template> 
    <div class="chart"></div> 
</template> 

<script> 
import * as d3 from 'd3'; 

export default { 
    data() { 
    return { 
     data: [4, 8, 15, 16, 23, 42], 
    }; 
    }, 
    mounted() { 
    d3.select('.chart') 
     .selectAll('div') 
     .data(this.data) 
     .enter() 
     .append('div') 
     .style('width', d => `${10 * d}px`) 
     .text(d => d); 
    }, 
}; 
</script> 

<style lang="scss" scoped> 
.chart { 
    div { 
    background-color: steelblue; 
    color: white; 
    font: 10px sans-serif; 
    margin: 1px; 
    padding: 3px; 
    text-align: right; 
    } 
} 
</style> 

用的WebPack处理之后,CSS呈现像这样:

<style type="text/css"> 
.chart div[data-v-xxxxxxxx] { 
    background-color: steelblue; 
    color: white; 
    font: 10px sans-serif; 
    margin: 1px; 
    padding: 3px; 
    text-align: right; 
} 
</style> 

但是HTML显示为:

<div data-v-xxxxxxxx class="chart"> 
    <div style="width: 40px;">4</div> 
    <div style="width: 80px;">8</div> 
    <div style="width: 150px;">15</div> 
    <div style="width: 160px;">16</div> 
    <div style="width: 230px;">23</div> 
    <div style="width: 420px;">42</div> 
</div> 

我使用D3来生成子<div> s。我发现data-v-xxxxxxxx未绑定到生成的元素。如果我有孩子<div> S IN的原始模板,而不是生成它们,它们每一个都具有data-v-xxxxxxxx属性和样式应用如预期

我认为根节点的任何后裔,无论是包括在模板或产生应该被绑定到范围化CSS的规则。有什么办法可以强制这个吗?

+0

你能分享你的模板代码吗? – Hammerbot

+0

@El_Matella我用模板编辑了这个问题,并提供了一些新的见解。 –

+0

你可以添加生成子div的D3的代码吗? – aug

回答

3

vue-loader的新版本(来自版本12.2.0)允许您使用“深层范围”的CSS。您需要使用它的方式:

<style scoped>现在支持 “深” 选择,可以影响孩子使用>>>组合子 组件:

.foo >>> .bar { color: red; }会被编译成:

.foo[data-v-xxxxxxx] .bar { color: red; }

更多关于the release page的资料vue-loader

+1

很好的解决方法,谢谢!这完全适用于我的问题。我最终不得不使用'.chart/deep/div {...'来使它适用于SCSS。我已经改写了这个问题,重点关注如何将'data-v-xxxxxxxx'绑定到生成的元素,但是如果明天没有在这里发布解决方案,那么我会接受这个答案。 –