provide/inject

桃扇骨 2022-12-12 13:49 243阅读 0赞

概述

provide/inject:简单的来说就是在父组件中通过provide来提供变量,然后在子组件中通过inject来注入变量。

需要注意的是这里不论子组件有多深,只要调用了inject那么就可以注入provide中的数据。而不是局限于只能从当前父组件的prop属性来获取数据。

写法

provide:选项应该是一个对象或返回一个对象的函数。该对象包含可注入其子孙的属性

  1. // 传入对象写法
  2. provide: {
  3. foo: 'bar'
  4. }
  5. // 函数写法
  6. provide () {
  7. return {
  8. foo: 'bar'
  9. }
  10. }

inject :一个字符串数组,或 一个对象,对象的 key 是本地的绑定名

  1. // 父级组件提供 'foo'
  2. var Provider = {
  3. provide: {
  4. foo: 'bar'
  5. },
  6. // ...
  7. }
  8. // 子组件注入 'foo'
  9. var Child = {
  10. inject: ['foo'],
  11. created () {
  12. console.log(this.foo) // => "bar"
  13. }
  14. // ...
  15. }

实现 provide / inject 可监听

提示:provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的。

  1. // App.vue 组件 (父组件)
  2. export default {
  3. name: 'electron-xdf',
  4. data () {
  5. return {
  6. asideW: '200px',
  7. _path: null
  8. };
  9. },
  10. created () {
  11. this._path = this.$route.path;
  12. },
  13. provide() {
  14. return {
  15. INFO: this // 传递可响应对象
  16. };
  17. },
  18. methods:{
  19. upprovide(){
  20. this.asideW = '500px'; // 修改 属性值得变化,可以传递到 子孙后代的任意组件 同时响应变化
  21. }
  22. }
  23. }
  24. // 子组件
  25. export default {
  26. props: {},
  27. computed: {},
  28. name: 'process-communication',
  29. data () {
  30. return {
  31. count: 0
  32. };
  33. },
  34. inject: ['INFO'],
  35. methods: {
  36. upprovide(){
  37. // 这里修改之后 App.vue 也会响应数据的变化
  38. this.INFO.asideW = '200px';
  39. }
  40. }
  41. };

#

刷新vue组件

这样实现了子组件调取reload方法就实现了刷新vue组件的功能,个人认为它实现了组件跨越组件传递数据方法。

  1. // App.vue 组件 (父组件)
  2. <template>
  3. <div
  4. id="app"
  5. >
  6. <router-view
  7. v-if="isRouterAlive"
  8. />
  9. </div>
  10. </template>
  11. <script>
  12. export default {
  13. name: 'App',
  14. components: {
  15. MergeTipDialog,
  16. BreakNetTip
  17. },
  18. data () {
  19. return {
  20. isShow: false,
  21. isRouterAlive: true
  22. },
  23. // 父组件中返回要传给下级的数据
  24. provide () {
  25. return {
  26. reload: this.reload
  27. }
  28. },
  29. methods: {
  30. reload () {
  31. this.isRouterAlive = false
  32. this.$nextTick(() => {
  33. this.isRouterAlive = true
  34. })
  35. }
  36. }
  37. }
  38. </script>
  39. // 子组件
  40. <template>
  41. <popup-assign
  42. :id="id"
  43. @success="successHandle"
  44. >
  45. <div class="confirm-d-tit"><span class="gray-small-btn">{
  46. { name }}</span></div>
  47. <strong>将被分配给</strong>
  48. <a
  49. slot="reference"
  50. class="unite-btn"
  51. >
  52. 指派
  53. </a>
  54. </popup-assign>
  55. </template>
  56. <script>
  57. import PopupAssign from '../PopupAssign'
  58. export default {
  59. //引用vue reload方法
  60. inject: ['reload'],
  61. components: {
  62. PopupAssign
  63. },
  64. methods: {
  65. // ...mapActions(['freshList']),
  66. async successHandle () {
  67. this.reload()
  68. }
  69. }
  70. }
  71. </script>

参考:
https://www.jb51.net/article/139769.htm
https://blog.csdn.net/qq_15253407/article/details/91490210
https://www.jianshu.com/p/d34a7df4cd6a

发表评论

表情:
评论列表 (有 0 条评论,243人围观)

还没有评论,来说两句吧...

相关阅读