今天做了项目中的登陆功能,按照我之前一贯的套路都是使用vuex这个状态管理插件来处理数据。然后,我就想了想,看下vue有什么其它的方法能够实现父子N多辈的通信。
找了下api让我发现了provide和inject这个东西,哇靠,相见恨晚啊。哈哈。

Provide/Inject是什么?

provide 和 inject 主要为高阶插件/组件库提供用例。并不推荐直接用于应用程序代码中。
这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。如果你熟悉 React,这与 React 的上下文特性很相似。

这是它的官方解释,嗯,不管了,先搞了再说。
先来试一下这个api怎么用。
在src/componemts下创建两个文件夹,其中Test.vue是HelloWorld.vue的子组件。
在这里插入图片描述
按照api的说法,可以在父组件,通过provide选项注入数据。
HelloWorld.vue
在这里插入图片描述
在Test.vue,通过选项inject来对数据进行接受。
在这里插入图片描述
在这里可以看到,是可以实现父子之间的通信的,可能有人说,我用props一样可以实现父子之间的通信啊,但其实provide/inject,并不仅仅只是父子的,就算是孙子辈,N辈都可以。那么,这个时候,我们来个大胆的想法,app.vue是所有组件的父组件,按照以上逻辑,我在app.vue定义的东西是不是都可以实现往下传递呢?

接下来,以一下用户登陆的场景
在这里插入图片描述
这样,任何页面或组件,只要通过 inject 注入 app 后,就可以直接访问 userInfo 的数据了,比如:
在这里插入图片描述
是不是很简单呢。除了直接使用数据,还可以调用方法。比如在某个页面里,修改了个人资料,这时一开始在 app.vue 里获取的 userInfo 已经不是最新的了,需要重新获取。可以这样使用:
某个页面
在这里插入图片描述
如果你的项目足够复杂,或需要多人协同开发时,在 app.vue 里会写非常多的代码,多到结构复杂难以维护。这时可以使用 Vue.js 的混合 mixins,将不同的逻辑分开到不同的 js 文件里。比如上面的用户信息,就可以放到混合里:

user.js

export default {
  data () {
    return {
      userInfo: null
    }
  },
  methods: {
    getUserInfo () {
      // 这里通过 ajax 获取用户信息后,赋值给 this.userInfo,以下为伪代码
      $.ajax('/user/info', (data) => {
        this.userInfo = data;
      });
    }
  },
  mounted () {
    this.getUserInfo();
  }
}

然后再app.vue中混合

<script>
  import mixins_user from '../mixins/user.js';

  export default {
    mixins: [mixins_user],
    data () {
      return {

      }
    }
  }
</script>
Logo

前往低代码交流专区

更多推荐