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']
};

引用类型会变为响应式。

相关推荐
董员外17 小时前
LangChain.js 快速上手指南:Tool的使用,给大模型安上了双手
前端·javascript·后端
用泥种荷花18 小时前
【LangChain.js学习】 RAG(检索增强生成)完整实现解析
前端
兔子零102418 小时前
Star-Office-UI-Node 实战:从 0 到 1 接入 OpenClaw 的多 Agent 看板
前端·ai编程
helloweilei18 小时前
一文搞懂Nextjs中的Proxy
前端·next.js
wuhen_n18 小时前
Pinia状态管理原理:从响应式核心到源码实现
前端·javascript·vue.js
陆枫Larry19 小时前
小程序 scroll-view 设置 padding 右侧不生效?用一层包裹解决
前端
晴殇i19 小时前
CommonJS 与 ES6 模块引入的区别详解
前端·javascript·面试
小兔崽子去哪了19 小时前
Java 自动化部署
java·后端
Selicens19 小时前
git批量删除本地多余分支
前端·git·后端
wuhen_n19 小时前
KeepAlive:组件缓存实现深度解析
前端·javascript·vue.js