vue组件开发中一些小技巧备忘以及组件封装多思考

130 阅读2分钟
  • 1vue options.data() 可以获取到初始化data。用于做reset使用
  • 2 整个props传递可以使用 v-bind="props"批量传递
  • 3 visible.sync 相当于 :value="", value:update=""适合场景,包装一个本身支持sync的组件并继续对外透传sync
  • 4 批量更新子组件, 用findchildren找到所有子组件,然后调用reset,参考el form实现方式

组件封装思考

如图封装一个弹窗组件,我们考虑的组件拆分结构如下

mydialog.vue

<dialog>
    <tab>
        <tabcontent1>
    </tab>
    <tab>
        <tabcontent2>
    </tab>
</dialog>

要求 关闭弹窗(visible=false)的时候 ,清空搜索框,和列表分页 (也就是重置状态)

问题是 关闭弹窗方法是dialog控制的, 但是分页(page)和搜索框(searchkey)和列表和请求列表api在 tabcontent1内部,

企业微信截图_16499862472646.png

最初始的做法,tabcontent1 在 create时候 初始化数据(api), page,searchkey作为 自己的state,最外层使用mydialog的时候 同时增加v-if=“visible”,可使得 弹窗关闭后,dom和数据都被销毁,

用v-if强行销毁dom对性能不友好,进阶一下,可以改为tabcontent1 的 props增加一个visible,对其进行watch,在visible=false的时候 自己清空state,但是初始化initadata就不能放在create方法中了,因为组件在visible=false的时候 不会销毁,所以create只会调用一次,所以initadata也需要放在watch中,在visible=true的时候initdata

还一种思路是react项目里会出现较多的,是把所有逻辑放在整体多一个store里,也就是searchkey,initdata,page,都放在mydialog中,通过props传入tabcontent1,这样所有的子组件都成了 受控组件(没有自己的state),缺点是 父组件逻辑太多,很多state都不是自己需要的state

目前认为比较好的一种方式是类似于el-form和el-form-item的思路,感觉有些类似面向对象,searchkey,page依然在子组件tabcontent1内部,父组件在watch visible里来 决定调用子组件多init方法,和在合适时机调用子组件的reset,但是init和reset的逻辑是封装在子组件内部的,