vue.js - 是否可以观看注入(inject)的属性(property)

标签 vue.js vuejs3

我正在构建一个使用 Vue 3 的应用程序,我在父组件中提供了一个属性,随后我将其注入(inject)多个子组件。有什么方法可以让注入(inject)此属性的组件观察它的变化吗?

父组件看起来像这样:

<template>
  <child-component/>
  <other-child-component @client-update="update_client" />
</template>

<script>
export default {
  name: 'App',
  data() {
    return {
      client: {}
    }
  },
  methods: {
    update_client(client) {
      this.client = client
    }
  },
  provide() {
    return {
      client: this.client
    }
  },
}
</script>

子组件看起来像:

<script>
export default {
  name: 'ChildComponent',
  inject: ['client'],
  watch: {
    client(new_client, old_client) {
      console.log('new client: ', new_client);
    }
  }
}
</script>

我正在努力做到这一点,当提供的变量在父级中更新时,它被注入(inject)的子组件应该得到通知。出于某种原因,客户端更新时不会调用客户端监视方法。

有没有更好的方法来完成这个?

更新

经过进一步测试,我发现这里有一个更大的问题,即使在父组件中更新了客户端之后,子组件中的客户端属性仍然是原始的空对象并且没有得到更新。由于提供的属性是 react 性的,因此它被注入(inject)的所有地方都应该自动更新。

最佳答案

更新

当使用对象 API 响应式定义 (data(){return{client:{}}) 时,即使变量在组件中是响应式的,inject ed 值将是静态的。这是因为 provide 会将其设置为初始设置的值。要使 react 起作用,您需要将其包装在 computed

provide(){
  return {client: computed(()=>this.client)}
}

文档: https://vuejs.org/guide/components/provide-inject.html#working-with-reactivity


您可能还需要为您的 watch 使用deep

示例:

<script>
  export default {
    name: 'ChildComponent',
    inject: ['client'],
    watch: {
      client: {
        handler: (new_client, old_client) => {
          console.log('new client: ', new_client);
        },
        deep: true
      }
    }
  }
</script>

关于vue.js - 是否可以观看注入(inject)的属性(property),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64449182/

相关文章:

javascript - Vuejs 2使用事件从事件总线接收到的数据将数据分配给变量

vue.js - Pinia 数组更改时如何更新多个 Vue 3 组件

html - VueJS - 清理输出以防止跨站点脚本攻击

vuejs3 - 如何通过 router-view 组件外部的 useRoute 获取当前路由

vue.js - 如何在 Vue 3 Composition API 中使用计算方法更正 set v-model?

javascript - Vue.js 在计算值更新时添加类

vue.js - 使用 Axios - VUEJS 存储为 Blob 的 POST 图像

javascript - 如何使用 Vue Cli 3 添加对 PDF 文件的支持?

vue.js - 如何在 Nuxt.js 中获得 Stack Overflow SEO 友好的 URL 结构?

javascript - 为什么 router.push 不起作用? [Vue 3] [Vuex 4]