Просмотр исходного кода

Pass attributes to parseComponent (addresses #4914) (#4925)

* Pass attributes to parseComponent

* Edited source in the right place, added test

* Back out changes made to the generated compiler build file

* Add a few more checks
Zephraph 9 лет назад
Родитель
Сommit
97d36bc23f
2 измененных файлов с 13 добавлено и 15 удалено
  1. 9 14
      src/sfc/parser.js
  2. 4 1
      test/unit/modules/sfc/sfc-parser.spec.js

+ 9 - 14
src/sfc/parser.js

@@ -36,12 +36,16 @@ export function parseComponent (
     end: number
   ) {
     if (depth === 0) {
+      currentBlock = {
+        type: tag,
+        content: '',
+        start: end,
+        attrs: attrs.reduce((cumulated, { name, value }) => {
+          cumulated[name] = value || true
+          return cumulated
+        }, Object.create(null))
+      }
       if (isSpecialTag(tag)) {
-        currentBlock = {
-          type: tag,
-          content: '',
-          start: end
-        }
         checkAttrs(currentBlock, attrs)
         if (tag === 'style') {
           sfc.styles.push(currentBlock)
@@ -49,15 +53,6 @@ export function parseComponent (
           sfc[tag] = currentBlock
         }
       } else { // custom blocks
-        currentBlock = {
-          type: tag,
-          content: '',
-          start: end,
-          attrs: attrs.reduce((cumulated, { name, value }) => {
-            cumulated[name] = value
-            return cumulated
-          }, Object.create(null))
-        }
         sfc.customBlocks.push(currentBlock)
       }
     }

+ 4 - 1
test/unit/modules/sfc/sfc-parser.spec.js

@@ -16,6 +16,7 @@ describe('Single File Component parser', () => {
       <style module>
         h1 { font-weight: bold }
       </style>
+      <style bool-attr val-attr="test"></style>
       <script>
         export default {}
       </script>
@@ -24,12 +25,14 @@ describe('Single File Component parser', () => {
       </div>
     `)
     expect(res.template.content.trim()).toBe('<div>hi</div>')
-    expect(res.styles.length).toBe(3)
+    expect(res.styles.length).toBe(4)
     expect(res.styles[0].src).toBe('./test.css')
     expect(res.styles[1].lang).toBe('stylus')
     expect(res.styles[1].scoped).toBe(true)
     expect(res.styles[1].content.trim()).toBe('h1\n  color red\nh2\n  color green')
     expect(res.styles[2].module).toBe(true)
+    expect(res.styles[3].attrs['bool-attr']).toBe(true)
+    expect(res.styles[3].attrs['val-attr']).toBe('test')
     expect(res.script.content.trim()).toBe('export default {}')
   })