精读《Vuejs设计与实现》(8)第三章上

155 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

前文我们已经读完了前2章,第三章的名字叫Vue.Js 3的设计思路,但我觉得这其实是大概讲一下vue3的渲染、编译、模板语法与之前有什么不同,引出后续几个大章节。

Vue.Js 3的设计思路

3.1声明式的描述UI

其实在vue里的声明式描述UI,就是模板语法。vue3的模板语法变化不大,我这里就给大家复习一下。

  • 使用html语法。例如<div></div>
  • 可以使用原生的属性.<div class='one'></div>
  • 使用:v-bind表示动态绑定的属性 <div :class="a"></div>
  • 使用@v-on表示绑定事件<button @click='handleClick'></button>
  • 使用内部指令或自定义指令完成特定功能<div v-show="a"></div>

这里其实很好掌握,但是我们还需要掌握用对象来表示UI

const a = 'hello'
const dom = {
    tag:'div'
    props:{
      className:a
    },
    children:[
        {tag:'p'}
    ]
}

上述翻译为模板就是

<div :class="a"><p></p></div>

既然有了模板语法,为什么又要有对象语法呢?

其实很多时候,对象语法会比模板语法更灵活。原书举了一个简单的例子 我们现在需要h1~h6,如果用模板语法

<div>
    <h1></h1>
    <h2></h1>
    <h3></h1>
    <h4></h1>
    <h5></h1>
    <h6></h1>
</div>

用对象语法呢

const list = new Array(6).fill('')
const dom = {
    tag:'div',
    children:list.map((e,i)=>({tag:`h${i+1}`}))
}

哪个简单显而易见,那个可读性更好也显而易见。

当然这里的对象格式并不与vue相同,在vue中我们有具体的格式,同时还有一个辅助函数h,具体可以参考这里

这里不由得想说,其实JSX也是很不错的一个解决方法,同时兼具了可读性和功能性,不过它需要编译.在JSX中上述需求是这样写的

const dom = (<div>
    new Array(6).fill('').map((e,i)=>(<h{i+1}></h>))
</div>)

其实在我们使用的时候也应该按需要去使用,在vue中也提供了函数式组件。