美文网首页
Vue | 两对cp

Vue | 两对cp

作者: cemcoe | 来源:发表于2020-03-11 21:00 被阅读0次

    今天来看两对 cp,之所以把他们当 cp,是因为每次写其中之一时,总是要拿另一个做比较,这种关系在前端很常见。

    基本上是看起来好像实现的功能点是一样的,但实际上每个都有其特殊的应用场景。彼此互为补充,缺了谁,都有点不大对劲。

    今天来介绍的两对是:

    • methods && computed
    • v-if && v-show

    先来看第一对,methods && computed 是创建 Vue 实例时可以选择的字段,和 el, data 是同一类的。

    两者的关系有一种既生瑜何生亮的感觉。

    在比较之前先看一个 computed 的个人问题。

    为何计算属性写的时候是函数,用的时候当成属性【不加小括号】来操作?

    假设接下来用到的 data 为:

    data: {
        firstName: 'cem',
        lastName: 'coe'
    }
    

    现在要在页面中展示完整的名字,可以使用的方式:

    • 双大括号语法 {{firstName + lastName}} 语法过于繁琐
    • methods
    • computed

    使用计算属性:

    computed: {
        fullName() {
            return this.firstName + this.lastName
        }
    }
    

    在 html 中使用时可能是这样的:

    <h1>{{fullName}}</h1>
    

    为什么不加小括号呢?它不是函数吗?

    这里其实是计算属性的简写,完整的写法:

    computed: {
        fullName: {
            set: function() {
            },
            get: function() {
                return this.firstName + this.lastName
            }
        }
    }
    

    计算属性本质上就是一个属性,并非函数,只是开发时一般不实现 set 方法。只是简写以后给人一种函数的感觉。

    这也就解释了为何计算属性写的时候是函数,用的时候当成属性来操作。

    那么接下进入正题,来看一下这对 cp 的异同。


    这里做一个对比实验,methods && computed 在页面中均搞 3 次。

    <div id="app">
        {{fullName}}
        {{fullName}}
        {{fullName}}
        ---
        {{getFullName()}}
        {{getFullName()}}
        {{getFullName()}}
    </div>
    

    为了看到结果在它们身上埋点 console

    methods: {
        getFullName() {
            console.log("methods")
            return this.firstName + this.lastName
        }
    },
    computed: {
        fullName() {
            console.log("computed")
            return this.firstName + this.lastName
        }
    }
    
    methods && computed

    从结果来看,同样请求三次数据的情况下, methods 执行3次,而 computed 仅仅执行1次。

    在 firstName 和 lastName 不改改变时,computed 会使用缓存的结果,效率更高,更加节省资源。

    其实两者之中还有一个第三者,唤为 watch,他们之间错综复杂的关系找时间再写。


    来看第二对 v-if && v-show,,两者用于条件渲染。

    通过一个对比实验来看一看 v-if && v-show 的区别,为了看清结果,给他们埋下 id:

    <h1 v-if="isShow" id="if">cemcoe</h1>
    <h1 v-show="isShow" id="show">cemcoe</h1>
    
    v-if && v-show

    当 isShow 的值被改成 false 时,两个都消失。但他们不一样,通过观察埋下的 id 可以发现:v-if 直接从 DOM 中删掉,v-show 增加了行内样式 display:none,仅仅是视觉不可见。

    v-show 更像是一件隐身斗篷。元素仍然存在,只是不可见。

    在 CSS 中有类似的问题:display:none 和 visibility:hidden 的异同。又给自己挖了一个坑,有空填。

    开发中 v-if 使用较多,向服务器请求数据仅仅加载有权限的内容,如果没有权限就不能将数据添加到 DOM 中。

    这里是连载 化学小子的前端实验册 的第 18 篇,欢迎关注。

    pixiv|えすない|78926374

    图源

    相关文章

      网友评论

          本文标题:Vue | 两对cp

          本文链接:https://www.haomeiwen.com/subject/rhjcjhtx.html