// 下面就描述了上面的domlet obj = { tag: 'div', data: { id: 'container' }, children: [{ tag: 'p', data_请用vnode描述一个dom结构">
当前位置:   article > 正文

vue核心面试题:用vnode来描述一个dom结构_请用vnode描述一个dom结构

请用vnode描述一个dom结构

vnode虚拟节点就是用一个对象来描述真实的 dom 元素,在Vue.js 中虚拟 DOM 的 JavaScript 对象就是 VNode

例子:用js对象描述一个dom

  1. <div id="container"><p></p></div>
  2. // 下面就描述了上面的dom
  3. let obj = {
  4. tag: 'div',
  5. data: {
  6. id: 'container'
  7. },
  8. children: [{
  9. tag: 'p',
  10. data: {},
  11. children: []
  12. }]
  13. }
  14. render () {
  15. return _c('div', {id: 'container'}, _c('p', {}))
  16. }

vue中这样实现(先将dom转换成ast语法树再生成vnode) 

  1. function _c(tag, data, ...children){
  2.    let key = data.key;
  3.    delete data.key;
  4.    children = children.map(child=>{
  5.        if(typeof child === 'object'){
  6.            return child
  7.       }else{
  8.            return vnode(undefined,undefined,undefined,undefined,child)
  9.       }
  10.   })
  11.    return vnode(tag,data,key,children);
  12. }
  13. function vnode(tag,data,key,children,text,elm){
  14.    return {
  15.        tag, // 表示的是当前的标签名
  16.        data, // 表示的是当前标签上的属性
  17.        key, // 唯一表示用户可能传递,在diff过程中可以提高diff的效率
  18.        children, // 属性是vnode的子节点
  19.        text, // 属性是文本属性
  20. elm // 真实的dom节点
  21.   }
  22. }
  23. let a = _c('div', {id: 'container'}, _c('p', {}, 'hello'), 'word')
  24. console.log(a)
  25. // 输出来的信息
  26. {
  27. tag: 'div',
  28. data: { id: 'container' },
  29. key: undefined,
  30. children: [
  31. {
  32. tag: 'p',
  33. data: {},
  34. key: undefined,
  35. children: [
  36. {
  37. tag: undefined,
  38. data: undefined,
  39. key: undefined,
  40. children: undefined,
  41. text: 'hello',
  42. elm: undefined
  43. }
  44. ],
  45. text: undefined,
  46. elm: undefined
  47. },
  48. {
  49. tag: undefined,
  50. data: undefined,
  51. key: undefined,
  52. children: undefined,
  53. text: 'word',
  54. elm: undefined
  55. }
  56. ],
  57. text: undefined,
  58. elm: undefined
  59. }

函数的第一次tag就是元素标签,data就是属性,children就是子节点,里面会先对子节点进行判断,看是否是一个对象,如果是对象就直接将该对象赋值给children,如果不是对象(当它不是对象时这时就是一个文本)然后调用一个vnode方法,通过这个方法把让他转成一个对象。最后调用vnode将传入参数输出一个对象,这个对象就能描述这个dom结构。这儿使用递归方法实现。

vue中vnode虚拟dom生成流程

template->ast语法树->通过codegen转化成render函数->内部调用的就是_c方法->vnode

补充说明:

template编译出来的是render函数,render函数中会给你一个createElement,createElement执行之后才是vnode。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/164531
推荐阅读
相关标签
  

闽ICP备14008679号