no-v-for-template-key.js 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. /**
  2. * @author Yosuke Ota
  3. */
  4. 'use strict'
  5. const utils = require('../utils')
  6. module.exports = {
  7. meta: {
  8. type: 'problem',
  9. docs: {
  10. description: 'disallow `key` attribute on `<template v-for>`',
  11. categories: ['vue2-essential'],
  12. url: 'https://eslint.vuejs.org/rules/no-v-for-template-key.html'
  13. },
  14. fixable: null,
  15. schema: [],
  16. messages: {
  17. disallow:
  18. "'<template v-for>' cannot be keyed. Place the key on real elements instead."
  19. }
  20. },
  21. /** @param {RuleContext} context */
  22. create(context) {
  23. return utils.defineTemplateBodyVisitor(context, {
  24. /** @param {VDirective} node */
  25. "VElement[name='template'] > VStartTag > VAttribute[directive=true][key.name.name='for']"(
  26. node
  27. ) {
  28. const element = node.parent.parent
  29. const keyNode =
  30. utils.getAttribute(element, 'key') ||
  31. utils.getDirective(element, 'bind', 'key')
  32. if (keyNode) {
  33. context.report({
  34. node: keyNode,
  35. loc: keyNode.loc,
  36. messageId: 'disallow'
  37. })
  38. }
  39. }
  40. })
  41. }
  42. }