唯品秀前端博客
当前位置: 前端开发 > Vue.js专区 > Vue.js中provide/inject实现响应式数据更新

Vue.js中provide/inject实现响应式数据更新

2019-07-04 分类:Vue.js专区 作者:管理员 阅读(1708)

网上关于provide 和 inject响应文章答案并不多,基本上都避而不谈,都是用官方一句话一笔带过:provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的。下面根据自己结合他人的思路实现响应式,可能不是最佳实践,但能达到目的,毕竟官方也没说具体怎么弄。

示例(最终没有更新)

首先假设我们在祖辈时候传入进来是个动态的数据,官方不是说如果你传入了一个可监听的对象,那么其对象还是可响应的么?

parent父页面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
export default {
  provide(){
    return   {foo:this.fonnB}
  },
  data(){
    return {fonnB:'old word'}  
  }
    created() {
    setTimeout(()=>{
      this.fonnB="new words";    // 这里更新新,仅仅foonB变化了,foo没有变化
      this._provided.foo="new words";
      //这里更新foo变化了,但子组件获得的foo 依旧是old words
      console.log( this._provided)
    },1000)
  },
}

child子页面:

1
2
3
4
5
6
export default {
  inject:['foo'],
  data(){
    return {chilrfoo:this.foo}  
  }    
}

结果

结果通过通过上面方式,经过验证,子组件页面都没办法实现响应更新this.foo的值。可能我们对官方理解还是有误,下面通过网上资料和自己构思实现了响应式数据更新

示例(结果可行)

很明显上面再父组件定时器内我们是改变了数据源,这个时候我们就在想,我们改变的数据到底有没有传入到子孙组件中,那么要验证这个问题,我们不妨可以在子孙组件中手动写set 函数,computed 本身就只相当于一个get函数,当然,你也可以试试watch

parent父页面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
export default {

provide(){
     return   {foo:this.fonnB}
    },
    data(){
      return {
      fonnB:{a:'old word'}
      }  
    }
     created() {
      setTimeout(()=>{
        this.fonnB.a="new words";    

        //这种更新 foo变化了,但子组件获得的foo  依旧是old words

      },1000)

    },

  }

child子页面:

1
2
3
4
5
6
7
8
9
10
11
12
13
export default {
    inject:['foo'],
    data(){
      return {
       childfooOld:this.foo.a
      }  
    },
    computed:{
        chilrfoo(){
            return  this.foo.a
        }
    }    
  }

最终通过computed就实现了上下传值,我们都知道data中有get/set,数据也是响应式的,但为什么没更新,有点疑惑,如果有大佬知道能解释清楚的可以探讨。

「两年博客,如果觉得我的文章对您有用,请帮助本站成长」

赞(5) 打赏

谢谢你请我吃鸡腿*^_^*

支付宝
微信
5

谢谢你请我吃鸡腿*^_^*

支付宝
微信
标签:

上一篇:

下一篇:

你可能感兴趣

共有 0 条评论 - Vue.js中provide/inject实现响应式数据更新

博客简介

唯品秀博客: weipxiu.com,一个关注Web前端开发技术、关注用户体验、坚持更多原创实战教程的个人网站,愿景:成为宇宙中最具有代表性的前端博客,期待您的参与,主题源码 

精彩评论

友情链接

他们同样是一群网虫,却不是每天泡在网上游走在淘宝和网游之间、刷着本来就快要透支的信用卡。他们或许没有踏出国门一步,但同学却不局限在一国一校,而是遍及全球!申请交换友链

站点统计

  • 文章总数: 243 篇
  • 草稿数目: 0 篇
  • 分类数目: 15 个
  • 独立页面: 6 个
  • 评论总数: 906 条
  • 链接总数: 14 个
  • 标签总数: 433 个
  • 建站时间: 1067 天
  • 注册用户: 3711 人
  • 访问总量: 8696465 次
  • 最近更新: 2019年11月14日
服务热线:
 173xxxx7240

 QQ在线交流

 旺旺在线