3aa150404ba7938b1e1d7fe71b9a9e7c528ceb74ba04593a9c7bf1cf712b9ee257453b5c202bf5e34b30d0ccbbf9b188ea2a890e4f934133f210bf4a16a1a0 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /* @flow */
  2. import { parseText } from 'compiler/parser/text-parser'
  3. import {
  4. getAndRemoveAttr,
  5. getBindingAttr,
  6. baseWarn
  7. } from 'compiler/helpers'
  8. type StaticClassResult = {
  9. dynamic: boolean,
  10. classResult: string
  11. };
  12. function transformNode (el: ASTElement, options: CompilerOptions) {
  13. const warn = options.warn || baseWarn
  14. const staticClass = getAndRemoveAttr(el, 'class')
  15. const { dynamic, classResult } = parseStaticClass(staticClass, options)
  16. if (process.env.NODE_ENV !== 'production' && dynamic && staticClass) {
  17. warn(
  18. `class="${staticClass}": ` +
  19. 'Interpolation inside attributes has been deprecated. ' +
  20. 'Use v-bind or the colon shorthand instead.',
  21. el.rawAttrsMap['class']
  22. )
  23. }
  24. if (!dynamic && classResult) {
  25. el.staticClass = classResult
  26. }
  27. const classBinding = getBindingAttr(el, 'class', false /* getStatic */)
  28. if (classBinding) {
  29. el.classBinding = classBinding
  30. } else if (dynamic) {
  31. el.classBinding = classResult
  32. }
  33. }
  34. function genData (el: ASTElement): string {
  35. let data = ''
  36. if (el.staticClass) {
  37. data += `staticClass:${el.staticClass},`
  38. }
  39. if (el.classBinding) {
  40. data += `class:${el.classBinding},`
  41. }
  42. return data
  43. }
  44. function parseStaticClass (staticClass: ?string, options: CompilerOptions): StaticClassResult {
  45. // "a b c" -> ["a", "b", "c"] => staticClass: ["a", "b", "c"]
  46. // "a {{x}} c" -> ["a", x, "c"] => classBinding: '["a", x, "c"]'
  47. let dynamic = false
  48. let classResult = ''
  49. if (staticClass) {
  50. const classList = staticClass.trim().split(' ').map(name => {
  51. const result = parseText(name, options.delimiters)
  52. if (result) {
  53. dynamic = true
  54. return result.expression
  55. }
  56. return JSON.stringify(name)
  57. })
  58. if (classList.length) {
  59. classResult = '[' + classList.join(',') + ']'
  60. }
  61. }
  62. return { dynamic, classResult }
  63. }
  64. export default {
  65. staticKeys: ['staticClass'],
  66. transformNode,
  67. genData
  68. }