computed源码解析

<body>
    <div id="app">
        <p ref="msg">{
  {name}}</p>
        <button @click="change">点我</button>
    </div>
</body>
</html>
<script src="./vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data(){
            return {
                count: 0,
                firstName: 'yang',
                lastName: 'rui'
            }
        },
        computed: {
            name(){
                if(this.count > 0){
                    return this.firstName + this.lastName
                }
                return 'please click me'
            }
        },
        methods: {
            change(){
                this.count ++
            },
            changeLastName(){
                this.lastName= 'ai'
            }
        }
    })
</script>

computed初始化以及更新步骤

  1. 初始化 initComputed 为计算属性注册watcher,以及设置getter
  2. render时候取值,触发getter,执行evaluate 方法取值,取值过程中为计算属性依赖的属性添加依赖,也就是为count添加依赖,这里的依赖是computedWatcher,接着执行depend方法为count添加依赖,这里添加的是渲染watcher
  3. 执行change方法,更新count的值时,会触发它的setter,通知watcher的update方法,如果是computedWatcher就执行this.dirty=true;如果是渲染watcher就执行queueWatcher,更新视图
  4. 更新视图过程中,执行到render,又会取name的值,这时候如果dirty为true,就重新计算属性值,如果为false就会从缓存中拿到值,为true的情况是计算属性依赖的属性值发生了变化,否则为false
  5. 所以得出一个结论:只有计算属性依赖的值发生了变化,才会重新计算,否则直接在缓存中拿值,不会重新计算
  var computedWatcherOptions = { lazy: true };
  function initComputed (vm, computed) {
    var watchers = vm._computedWatchers = Object.create(null);
    var isSSR = isServerRendering();
    for (var key in computed) {
    // 每个属性对应的方法
      var userDef = computed[key];
      var getter = typeof userDef === 'function' ? userDef : userDef.get;
      if (getter == null) {
        warn(
          ("Getter is missing for computed property \"" + key + "\"."),
          vm
        )
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值