vue2 provide 后 inject 数据不是响应式的,不实时更新

今天用 provide 后,inject 获取数据时不是实时更新的,获取的不是更新后的值

祖父组件

html 复制代码
<div style="text-align: left !important;">
  <button @click="change">更改</button>
</div>


  data() {
    return {
      name: 'init'
    }
  },
  provide() {
    return {
      name: this.name
    }
  },
  methods: {
    change() {
      this.name = 'change'
    }
  }

子孙组件

html 复制代码
<template>
  <div class="demo-select">
    name: {{ name }}
  </div>
</template>

export default {
  inject: ['name']
};

点击更改按钮 name 值不变

**原因:**传的初始值是空,不是引用类型,所以不会变成响应式,可以传 函数或是引用类型

改法一:传函数类型

祖父组件

html 复制代码
<div style="text-align: left !important;">
  <button @click="change">更改</button>
</div>


  data() {
    return {
      name: 'init'
    }
  },
  provide() {
    return {
      name: () => this.name
    }
  },
  methods: {
    change() {
      this.name = 'change'
    }
  }

子孙组件

html 复制代码
<template>
  <div class="demo-select">
    name: {{ name() }}
  </div>
</template>

export default {
  inject: ['name']
};

name: () => this.name 变成函数式,每次取值都是调用函数取最新值

改法二:传引用类型

祖父组件

html 复制代码
<div style="text-align: left !important;">
  <button @click="change">更改</button>
</div>


  data() {
    return {
      pro: { name: 'init' }
    }
  },
  provide() {
    return {
      pro: this.pro
    }
  },
  methods: {
    change() {
      this.pro.name = 'change'
    }
  }

子孙组件

html 复制代码
<template>
  <div class="demo-select">
    name: {{ pro && pro.name }}
  </div>
</template>

export default {
  inject: ['pro']
};

引用类型会变为响应式。

相关推荐
AOwhisky9 分钟前
Linux逻辑卷管理:从“固定隔间”到“弹性存储池”的智慧
linux·运维·服务器
翼龙云_cloud24 分钟前
阿里云渠道商:如何使用弹性伸缩来实现计算资源的弹性配置?
服务器·阿里云·云计算
风度前端37 分钟前
用了都说好的 uniapp 路由框架
前端
冴羽39 分钟前
2026 年 Web 前端开发的 8 个趋势!
前端·javascript·vue.js
码银1 小时前
ruoyi的前端(vue)新增的时候给字典设置默认值 但不能正常
前端
SuperherRo1 小时前
JAVA攻防-Shiro专题&断点调试&有key利用链&URL&CC&CB&原生反序列化&加密逻辑
java·shiro·反序列化·有key·利用链·原生反序列化·加密逻辑
05大叔1 小时前
大事件Day02
运维·服务器
桦说编程1 小时前
简单方法实现子任务耗时统计
java·后端·监控
爱笑的眼睛111 小时前
超越可视化:降维算法组件的深度解析与工程实践
java·人工智能·python·ai
五仁火烧1 小时前
Vue3 项目的默认端口行为
服务器·vue.js·nginx·容器·vue