prop_spec.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. var _ = require('../../../../src/util')
  2. var Vue = require('../../../../src/vue')
  3. if (_.inBrowser) {
  4. describe('prop', function () {
  5. var el
  6. beforeEach(function () {
  7. el = document.createElement('div')
  8. spyOn(_, 'warn')
  9. })
  10. it('should work', function (done) {
  11. var vm = new Vue({
  12. el: el,
  13. data: {
  14. b: 'B',
  15. test: {
  16. a: 'A'
  17. }
  18. },
  19. template: '<test testt="{{test}}" bb="{{b}}" v-ref="child"></test>',
  20. components: {
  21. test: {
  22. props: ['testt', 'bb'],
  23. template: '{{testt.a}} {{bb}}'
  24. }
  25. }
  26. })
  27. expect(el.firstChild.textContent).toBe('A B')
  28. vm.test.a = 'AA'
  29. vm.b = 'BB'
  30. _.nextTick(function () {
  31. expect(el.firstChild.textContent).toBe('AA BB')
  32. vm.test = { a: 'AAA' }
  33. _.nextTick(function () {
  34. expect(el.firstChild.textContent).toBe('AAA BB')
  35. vm.$data = {
  36. b: 'BBB',
  37. test: {
  38. a: 'AAAA'
  39. }
  40. }
  41. _.nextTick(function () {
  42. expect(el.firstChild.textContent).toBe('AAAA BBB')
  43. // test two-way
  44. vm.$.child.bb = 'B'
  45. vm.$.child.testt = { a: 'A' }
  46. _.nextTick(function () {
  47. expect(el.firstChild.textContent).toBe('A B')
  48. expect(vm.test.a).toBe('A')
  49. expect(vm.test).toBe(vm.$.child.testt)
  50. expect(vm.b).toBe('B')
  51. done()
  52. })
  53. })
  54. })
  55. })
  56. })
  57. it('$data as prop', function (done) {
  58. var vm = new Vue({
  59. el: el,
  60. template: '<test $data="{{ok}}"></test>',
  61. data: {
  62. ok: {
  63. msg: 'hihi'
  64. }
  65. },
  66. components: {
  67. test: {
  68. props: ['$data'],
  69. template: '{{msg}}'
  70. }
  71. }
  72. })
  73. expect(el.innerHTML).toBe('<test>hihi</test>')
  74. vm.ok = { msg: 'what' }
  75. _.nextTick(function () {
  76. expect(el.innerHTML).toBe('<test>what</test>')
  77. done()
  78. })
  79. })
  80. it('warn invalid keys', function () {
  81. var vm = new Vue({
  82. el: el,
  83. template: '<test a.b.c="{{test}}"></test>',
  84. components: {
  85. test: {
  86. props: ['a.b.c']
  87. }
  88. }
  89. })
  90. expect(hasWarned(_, 'Invalid prop key')).toBe(true)
  91. })
  92. it('teardown', function (done) {
  93. var vm = new Vue({
  94. el: el,
  95. data: {
  96. b: 'B'
  97. },
  98. template: '<test bb="{{b}}"></test>',
  99. components: {
  100. test: {
  101. props: ['bb'],
  102. template: '{{bb}}'
  103. }
  104. }
  105. })
  106. expect(el.firstChild.textContent).toBe('B')
  107. vm.b = 'BB'
  108. _.nextTick(function () {
  109. expect(el.firstChild.textContent).toBe('BB')
  110. vm._children[0]._directives[0].unbind()
  111. vm.b = 'BBB'
  112. _.nextTick(function () {
  113. expect(el.firstChild.textContent).toBe('BB')
  114. done()
  115. })
  116. })
  117. })
  118. it('block instance with replace:true', function () {
  119. var vm = new Vue({
  120. el: el,
  121. template: '<test b="{{a}}" c="{{d}}"></test>',
  122. data: {
  123. a: 'AAA',
  124. d: 'DDD'
  125. },
  126. components: {
  127. test: {
  128. props: ['b', 'c'],
  129. template: '<p>{{b}}</p><p>{{c}}</p>',
  130. replace: true
  131. }
  132. }
  133. })
  134. expect(el.innerHTML).toBe('<p>AAA</p><p>DDD</p>')
  135. })
  136. })
  137. }