测试用例

  1. it('should allow attrs to fallthrough', async () => {
  2. debugger
  3. const click = jest.fn()
  4. const childUpdated = jest.fn()
  5. const Hello = {
  6. setup() { // 如果有render 就优先渲染render了
  7. const count = ref(0)
  8. function inc() { // 需要了解onClick事件系统
  9. count.value++
  10. click()
  11. }
  12. // 这里的任何东西 都不会被本身effect收集 只有return 后的方法 才会
  13. return () => // 这里还可以当redner来使用 我平时会的只是 return {} template所需要的事件或属性 所以是检查function 还是 object来判断的吧
  14. h(Child, { // 那是不是有一个props effect? 标记也要注意下
  15. foo: count.value + 1,
  16. id: 'test',
  17. class: 'c' + count.value,
  18. style: { color: count.value ? 'red' : 'green' },
  19. onClick: inc,
  20. 'data-id': count.value + 1
  21. })
  22. },
  23. mounted() {
  24. console.log('?')
  25. }
  26. }
  27. const Child = { // 原来是这样传参数的 那么就不需要this 什么的了
  28. setup(props: any) {
  29. onUpdated(childUpdated)
  30. return () =>
  31. h(
  32. 'div',
  33. {
  34. class: 'c2',
  35. style: { fontWeight: 'bold' }
  36. },
  37. props.foo // 这个为什么是undefinded呢 因为setFullProps执行的时候,判断到的赋值Props方式为attrs,所以instance.props为空
  38. )
  39. }
  40. }
  41. const root = document.createElement('div')
  42. document.body.appendChild(root)
  43. render(h(Hello), root) // 这个render 是'@vue/runtime-dom' 我们之前用的 是'@vue/runtime-test' 里面的 测试用的... 但是区别不一样的就是 会不会初始化而已
  44. const node = root.children[0] as HTMLElement
  45. expect(node.getAttribute('id')).toBe('test')
  46. expect(node.getAttribute('foo')).toBe('1')
  47. expect(node.getAttribute('class')).toBe('c2 c0')
  48. expect(node.style.color).toBe('green')
  49. expect(node.style.fontWeight).toBe('bold')
  50. expect(node.dataset.id).toBe('1')
  51. node.dispatchEvent(new CustomEvent('click')) // 事件触发a
  52. node.dispatchEvent(new CustomEvent('click')) // 事件触发a
  53. expect(click).toHaveBeenCalled()
  54. await nextTick()
  55. expect(childUpdated).toHaveBeenCalled()
  56. expect(node.getAttribute('id')).toBe('test')
  57. expect(node.getAttribute('foo')).toBe('2')
  58. expect(node.getAttribute('class')).toBe('c2 c1')
  59. expect(node.style.color).toBe('red')
  60. expect(node.style.fontWeight).toBe('bold')
  61. expect(node.dataset.id).toBe('2')
  62. })

processComponent流程图:

https://www.processon.com/view/link/5f85c9321e085307a0892f7e

Runtime - 图1

vnode:

https://www.processon.com/view/link/5f963f37f346fb06e1ec35b2
Runtime - 图2

instance:

https://www.processon.com/view/link/5f963f5fe401fd06fda22681
Runtime - 图3