Explorar el Código

support v-pre

Evan You hace 10 años
padre
commit
8e248ef355

+ 4 - 0
src/compiler/codegen/index.js

@@ -66,6 +66,10 @@ function genData (el) {
   if (el.svg) {
     data += 'svg:true,'
   }
+  // pre
+  if (el.pre) {
+    data += 'pre:true,'
+  }
   // key
   if (el.key) {
     data += `key:${el.key},`

+ 38 - 11
src/compiler/parser/index.js

@@ -84,6 +84,7 @@ export function parse (template, options) {
   let currentParent
   let inSvg = false
   let svgIndex = -1
+  let inPre = false
   let warned = false
   parseHTML(template, {
     html5: true,
@@ -117,14 +118,23 @@ export function parse (template, options) {
         svgIndex = stack.length
       }
 
-      processPre(element)
-      processFor(element)
-      processIf(element)
-      processRender(element)
-      processSlot(element)
-      processClassBinding(element)
-      processStyleBinding(element)
-      processAttributes(element)
+      if (!inPre) {
+        processPre(element)
+        if (element.pre) {
+          inPre = true
+        }
+      }
+      if (inPre) {
+        processRawAttrs(element)
+      } else {
+        processFor(element)
+        processIf(element)
+        processRender(element)
+        processSlot(element)
+        processClassBinding(element)
+        processStyleBinding(element)
+        processAttrs(element)
+      }
 
       // tree management
       if (!root) {
@@ -161,6 +171,10 @@ export function parse (template, options) {
         inSvg = false
         svgIndex = -1
       }
+      // check pre state
+      if (element.pre) {
+        inPre = false
+      }
     },
 
     chars (text) {
@@ -181,7 +195,7 @@ export function parse (template, options) {
           : null
       if (text) {
         let expression
-        if (text !== ' ' && (expression = parseText(text))) {
+        if (!inPre && text !== ' ' && (expression = parseText(text))) {
           currentParent.children.push({ expression })
         } else {
           currentParent.children.push({ text })
@@ -193,11 +207,24 @@ export function parse (template, options) {
 }
 
 function processPre (el) {
-  if (el.attrsMap['v-pre']) {
+  if (getAndRemoveAttr(el, 'v-pre') != null) {
     el.pre = true
   }
 }
 
+function processRawAttrs (el) {
+  const l = el.attrsList.length
+  if (l) {
+    el.attrs = new Array(l)
+    for (let i = 0; i < l; i++) {
+      el.attrs[i] = {
+        name: el.attrsList[i].name,
+        value: JSON.stringify(el.attrsList[i].value)
+      }
+    }
+  }
+}
+
 function processFor (el) {
   let exp
   if ((exp = getAndRemoveAttr(el, 'v-for'))) {
@@ -287,7 +314,7 @@ function processStyleBinding (el) {
     getAndRemoveAttr(el, 'v-bind:style')
 }
 
-function processAttributes (el) {
+function processAttrs (el) {
   const list = el.attrsList
   let i, l, name, value, arg, modifiers
   for (i = 0, l = list.length; i < l; i++) {

+ 7 - 0
src/runtime/vdom/modules/pre.js

@@ -0,0 +1,7 @@
+export default {
+  create (_, vnode) {
+    if (vnode.data.pre) {
+      vnode.elm.innerHTML = vnode.data.pre
+    }
+  }
+}

+ 3 - 3
src/runtime/vdom/patch.js

@@ -204,9 +204,9 @@ export default function createPatchFunction (modules, api) {
     if (isDef(i = vnode.data) && isDef(hook = i.hook) && isDef(i = hook.prepatch)) {
       i(oldVnode, vnode)
     }
-    // child component. skip it since it already updated itself in the
-    // prepatch hook.
-    if (isDef(i = vnode.data) && i.child) {
+    // skip child component, which handles its own updates
+    // and nodes with v-pre
+    if (isDef(i = vnode.data) && (i.child || i.pre)) {
       return
     }
     let elm = vnode.elm = oldVnode.elm